Certbot で PlusArchive を HTTPS 化した

はじめに

自作サイト PlusArchiveCertbotHTTPS 化しました。今回はその手順を簡単に説明していきます。

Certbot とは

Certbot は無料で SSL/TLS サーバ証明書を取得、更新できるサービスです。 証明書作成の手間やお金もかからないので、個人サイトを運用されている方で、ドメイン認証タイプの証明書を取得したい場合におすすめです。

環境

  • さくら VPS 1G プラン
  • CentOS 7.x
  • Nginx Mainline

準備

導入する前にサーバで Certbot が使える環境であるか System Requirements で確認しておきます。最低限 Python のバージョン (現時点では 2.6 か 2.7 で動作する) と 80/443 ポートが解放されているかのチェックはしておきましょう。

導入手順

Certbot のサイトに行って Software と System を選択すると、大まかな手順が得られます。それらを頼りに、自分の環境に合ったやり方を少し詳しく説明していきます。

Software と System を選択

自分の場合は Nginx on CentOS/RHEL 7

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) で確認できるので、やっておきましょう。詳細に分析してランキング表示してくれます。

参考リンク