Debian 9 Stretchに移行計画中です。新規インストールしたStretchに現行サイトからデータを移す予定です。
Let’s Encrypt証明書でサイト全体をSSL通信(HTTP/2)にして、SSL Server TESTで【A+】のテスト結果になるまでの設定内容です。以前の記事【Debian 9 StretchでNginx+PHP7.0+MariaDBをインストール】で設定した環境前提です。
このページの目次
Certbotインストール
Debian 9 Stretchは、Letsencrypt用パッケージのCertbotの安定版が利用できます。まずはこれをインストールします。
# apt-get install certbot
ただし、Nginx用プラグインはまだ無いようなのでcertonly –webroot オプションを利用します。その際に認証用ディレクトリを/var/lib/letsencrypt にまとめます。サブドメインを含めた複数サイトの証明書を作成するときに管理しやすくなります。
/etc/nginx/conf.d/default.conf を編集します。default.confファイルはデフォルトファイル名ですが、これは環境によりファイル名が違います。
location ^~ /.well-known/acme-challenge { alias /var/lib/letsencrypt/.well-known/acme-challenge; default_type "text/plain"; try_files $uri =404; }
これをserver { }内に追加します。私は{ }内の一番下(赤字部分)に追加しました。
server {
listen 80 ;
server_name def-4.com www.def-4.com;
location / { root /usr/share/nginx/html;
...............以下略................................
....................................................
location ^~ /.well-known/acme-challenge {
alias /var/lib/letsencrypt/.well-known/acme-challenge;
default_type "text/plain";
try_files $uri =404;
}
}
設定を反映させるためにnginxを再起動します。
# /etc/init.d/nginx restart
証明書発行
certbot certonly –webroot –webroot-path /var/lib/letsencrypt -d [domain]で証明書を発行します。初回はメールアドレスの入力と、ACMEサーバーへの登録に同意するかどうか聞かれます。それも含めて、当サイトdef-4.com で発行する場合の例は以下です。
certbot certonly -m [e-mail-address] --agree-tos --webroot --webroot-path /var/lib/letsencrypt -d def-4.com -d www.def-4.com
発行された証明書の保存場所がこちら。def-4.com部分はこのサイトのドメイン名です。最後の数字部分が更新される毎に増えていきます。
- /etc/letsencrypt/archive/def-4.com/cert1.pem …サーバ証明書(公開鍵)
- /etc/letsencrypt/archive/def-4.com/privkey1.pem …秘密鍵
- /etc/letsencrypt/archive/def-4.com/chain1.pem …中間証明書
- /etc/letsencrypt/archive/def-4.com/fullchain1.pem …サーバ証明書と中間証明書が結合されたファイル
★実際に設定に使用するのは同時に作成されているエイリアスのファイルを指定します。それによって、3ヶ月毎に証明書ファイルが更新されていっても、nginx側の設定変更をする必要がなくなります。
- /etc/letsencrypt/live/def-4.com/cert.pem…サーバ証明書(公開鍵)
- /etc/letsencrypt/live/def-4.com/privkey.pem…秘密鍵
- /etc/letsencrypt/live/def-4.com/chain.pem…中間証明書
- /etc/letsencrypt/live/def-4.com/fullchain.pem …サーバ証明書と中間証明書が結合されたファイル
HTTP/2化と証明書インストール
再度、 /etc/nginx/conf.d/default.conf もしくは同じディレクトリにある該当ファイルを編集して、HTTP/2対応と証明書をインストールします。(赤字部分を追加)
server { listen 80 ; server_name def-4.com www.def-4.com; location / { root /usr/share/nginx/html; ...............以下略................................ .................................................... location ^~ /.well-known/acme-challenge { alias /var/lib/letsencrypt/.well-known/acme-challenge; default_type "text/plain"; try_files $uri =404; } }
↓ ↓ ↓ ↓
server {
listen 80 ;
server_name def-4.com www.def-4.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 ;
server_name def-4.com www.def-4.com;
ssl_certificate /etc/letsencrypt/live/def-4.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/def-4.com/privkey.pem;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
location / { root /usr/share/nginx/html;
...............以下略................................
....................................................
location ^~ /.well-known/acme-challenge {
alias /var/lib/letsencrypt/.well-known/acme-challenge;
default_type "text/plain";
try_files $uri =404;
}
}
4-5行目
サイト全体をSSL化するのでreturn 301 https://$host$request_uri; でhttp://~のアクセスをhttps://~にリダイレクトします。
8行目
ポート443の待ち受けでSSLを有効、さらにHTTP/2を有効にします。
11-12行目
サーバー証明書と秘密鍵のパスを指定しています。サーバ証明書と中間証明書が結合されたファイルfullchain.pem の方を指定しました。
Server SSL TESTでA+を出す設定
Debian Stretchではデフォルト設定でSSL Server TESTで【A-】のテスト結果になりますが、これを【A+】のテスト結果にするのが14-16行目です。
14行目
Forward Secrecy(FS)を有効にします。ssl_prefer_server_ciphers on;
15行目
Session resumption (caching)を有効にします。ssl_session_cache shared:SSL:10m;
16行目
HSTS (HTTP Strict Transport Security)を有効にします。(サイト全体SSL化が必須)add_header Strict-Transport-Security “max-age=31536000; includeSubdomains”;
Nginx再起動
nginx.conf(conf.dディレクトリ含む)のテストnginx -t をしてエラーや警告がなければ、設定を反映させるためにnginxを再起動します。
# nginx -t # /etc/init.d/nginx restart
Cronで証明書の更新自動化
Let’s Encrypt証明書の有効期限は3ヶ月です。更新忘れの心配がないようにCronに、certbot renew を入れて自動更新にします。
renewコマンドは、有効期限が30日以内なら更新、それ以上ならチェックのみでスルーしてくれるので、、週一で深夜にCronに実行させる設定にしました。オプション-q はエラーがあった時だけメッセージを出してくれるので、cronに設定する場合は付けたほうが良いでしょう。
設定ファイルは /etc/crontab です。毎週金曜日のam4時15分に実行する設定例です。nginxをリロードする必要がありました。
# m h dom mon dow user command 15 4 * * 5 root certbot renew -q && service nginx reload
設定完了
以上で、Let’s Encrypt証明書でサイト全体をSSL通信(HTTP/2)にして、SSL Server TESTで【A+】のテスト結果になりました。今回のDebian Stretchでは、Opensslのバージョンが1.1.0のため、SSLプロトコルやCipher Suitesの脆弱性対策設定を省略できました。
いままで、このサイトはあえてXP_IE8でも証明書の警告は出るがなんとか表示できるようにしていたのが、Stretchに移行したら完全に切り捨てとなります。まあ、影響は無いでしょう。なんとか今月中に移行作業を決行したいところです。