無料でHTTPS証明書を発行できる Let’s Encrypt がついにベータを卒業!正式版になったところで証明書を作ってみた
スポンサーリンク
こんにちは。racchai です。
Let's Encrypt がベータを卒業するというアナウンスが出ました。
Leaving Beta, New Sponsors - Let's Encrypt - Free SSL/TLS Certificates
なにそれおいしいの?という方は公式の説明を読んでいただくとして、使い方を忘れている方向けに、使い方をおさらいしてみます。
letsencrypt をインストールする
手元の ubuntu マシンにインストールしていきます。
$ git clone https://github.com/letsencrypt/letsencrypt
インストールはこれだけです。
ではヘルプを見てみましょう。
$ cd letsencrypt $ ./letsencrypt-auto --help all Installing Python packages... Traceback (most recent call last): File "/home/ubuntu/.local/share/letsencrypt/bin/pip", line 11, in <module> sys.exit(main()) File "/home/ubuntu/.local/share/letsencrypt/local/lib/python2.7/site-packages/pip/__init__.py", line 215, in main locale.setlocale(locale.LC_ALL, '') File "/home/ubuntu/.local/share/letsencrypt/lib/python2.7/locale.py", line 579, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting Traceback (most recent call last): File "/tmp/tmp.2dUVOxOghM/pipstrap.py", line 146, in <module> exit(main()) File "/tmp/tmp.2dUVOxOghM/pipstrap.py", line 133, in main shell=True) File "/usr/lib/python2.7/subprocess.py", line 573, in check_output raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command 'pip install --no-index --no-deps -U /tmp/pipstrap-RmWu9p/pip-8.0.3.tar.gz /tmp/pipstrap-RmWu9p/setuptools-20.2.2.tar.gz /tmp/pipstrap-RmWu9p/wheel-0.29.0.tar.gz' returned non-zero exit status 1
おっと、エラーが出ました。LC_ALL がおかしいようなので確認してみます。
$ locale locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC=ja_JP.UTF-8 LC_TIME=ja_JP.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY=ja_JP.UTF-8 LC_MESSAGES="en_US.UTF-8" LC_PAPER=ja_JP.UTF-8 LC_NAME=ja_JP.UTF-8 LC_ADDRESS=ja_JP.UTF-8 LC_TELEPHONE=ja_JP.UTF-8 LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=ja_JP.UTF-8 LC_ALL=
なるほど、LC_ALL が未設定でした。ここで細かい話をしても仕方がないので、いったん環境変数を指定して対処します。
$ env LC_ALL="en_US.UTF-8" ./letsencrypt-auto --help all Bootstrapping dependencies for Debian-based OSes... (略) 0 upgraded, 0 newly installed, 0 to remove and 67 not upgraded. Checking for new version... Creating virtual environment... Installing Python packages... Installation succeeded. Requesting root privileges to run letsencrypt... sudo /home/ubuntu/.local/share/letsencrypt/bin/letsencrypt --help all usage: letsencrypt-auto [SUBCOMMAND] [options] [-d domain] [-d domain] ... The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing the cert. Major SUBCOMMANDS are: (default) run Obtain & install a cert in your current webserver certonly Obtain cert, but do not install it (aka "auth") install Install a previously obtained cert in a server renew Renew previously obtained certs that are near expiry revoke Revoke a previously obtained certificate rollback Rollback server configuration changes made during install config_changes Show changes made to server config during installation plugins Display information about installed plugins optional arguments: (略)
無事動きましたね。これでインストールは完了です。
証明書を発行する
それでは肝心の証明書発行を試してみましょう。
手順としては、以下のようなコマンドを叩くだけです。
$ ./letsencrypt-auto certonly --webroot -w <ドキュメントルート> -d <ドメイン>
初回実行時のみ連絡用メールアドレスと規約への同意を求められますので、感謝の心で入力しましょう。
では、racchai.com
用の証明書を発行してみます。
$ ./letsencrypt-auto certonly --webroot -w /var/www/html/ -d racchai.com Checking for new version... Requesting root privileges to run letsencrypt... /home/ubuntu/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/html/ -d racchai.com Failed authorization procedure. racchai.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://racchai.com/.well-known/acme-challenge/f9hzp5zln7nsVh1HY9DFyS4EgqhUOJDkKsmzV4_FkEM [52.193.76.212]: 401
むむ。また失敗しました。
エラーを読めばわかりますが、http://racchai.com/.well-known/
へのアクセスに失敗したようです。
/var/www/html/
の権限は問題ないはず。。
あ、そういえばウェブサーバーの設定でサーバー名が localhost
のままでした。
サーバー名を racchai.com
に変更して再度トライ。
$ ./letsencrypt-auto certonly --webroot -w /var/www/html/ -d racchai.com Checking for new version... Requesting root privileges to run letsencrypt... sudo /home/ubuntu/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/html/ -d racchai.com IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/racchai.com/fullchain.pem. Your cert will expire on 2016-07-12. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - 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
今度は無事成功しました。
/etc/letsencrypt/live/racchai.com/fullchain.pem
に証明書が作成されたそうなので、確認してみます。
/etc/letsencrypt/
以下は root の所有になっていますので、sudo する必要がありますのでご注意ください。
$ sudo openssl x509 -in /etc/letsencrypt/live/racchai.com/fullchain.pem -text Certificate: Data: Version: 3 (0x2) Serial Number: 03:b2:b3:ee:45:dd:9b:10:a8:ce:0f:c6:aa:8c:8d:d6:ec:a8 Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3 Validity Not Before: Apr 13 02:44:00 2016 GMT Not After : Jul 12 02:44:00 2016 GMT Subject: CN=racchai.com 略
はい、ちゃんと作成されてますね。
秘密鍵も /etc/letsencrypt/live/racchai.com/privkey.pem
に配置されていますので、これらをウェブサーバーに設定してしまえば完了です。
と、ここで一つご注意いただきたいのがこちら。
Not Before: Apr 13 02:44:00 2016 GMT
Not After : Jul 12 02:44:00 2016 GMT
期限が90日と一般的な証明書よりも短くなっています。
この90日という期限について、公式サイトでは以下のように説明しています。
証明書の有効期間が90日間な理由 - Let's Encrypt 総合ポータル
つまり、万が一のときにリスクを最小限に抑えることができる、そして必然的にサーバー管理者が証明書の自動更新をするようになるので、従来のような証明書の更新忘れが減る。
ということのようです。
確かに、最初に自動更新の設定をしてしまえばメリットしか残らなそうですね。
証明書を自動更新する
Let's Encrypt を利用する場合は事実上証明書の自動更新が必須であることがわかりましたので、本記事ではそのあたりの設定もやってみようと思います。
といっても、以下のコマンドをたたくだけです。
$ ./letsencrypt-auto renew ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/racchai.com.conf ------------------------------------------------------------------------------- The following certs are not due for renewal yet: /etc/letsencrypt/live/racchai.com/fullchain.pem (skipped) No renewals were attempted.
正常終了しましたが、racchai.com
の証明書は skipped となりました。
これは、racchai.com の証明書が新しいので自動更新の対象とならなかったようです。
とはいえ、秘密鍵が漏えいした等の理由で、ただちに証明書を作り直したいケースだってありますよね。
こういったケースにも対応できるよう、--force-renew
オプションが用意されています。
--force-renew
を付与することで、強制的に更新することができるようになります。
$ ./letsencrypt-auto renew --force-renew Checking for new version... Requesting root privileges to run letsencrypt... sudo /home/ubuntu/.local/share/letsencrypt/bin/letsencrypt renew --force-renew ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/racchai.com.conf ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- new certificate deployed without reload, fullchain is /etc/letsencrypt/live/racchai.com/fullchain.pem ------------------------------------------------------------------------------- Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/racchai.com/fullchain.pem (success)
今度はスキップされることなく、ちゃんと更新されましたね。
あとは cron 等で90日を超えない間隔で定期的に自動更新+ウェブサーバーの再起動をするように設定するだけです。
ちなみに、やる人はいないとは思いますが、89日間隔のようにして期限ギリギリに更新するような設定はやめましょう。
万が一更新処理に失敗してしまったら、証明書の期限切れでサイト自体にアクセスできない事態になりかねません。
個人的には毎月1回くらいの頻度で更新することをおすすめします。
4/18 追記
自動更新あたりの話をもう少し詳しく聞きたいという声を受けて、証明書をドメイン毎に更新する方法と実際に運用する際のノウハウについてまとめてみました。
参考までにどうぞ。