今回は、ACMEクライアントの一つであるlegoを使って、SSL証明書の発行及び自動化を行います。
おもちゃのLEGOではないですよ...
legoとは
何度か紹介しているcertbotとおなじACMEクライアントの1つですが、Python環境が必要なcertbotと異なり、
既にコンパイルされた単一のバイナリの為、依存関係を気にせずインストールが可能です。
また、DNS認証用のプラグインが豊富であり、DNS認証用のAPI、DnsAlias(CNAMEによる委任先レコードを参照したDNS認証)が利用可能な点も大きな特徴です。
SSL証明書発行及び自動化手順
相も変わらず、さくらのクラウドのalma9サーバにて発行します。
legoのインストール
任意のディレクトリに移動し、GitHubからバイナリをダウンロードします。
今回は執筆時点の最新版であるv5.3.1を使用します。バージョンは適宜、最新版に読み替えてください。
# cd /usr/local/src/
# curl -LO https://github.com/go-acme/lego/releases/download/v5.3.1/lego_v5.3.1_linux_amd64.tar.gz
取得したファイルを解凍し、
# tar -xvzf lego_v5.3.1_linux_amd64.tar.gz
CHANGELOG.md
LICENSE
lego
解凍するとコンパイル済みのlegoバイナリが含まれています。
PATHの通っている/usr/local/bin/へ配置し、実行権限を付与します。
# mv lego /usr/local/bin/
# chmod +x /usr/local/bin/lego
バージョンが表示されればインストール完了です。
# lego --version
lego version 5.3.1 linux/amd64
SSL証明書の発行
今回はオーソドックスなHTTP-01(Web認証)で証明書を発行します。
# mkdir /opt/lego
# lego run --path /opt/lego/ --email tnagai@netassist.ne.jp --http --http.webroot /var/www/vhost/tnagai-wp.click/public_html --domains tnagai-wp.click --domains www.tnagai-wp.click --accept-tos
証明書類はカレントの.lego/に出力されてしまう為、明示的に出力先を指定しておきましょう。
| --path | 出力先パスの指定 |
| ACMEアカウントに登録するメールアドレス | |
| --http | HTTP-01認証指定 |
| --http.webroot | HTTP認証を行うパス指定 通常ルートディレクトリを指定します |
| --domains | 発行するFQDNを指定します。複数存在する場合は、複数指定します。 |
| --accept-tos | 利用規約に同意します |
発行に成功すると、--path で指定したディレクトリに証明書と秘密鍵が出力されています。
# ll /opt/lego/certificates/
total 20
-rw------- 1 root root 4844 Sep 9 08:01 tnagai-wp.click.crt
-rw------- 1 root root 3526 Sep 9 08:01 tnagai-wp.click.issuer.crt
-rw------- 1 root root 338 Sep 9 08:01 tnagai-wp.click.json
-rw------- 1 root root 241 Sep 9 08:01 tnagai-wp.click.key
tnagai-wp.click.crtが証明書、tnagai-wp.click.keyが秘密鍵となりますが、この証明書はサーバ証明書と中間証明書が連結されているfullchainとして作成されています。
Apacheのvhostに証明書を適用します。今回はシンボリックリンクを設定します。
ln -s /opt/lego/certificates/tnagai-wp.click.crt /etc/httpd/conf.d/ssl/tnagaiーwp.click/fullchain.pem
ln -s /opt/lego/certificates/tnagai-wp.click.key /etc/httpd/conf.d/ssl/tnagai-wp.click/privkey.pem
vhost設定例
SSLCertificateFile /etc/httpd/conf.d/ssl/tnagai-wp.click/fullchain.pem
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/tnagai-wp.click/privkey.pem
Apacheを再起動すれば無事に設定できました。
自動更新
lego v5では、証明書の新規発行と更新のどちらもlego runコマンドで行います。
以前のバージョンに存在していたrenewコマンドはv5で廃止され、runが証明書の取得と更新を兼ねるようになりました。
ただし、lego runを実行するたびに必ず証明書が再発行されるわけではありません。
既存の証明書が存在する場合は更新が必要かどうかを判定し、更新時期に達している場合のみ更新されます。
そのため、cronから定期的にlego runを実行することで自動更新できます。
# vi /etc/crontab
17 4 * * * root lego run --path /opt/lego/ --email tnagai@netassist.ne.jp --http --http.webroot /var/www/vhost/tnagai-wp.click/public_html --domains tnagai-wp.click --domains www.tnagai-wp.click --deploy-hook "systemctl reload httpd"--accept-tos
今回は毎日4時17分に実行する設定としています。証明書が更新された場合、Apache側にも新しい証明書を読み込ませる必要があります。
そこで--deploy-hookを使用し、証明書の発行または更新が正常に完了した場合に、systemctl reload httpd が実行されるようにしています。
更新が不要だった場合には--deploy-hookは実行されないため、毎日Apacheがreloadされるわけではありません。
これでSSL証明書の自動更新設定は完了です。
おわりに
同じプロトコルではあるため、certbotと大きくコマンド操作面での差はなかったですが、pythonの依存関係を意識する必要がない点は素晴らしいです。
linuxライクのOSは、標準機能をpythonで動かしていることが多く、新しいOSであれば気にする必要がないですが、
古いOSになるとpythonも古く、certbotが動かないなんてこともしばしば...
そういったときにはlegoも一つの選択肢として活用できたらなと思いました。
次回はDNS認証編