Let’s Encrypt でお手軽にSSL証明書を取得する ( AMIMOTO Advent Calendar 2015 5日目 )

AMIMOTO Advent Calendar の5日目です。
なんか、ほんのちょっと前の記事が wp-cli Advent Calendar 2014 ですね。
月日がたつのは早いもんだ。

HTTP/2の登場で、俄然注目を浴びてきたSSL証明書ですが、個人で導入しようとするといろいろとハードル高いのも事実です。
いままでは、プライベートキー作って、そのプライベートキーから CSR 作成して、CSR を認証局に提出して、認証局に対するドメイン保持証明をして、認証されたら送られてきたSSL証明書を Web サーバに設定して.
しかも、結構お高い( まぁ、年間2,000円くらいの物もありますが)

しかし、そんな僕らの悩みを解決してくれる無料でトンデモなく簡単にSSL証明書を取得できるサービスがついに開始されました!
その名も Let's Encrypt !

Let's Encrypt を使って dogmap.jp の SSL 証明書取得して HTTP/2 対応したんですが、これがびっくりぽんなくらい簡単だったんで紹介します。
参考URL: DockerでLet’s Encryptしよっか @sawanoboly

まぁ、のぼりんの記事を読んでもらえばわかりやすいんですが、ここでも紹介します。
対象は AMIMOTO HTTP/2 を想定してますが、他のプロダクトでもやりかた変わらないっす。

手順としては

  • Docker インストールして、サービス開始する
  • Docker で letsencrypt コマンド実行
  • Nginx の設定ファイルを修正して、再起動する

これだけです。

Docker インストールして、サービス開始する

まずは、起動済みの AMIMOTO インスタンスに SSH で接続してください。これしなきゃ何もはじまらないっす。
SSH 接続したら、おもむろに sudo su - と打って root になっちゃいましょう。
その後、yum で Docker インストールして、サービスを開始します。

$ sudo su -
# yum -y install docker
# service docker start

Docker で letsencrypt コマンド実行

letsencrypt コマンドを実行した時に、同じサーバ上で 80 を listen してると以下のエラーが発生します。

An unexpected error occurred:
The request message was malformed :: Error creating new authz :: Name does not end in a public suffix
Please see the logfiles in /var/log/letsencrypt for more details.

AMIMOTO AMI では、Nginx が起動しているので、まずこれを停止します。

# service monit stop
# service nginx stop

※ monit というサービスは nginx プロセスが起動しているかを監視して、プロセスが落ちている場合は自動的に復旧させるので先に止めておきます。

その後、Docker で letsencrypt コマンドを実行します。

# docker run -it --rm -p 443:443 --name letsencrypt \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    quay.io/letsencrypt/letsencrypt:latest auth

しばらく待つと、以下の様な画面が表示されるので、E-Mail アドレスを入力して enter。
スクリーンショット 2015-12-04 11.17.06

規約に同意してねって表示されるので Agree を選んで enter。
スクリーンショット 2015-12-04 11.41.51

ドメイン名入力してねって表示されるので、SSL証明書を取得したいドメイン名を入力して enter。
スクリーンショット 2015-12-04 11.42.03

そうすっと SSL 証明書ができたぜ!って、ごきげんなメッセージが表示されます。

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to wokamoto@digitalcube.jp.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/dogmap.jp/fullchain.pem. Your cert will
   expire on 2016-03-03. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

メッセージにも書いてあるけど、証明書の有効期限は3ヶ月とちょっと短めなので、有効期限が切れる前に更新してあげてください。

参照元の @sawanobory が書いた記事だと、このあと「JSONをWebサーバで返してくれと言われる」らしいんだけど、僕のやった時はそれすらも出なかった。
Let's Encrypt のベータが取れて、パブリックベータになったから仕様が変わったのかな?

letsencrypt コマンドを実行する前に停止していた monit、nginx を再開しておきましょう。

# service nginx start
# service monit start

また、Docker も停止しておいても良いです。

# service docker stop

Nginx の設定ファイルを修正して、再起動する

上の手順で作成された SSL 証明書は /etc/letsencrypt/live/{ドメイン名} ディレクトリに作成されてます。

  • cert.pem – SSL証明書
  • chain.pem – 中間CA証明書
  • fullchain.pem – SSL証明書 + 中間CA証明書
  • privkey.pem – 秘密鍵

Nginx で設定するときに必要なのは fullchain.pemprivkey.pem です。
HTTP/2 AMIMOTO を使用している場合は、/etc/nginx/conf.d/default-ssl.confssl_certificatessl_certificate_key を以下のように修正してください。

    ssl_certificate     /etc/letsencrypt/live/{ドメイン名}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem;

※ {ドメイン名} は適宜置換してね。例えば dogmap.jp なら /etc/letsencrypt/live/dogmap.jp/ です。

HTTP/2 AMIMOTO じゃない場合は、/etc/nginx/conf.d/default.conf/etc/nginx/conf.d/default-ssl.conf とかって名前でコピーしてから。
こんな感じに修正しましょう。

server {
    listen      443 ssl;
    server_name _;
    root        /var/www/vhosts/{instance_id};
    index       index.html index.htm;
    charset     utf-8;

    ssl on;
    ssl_certificate     /etc/letsencrypt/live/{ドメイン名}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem;

    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers AESGCM:HIGH:!aNULL:!MD5;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;

設定ファイル修正したら service nginx restart で nginx を再起動して、設定を反映しましょう。
また、通常の AMIMOTO AMI を使っていて HTTP/2 対応にしたい場合は digitalcube が HTTP/2 AMIMOTO 用に置いている nginx 1.9.7 の rpm を使ってアップデートしてしまいましょう。

# rpm -Uvh https://s3-ap-northeast-1.amazonaws.com/nginx-next-amimoto/nginx-1.9.7-1.amzn1.amimoto.x86_64.rpm

その上で default-ssl.conflisten 443 ssl; の部分を listen 443 ssl http2; にしてから nginx 再起動すれば、あなたのサイトも HTTP/2 !

それでは、よい HTTP/2 ライフを!

おまけ:aws-cli を使用して、CloudFront 用にアップロード

忘れっぽい、僕のための備忘録。

Let's Encrypt で作った SSL 証明書を aws-cli を使用して CloudFront 用にアップロードするには

# cd /etc/letsencrypt/live/{ドメイン名}
# aws iam \
 upload-server-certificate \
 --server-certificate-name {証明書の名前} \
 --certificate-body file://cert.pem \
 --private-key file://privkey.pem \
 --certificate-chain file://chain.pem \
 --path /cloudfront/

削除するには

# aws iam \
 delete-server-certificate \
 --server-certificate-name {証明書の名前}

コメントを残す

メールアドレスが公開されることはありません。