げっとシステムログ

WEB開発メモ

Let's Encrypt で SSL してみた

qiita.com

knowledge.sakura.ad.jp

これらの記事を読んで、 Let’s Encrypt で SSL してみました

とりあえず設定してみた、という段階
構成を整えて ansible とかに書いておくべきだがそこまで行ってない

インストール、証明書申請

$ git clone https://github.com/certbot/certbot
$ cd certbot
$ ./certbot-auto
(sudo のパスワード聞かれた)

(パッケージのインストールとか始まる)

最終的にはなんかうまくいかなかったメッセージが表示された
certonly で実行してみたらどうか、というメッセージだったのでそうしてみた

sudo ./certbot-auto certonly ¥
  --webroot ¥
  -w /path/to/document_root/ ¥
  -d domain.example.com ¥
  --email admin@domain.example.com
  • –webroot : 既存のサーバーの document root にファイルを設置する形で証明書の申請とか行う
  • -w : 既存のサーバーの document_root へのパス
  • -d : ssl するドメインを指定
  • –email : 期限切れの警告メールを受信するメールアドレス

–webroot で実行すると、指定した document_root に .well-known ディレクトリが作成され、そこに必要なファイルとかが設置される模様
ここにワンタイム的なファイルを置いて認証とかするのだろうと思う
というわけで、 document_root/.well-known に配置されたファイルに外部からアクセスできるようになっていなければならない
(もちろん、指定したドメインでこのサーバーまで到達できるように DNS 設定しておく必要はある)

サーバーの設定で /.well-known へのアクセスができなくなっていると上記コマンドは失敗に終わる

renew で証明書の更新

./certbot-auto renew ¥
  --post-hook "/sbin/service nginx restart"

renew コマンドで、作成した全ての証明書の更新作業を行うことができる

  • –post-hook : 証明書を更新したら実行するコマンド

サーバー設定

ssl_certificate とかの設定を行う

server {
  server_name domain.example.com;
  listen 443 ssl;

  ssl_certificate     /etc/letsencrypt/live/domain.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/domain.example.com/privkey.pem;

  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/private/dhparams.pem;

  ssl_session_cache builtin:1000 shared:SSL:10m;

  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

  ...
}

nginx のバージョンによるのかもしれないけど、 ssl_certificate は fullchain.pem を指定しないとうまくいかなかった

ssl_certificate と ssl_sertificate_key さえ設定しておけば SSL はできる
その他の設定は下記 SSL のテストをした後で調整したやつ

dhparams.pem は以下の方法で作成できる

openssl dhparam 2048 -out dhparams.pem

SSL のテスト

設定が完了したのでテストをしてみる

www.ssllabs.com

最初は C でした
nginx のデフォルトだと C らしい

診断結果のページで次に何したらいいか結構丁寧に書いてあった

juliansimioni.com

このブログを参考にして設定したら A+ に