Certbot で PlusArchive を HTTPS 化した
はじめに
自作サイト PlusArchive を Certbot で HTTPS 化しました。今回はその手順を簡単に説明していきます。
Certbot とは
Certbot は無料で SSL/TLS サーバ証明書を取得、更新できるサービスです。 証明書作成の手間やお金もかからないので、個人サイトを運用されている方で、ドメイン認証タイプの証明書を取得したい場合におすすめです。
環境
準備
導入する前にサーバで Certbot が使える環境であるか System Requirements で確認しておきます。最低限 Python のバージョン (現時点では 2.6 か 2.7 で動作する) と 80/443 ポートが解放されているかのチェックはしておきましょう。
導入手順
Certbot のサイトに行って Software と System を選択すると、大まかな手順が得られます。それらを頼りに、自分の環境に合ったやり方を少し詳しく説明していきます。
Software と System を選択
Certbot をインストール
サーバにログインして以下のコマンドを実行
(EPEL リポジトリが追加されていてかつ有効にしておく)
sudo yum install certbot
SSL/TLS サーバ証明書の取得テスト
SSL/TLS サーバ証明書を取得する前に、動作が正常であるかのテストができます
( <> 内はそれぞれの環境に置き換えてください)
certbot certonly --test-cert -m <email> --agree-tos -n $* --webroot -w <webroot-path> -d <domain>
SSL/TLS サーバ証明書の取得
現時点で Web サーバが動作していて停止したくない場合は --webroot オプションを付け加えます。自動化もできることからこちらがおすすめ。
certbot certonly -m <email> --agree-tos -n $* --webroot -w <webroot-path> -d <domain>
取得されたものはすべて /etc/letsencrypt 以下に置かれます。
サブドメインも加えたい場合は -d <subdomain>
という感じで足していけば OK です。
対話的にやる場合は --webroot の代わりに --standalone オプションを付け加えます。こちらはドメインの検証を実行するためにポート 80 または 443 と結びつけする必要があるため、既存の Web サーバーを停止する必要があります。
DH 鍵交換に使用するパラメータファイルを作成
mkdir /etc/nginx/ssl cd $_ openssl dhparam 2048 -out dhparam.pem
生成するのにかなり時間がかかります。
Web サーバの設定 (Nginx の場合)
# /etc/nginx/nginx.conf http { ... # HTTP を使用せず HTTPS へ置き換えてアクセスさせる add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;"; # SSL/TLS のセッションキャッシュを使う(サーバの負荷削減のため) ssl_session_cache shared:SSL:30m; ssl_session_timeout 30m; ...
# /etc/nginx/conf.d/example.conf server { listen 80; server_name example.com www.example.com; return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # www.example.com へアクセスがあった場合に example.com へリダイレクト return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com; # 証明書と秘密鍵の設定 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # 使用する SSL/TLS のバージョンを設定 ssl_protocols TLSv1.2; # 使用する暗号スイートを設定し、サーバで設定した暗号化スイートを優先させる ssl_prefer_server_ciphers on; ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ...
(/etc/nginx/conf.d/example.conf の一つ目の Server ディレクティブは www.example.com でアクセスされた場合に example.com にリダイレクトさせる設定なので、必要のない方は読み飛ばしてください。ただ必要な場合、証明書と秘密鍵を設定する必要があります)
ブラウザで確認
Web サーバを再起動し SSL/TLS 関連の設定を適用して、ブラウザで確認します。https でアクセスして、アドレスバーに鍵マークが付いていれば OK です。
SSL/TLS サーバ証明書の更新を自動化
Certbot で取得した SSL/TLS サーバ証明書の有効期間は 90 日間 です。短いし、更新を手動でやろうとすると忘れるので anacron で自動化しておきます (週 1 でもいいかも) 。
cd /etc/cron.daily touch certbot-renew chmod a+x certbot-renew
#!/bin/bash # /etc/cron.daily/certbot-renew /bin/certbot renew --renew-hook "nginx -s reload" >> /var/log/certbot-renew.log
証明書の更新が可能になるのは有効期限から 30 日以内です。
セキュリティの確認
せっかくいろいろ設定して HTTPS 化したのに、何かしらの不具合でセキュリティ的によろしくない、ということがあるかもしれません。設定したものがちゃんと反映されているか、強度なものであるかを SSL Server Test (Powered by Qualys SSL Labs) で確認できるので、やっておきましょう。詳細に分析してランキング表示してくれます。