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のReleasesからLEGOの実行ファイルをダウンロードする。

https://github.com/go-acme/lego

ダウンロードしたのはlinux_amd64。解凍して適当なパスに配置する(今回は /usr/local/bin/に配置)。

証明書の取得

コマンドラインでlegoを実行して証明書を取得する。この際ドメインの所有者確認が行われる。これには二つの方法がありコマンドが異なる。

なお以降のサンプルではパラメータを以下としている。

  • ドメイン名:example.com
  • 管理者アドレス:mail@example.com
  • 出力パス:/opt/lego/

DNSにtxtレコードを登録する場合

DNSに設定したtxtレコードで所有者確認を行う。Webサーバに手を入れずに可能だが、DNSに設定できる必要がある。なお証明書の更新時にはまた別のtxtレコードを登録する必要がある。

sudo lego --dns manual --domains example.com --email mail@example.com --path /opt/lego/ run

コマンドを実行するとtxtレコードのキーと値が表示されるので、コンソールはそのままにしてDNSサーバにtxtレコードを登録する。

登録後コマンドラインを続行するとLet's EncryptからDNSへレコードへ確認が行われる。

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://ドメイン名/.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日で期限が切れるため、自動更新のスクリプトを仕込む。cronに以下のスケジュールを登録する。

以下は「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を再起動している。

コメント