無料でSSL証明書が作れるLet's Encryptのパブリックβが始まったので早速使ってみたメモ。Linuxなどからコマンドラインで操作する必要はあるが、簡単かつすぐに証明書が取得できた。オレオレ証明書で赤かったhttpsの文字が数分で緑色になった。
この記事ではUbuntu 14.04.3 LTS+nginx 1.8.0(PPA stable版)の環境で取得・設定方法を説明している。続きを読むから。
目次
証明書取得
Let's Encryptのgitレポジトリをcloneしてクライアントを起動する。
証明書取得後にWebサーバーに自動設定できるのだが、nginxの自動設定はバグが多いらしく初期状態では利用できない。そのため証明書の取得のみ行い設定は手動で行う(certonly)。
$ git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt $ ./letsencrypt-auto certonly
起動するとroot権限を取得するためsudoのパスワードプロンプトが表示されるのでパスワードを入力する。
初回起動に限り必要なライブラリのインストールなどが行われる。完了するとメールアドレスの入力を求められるので連絡の取れるメールアドレスを入力し、利用許諾に同意しますかの画面でAgree。
その後FQDN(サブドメインも含めた完全なドメイン名)を入力する(2回目以降の起動はここから始まる)。カンマかスペース区切りで複数入力が可能。
この時Webサーバーが動いているとWebサーバーを止めろと表示されクライアントが終了するので止めておく(ドメイン認証で一時的に内部Webサーバーを立ち上げるため)。どうしても止めたくない時は--webrootオプションを使う方法もある(詳しくはマニュアル参照)。
$ sudo service nginx stop $ ./letsencrypt-auto certonly
FQDNを入力してしばらくすると証明書が保存された旨のメッセージが表示される。
/etc/letsencrypt/live/(入力したFQDN)/を見る(rootじゃないと見えない)とcert.pem,chain.pem,fullchain.pem,privkey.pemの4つのファイル(正確には最新の証明書へのシンボリックリンクだけど)が生成されているはず。
nginxに証明書を設定する
nginxではfullchain.pem(cert+chain)とprivkey.pem(秘密鍵)が必要になる。/etc/nginx/ssl内に証明書を置く派の場合は更新等に備えてシンボリックリンクを張っておくと吉。
$ sudo mkdir -p /etc/nginx/ssl $ sudo ln -s /etc/letsencrypt/live/subdomain.example.com/fullchain.pem /etc/nginx/ssl/fullchain_subdomain.example.com.pem $ sudo ln -s /etc/letsencrypt/live/subdomain.example.com/privkey.pem /etc/nginx/ssl/privkey_subdomain.example.com.pem
nginxに取得した証明書を設定しnginxを再起動させる。念の為設定チェックも行っておく。
$ sudo vi /etc/nginx/sites-available/example server { listen 443 ssl; #IPv4 listen [::]:443 ssl; #IPv6 server_name subdomain.example.com; ssl_certificate /etc/nginx/ssl/fullchain_subdomain.example.com.pem; ssl_certificate_key /etc/nginx/ssl/privkey_subdomain.example.com.pem; ssl_stapling on; #…以下省略 } $ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo service nginx start
httpsで接続してセキュリティ警告が出なければOK。
更新について
Let's Encryptで発行された証明書の有効期限は3ヶ月に設定されている。
完了メッセージにあるように、更新するには再度クライアントを起動し証明書の取得をやり直せばいい。これにより更新されるはず。
ちなみに-dオプションでFQDNを指定できるので覚えておこう。
$ ./letsencrypt-auto certonly -d subdomain.example.com -d subdomain2.example.com
更新忘れ防止のためcrontabで毎月更新処理しておくといいかも?
番外編:SSL Server TestでA+評価を取る
SSL Server TestでA+評価を取るためのnginx向けメモ。
使用する暗号化の種類をある程度制限したりDH鍵交換用のパラメータファイルを生成して設定する。
DH鍵交換用パラメータファイルは以下のコマンドで生成できる。多少時間が掛かる。
$ openssl dhparam 2048 -out dhparam.pem $ sudo cp dhparam.pem /etc/nginx/ssl/dhparam.pem
その後/etc/nginx/nginx.confをいじる。Mozilla提供のSSLサーバー設定ジェネレータが吐き出すIntermediate設定を参考にした。
$ sudo vi /etc/nginx/nginx.conf http { … ## # SSL Settings ## ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE 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:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-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_session_cache shared:SSL:10m; #←評価には影響しないはず ssl_session_timeout 10m; #←同上 … }
HSTS(HTTP Strict Transport Security)を有効化する(A+となる重要な要素)。SSLでのみ運用するサイトは有効化すべし。
$ sudo vi /etc/nginx/sites-available/example server { … add_header Strict-Transport-Security "max-age=15768000;"; … }