読者です 読者をやめる 読者になる 読者になる

らっちゃいブログ

日々の学びと気づきを発信するブログ

無料でHTTPS証明書を発行できる Let’s Encrypt がついにベータを卒業!正式版になったところで証明書を作ってみた

let`s encrypt https 速報

スポンサーリンク

こんにちは。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 総合ポータル

  1. 漏洩した秘密鍵や誤発行された証明書が短い期間で無効になります。それにより、秘密鍵の危殆化(Key Compromise)や誤発行による被害を抑えられます。

  2. 有効期間の短いSSL/TLSサーバ証明書は、使い勝手を高めるために必要不可欠なオートメーションを促進します。もし、全てのWebサイトを HTTPS に移行させるとすると、Webサーバ管理者がきちんと手動でSSL/TLSサーバ証明書の更新をおこなうことは期待できません。いったんSSL/TLSサーバ証明書の発行と更新を自動化すれば、有効期間の短いSSL/TLSサーバ証明書が有効期間の長い証明書に比べて不便ということにはなりません。

つまり、万が一のときにリスクを最小限に抑えることができる、そして必然的にサーバー管理者が証明書の自動更新をするようになるので、従来のような証明書の更新忘れが減る。

ということのようです。

確かに、最初に自動更新の設定をしてしまえばメリットしか残らなそうですね。

証明書を自動更新する

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 追記

自動更新あたりの話をもう少し詳しく聞きたいという声を受けて、証明書をドメイン毎に更新する方法と実際に運用する際のノウハウについてまとめてみました。

参考までにどうぞ。

racchai.hatenablog.com