LEGOとLet's Encryptで証明書を利用した手順のメモ
無料で提供されている認証局のLet's Encryptから、Webサーバ用のSSL証明書を取得・設定する。Let's EncryptにはCertbotという公式のクライアントがあるが、今回はOSSで公開されているLEGOを使ってみる。
- OS:Ubuntu 20.04
- Webサーバ:nginx 1.18.0
- LEGO:4.5.3
ダウンロード
github (https://github.com/go-acme/lego)のReleasesからLEGOの実行ファイルをダウンロードする。
ダウンロードしたのはlinux_amd64。解凍して適当なパスに配置する(今回は /usr/local/bin/に配置)。
証明書の取得
コマンドラインでlegoを実行して証明書を取得する。この際ドメインの所有者確認が行われるが、これには二つの方法がありコマンドパラメータが異なる。
なお以降のサンプルではパラメータを下記にしているので、適時読み替えて欲しい。
- ドメイン名:example.com
- 管理者アドレス:mail@example.com
- 出力パス:/opt/lego/
方法1)DNSにtxtレコードを登録する場合
DNSにtxtレコードを設定して所有者確認を行う方法。Webサーバ自体を弄れない場合も可能だが、証明書の更新時にはまた別のtxtレコードを登録する必要がある。
sudo lego --dns manual --domains example.com --email mail@example.com --path /opt/lego/ run
コマンドを実行するとtxtレコードのキーと値が表示される。コンソールはそのままにしてDNSサーバにtxtレコードを登録する。その後コマンドラインを続行するとLet's EncryptからDNSへレコードへ確認が行われる。
方法2)Webサイトにファイルを置く場合
Webサイトに置いたファイルで所有者確認を行う方法。既にWebサーバがhttpアクセスできる状態である必要がある。
sudo lego --accept-tos --domains example.com --email mail@example.com --path /opt/lego/ --http --http.webroot /opt/lego/acme-challenge run
コマンドを実行すると、--http.webrootで指定したパスに確認用ファイルが出力される。Let's Encryptからは http://example.com/.well-known/acme-challenge/... でアクセスしてくるのでWebサーバでパスを通しておく。
nginxの設定例
location /.well-known/acme-challenge/ {
root /opt/lego/acme-challenge;
}
証明書ファイル
所有者の確認が成功すると出力パスのcertificatesディレクトリ配下にcrtファイルとkeyファイルが出力される。
Webサーバにそれらの証明書ファイルを設定する。
nginxの設定例
ssl_certificate "/opt/lego/certificates/example.com.crt";
ssl_certificate_key "/opt/lego/certificates/example.com.key";
証明書の自動更新
Let's encryptの証明書は90日で期限が切れる。
所有確認がWebサイトの場合はほぼ同じコマンドを定期実行すればいいだけなので比較的容易にできる。
cronの例
0 0 * * * sudo lego --accept-tos --domains example.com --email mail@example.com --path /opt/lego/ --http --http.webroot /opt/lego/acme-challenge renew --days 30 --renew-hook "systemctl reload nginx.service"
短い間隔での更新は推奨されないため期限が30日未満の場合のみ更新を行う。また証明書ファイルの更新後にnginxを再起動している。
コメント
コメントを投稿