SSL証明書の取得 by Let's Encrypt with nginx

nginxを利用してLet's EncryptによりSSL証明書を取得するまで+αの個人的メモです。

環境

関連プログラムのインストール

$ sudo apt update
$ sudo apt install certbot nginx

なお、これによりnginxはデフォルト状態で自動的に起動した。

指定ドメインについてのSSL証明書の取得

$ sudo certbot certonly --webroot -w /var/www/html/ -d ${FQDN}

/var/www/html/はnginxのWebルートに対応するディレクトリのパス。 ${FQDN}SSL証明書を取得したいドメイン。 なお、前提として、外部からのhttp://${FQDN}/*への要求についてnginxが/var/www/html/*を応答できるようにネットワーク(ファイアウォール及びDNSを含む)が設定されていなければならない。 これにより以下のファイルが作成される。

パス 説明
/etc/letsencrypt/live/${FQDN}/fullchain.pem SSL証明書
/etc/letsencrypt/live/${FQDN}/privkey.pem SSL証明書秘密鍵

これにより得られたSSL証明書は、以下のアドレス

  • https://${FQDN}/*

へのアクセスについてセキュリティ警告を発生させないが、例えば以下のアドレス

  • https://www.${FQDN}/*

へのアクセスについてセキュリティ警告を発生させる。

SSL証明書サブドメインをカバーさせる

$ sudo certbot certonly --expand --webroot -w /var/www/html/ -d ${FQDN} -d ${FQDN_SUB}

${FQDN_SUB}SSL証明書を取得したいサブドメイン。 なお、前提として、外部からのhttp://${FQDN}/*及びhttp://${FQDN_SUB}/*への要求についてnginxが/var/www/html/*を応答できるようにネットワークが設定されていなければならない。 これにより、取得したSSL証明書サブドメインをカバーするようになる。

例えば${FQDN_SUB}=www.${FQDN}とおくと、これにより得られた証明書は、以下のアドレス

  • https://${FQDN}/*
  • https://www.${FQDN}/*

へのアクセスについてセキュリティ警告を発生させない。

root以外のユーザからのSSL証明書等へのアクセスの確保

$ sudo chown root:${group} /etc/letsencrypt/{live,archive}/
$ sudo chmod g+rx /etc/letsencrypt/{live,archive}/

${group}は、SSL証明書等を利用したいプログラムの実行ユーザが属するグループ。 /etc/letsencrypt/live/${FQDN}/{fullchain,privkey}.pemは、/etc/letsencrypt/archive/${FQDN}/内のファイルへのシンボリックリンクとなっている。 デフォルトだと、/etc/letsencrypt/{live,archive}/の所有はroot:rootであり、パーミッションは700であるため、root以外のユーザを実行ユーザとするプログラムはSSL証明書等にアクセスできない。

取得したSSL証明書の確認

$ sudo certbot certificates

取得したSSL証明書の更新

$ sudo certbot renew

これにより、取得したSSL証明書の全てが更新されるようである(未確認)が、有効期限の満了が30日以上先のSSL証明書は、以下のようなメッセージが表示されて更新されない模様。

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/${FQDN}/fullchain.pem expires on yyyy-mm-dd (skipped)
No renewals were attempted.