2017-12-19 01:51
nginx ssl

Let's Encrypt で SSL A+

ゴール

image

環境

  • さくらVPS
  • Ubuntu
  • nginx
  • NodeJS(express + nuxt)
  • postgreSQL

ざっくりな流れ

  • 無料の Let's Encrypt で SSL化する
  • cronで Let's Encrypt の自動更新を仕込む
  • nginxの設定をゴニョゴニョする。

Let's Encrypt

  • 無料でSSL/TLSサーバ証明書を取得して、ウェブサイトをHTTPS化することができる。
  • 詳細は日本語ポータル

インストール

  • サーバに接続する
    • ちなみにサーバにはpython 2.7 以降がインストールされている必要があるとのこと。
  • 任意のディレクトリでcertbotgit clone
git clone https://github.com/certbot/certbot.git
  • クローンした certbot ディレクトリで certbot-auto helpを実行。ここで必要なライブラリなどがインストールされる。正常に終わるとhelpが表示される。
cd certbot
./certbot-auto --help

実行

  • 80ポートと443ポートを開いておく
  • nginxは一旦stopしとく
sudo service nginx stop
  • 以下を実行
./certbot-auto certonly --standalone  -d ドメイン名 -d www.ドメイン名
  • 途中、Emailアドレス聞かれたり、利用規約同意求められたりするので普通に答える。
  • うまくいくと Congratulations! と共に fullchain.pemprivkey.pem の出力先が表示される。

nginx

ssl対応

  • 443ポートをlisten

default.conf

# httpをリダイレクト server { listen 80 default_server; return 301 https://imatomix.com$request_uri; } # https server { listen 443 ssl http2; server_name imatomix.com; ssl on; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; .... }
  • nginx 起動
sudo service nginx start

image

A+化

  • 「The server does not support Forward Secrecy with the reference browsers. Grade reduced to A-.」とある。ググる。
  • Forward Secrecy に対応させる必要があり、そのためには鍵交換時の暗号化方式に ECDH を指定する必要があるとのこと。
  • あと、SSLもいろいろで、脆弱な暗号化方式があるらしい。それらを無効化するといいらしい。
  • nginxの設定を修正

default.conf

# https server { listen 443 ssl http2; server_name imatomix.com; ssl on; ssl_certificate /path/to/fullchain.pem; ssl_certificate_key /path/to/privkey.pem; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDH !aNULL !eNULL !SSLv2 !SSLv3'; .... }
  • これでA+でた。

image

cronで自動更新

  • root権限でcrontabを編集
su -
crontab -e 
  • crontab は初めての場合はエディタを聞かれる。好みのエディタを選択。

  • crontabにcronを記入。

00 05 01 * * service nginx stop && /path/to/certbot-auto renew --force-renewal && service nginx start
  • これで毎月朝5時に自動更新される、はず。