Let’s EncryptでSSLサーバー証明書を取得してみた
(2019.2.5追記)
Let’s Encrypt証明書の取得、自動更新設定については、よりよい設定方法をまとめたので、そちらもご参照ください。
・Let’s EncryptによるSSLサーバー証明書の取得、自動更新設定(2019年1月版)
https://inaba-serverdesign.jp/blog/20190205/lets_encrypt_ssl_certificate_update.html
(2019.2.5追記ここまで)
SSLサーバー証明書の無料発行プロジェクト「Let’s Encrypt」の公開ベータプログラムが12月4日に始まったとのことで、さっそく試してみました。
・Let’s Encrypt総合ポータル
https://letsencrypt.jp/
SSLサーバー証明書の取得
SSLサーバー証明書を取得、設置するサーバーは、「さくらのクラウド」のCentOS 6.7を使用しました。
SSLサーバー証明書の取得は、Let’s Encryptクライアントソフトウェアを実行することで行います。
手順は以下に詳しい説明があります。
・Let’s Encryptの使い方
https://letsencrypt.jp/usage/
この一連の手順の中で、いくつか注意点があります。
まず、「Let’s Encrypt クライアントの準備/2. テスト実行」では、、
# ./letsencrypt-auto --server \ https://acme-v01.api.letsencrypt.org/directory --help
↑このコマンドで、必要なソフトウェアをインストールしてくれますが、CentOS 6の標準リポジトリには python-virtualenv がないので、これだけインストールされません。
python-virtualenv は、EPELリポジトリからインストールします。
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum --enablerepo=epel install python-virtualenv
もう一点、「SSL/TLS サーバ証明書の取得/2. Let’s Encrypt クライアントの実行」では、、
# ./letsencrypt-auto certonly -a standalone \ -d <証明書のCommon Name> \ --server https://acme-v01.api.letsencrypt.org/directory
↑このコマンドを実行しますが、CentOS 6標準のPython 2.6では、以下のようなメッセージが出力されてSSLサーバー証明書を取得できずに終了します。
WARNING: Python 2.6 support is very experimental at present... if you would like to work on improving it, please ensure you have backups and then run this script again with the --debug flag!
これは、メッセージどおり –debug フラグをつけて実行することで、SSLサーバー証明書を取得できるようになります。
# ./letsencrypt-auto certonly -a standalone \ -d <証明書のCommon Name> \ --server https://acme-v01.api.letsencrypt.org/directory \ --debug
なお、Python 2.6を使用していると、証明書は取得できても、以下のようなメッセージがいくつか出力されます。
Updating letsencrypt and virtual environment dependencies...../root/.local/share /letsencrypt/lib/python2.6/site-packages/pip/_vendor/requests/packages/urllib3/u til/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not availab le. This prevents urllib3 from configuring SSL appropriately and may cause certa in SSL connections to fail. For more information, see https://urllib3.readthedoc s.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning
tcpdumpでパケットをキャプチャしてみましたが、証明書取得時のLet’s EncryptサーバーへのアクセスはHTTPではなくHTTPSで行っていますし、FAQを見ても「秘密鍵を送信することはない」とのことで、セキュリティ的にも大きな問題はないと思います。(自己責任でご判断ください。)
気になる方は、以下の記事を参考に、SCLリポジトリのPython 2.7をインストールしてLet’s Encryptクライアントソフトウェアの実行時のみ使用するとよいでしょう。
・CentOS6 で Let’s Encrypt #letsencrypt
https://bayashi.net/diary/2015/1124
この方法であれば、Python 2.6の環境を残しつつ、Let’s Encryptクライアントソフトウェアの実行時のみPython 2.7を使うことになります。
Let’s Encrypt SSLサーバー証明書の使い道
まだベータプログラムなので、本番環境では使いにくいでしょうが、僕は以下のようなケースで使用したいと思います。
- 開発環境
- Webサイトの本番公開前で、諸事情で証明書の取得に時間がかかっているけどHTTPSのテストをしたい
- Apache/NginxのHTTPSセキュリティ強化設定をいろいろ試したい
2.についてはわりとよくあるケースで、これまでは、自己認証局を用意して自己証明書(いわゆるオレオレ証明書)を作成していました。
Let’s Encryptは、それよりは簡単に、しかも一般的なWebブラウザで対応している(=アラートの出ない)証明書が取得できるので便利ですね!
3.については、僕は、QUALYS SSL LABSのSSL Server Test等の評価サイトでチェックしつつ、ApacheやNginxのConfigで暗号化スイート(SSLCipherSuite)などを調整することがあります。
「SSL Server Test」は自己証明書ではそもそも評価してもらえないのですが、Let’s Encryptの証明書であれば、大手認証局が発行したサーバーと同等に評価してもらえます。
「SSL Server Test」の評価基準はちょこちょこ変わるので、「A」判定だったWebサイトがいつのまにか「B」判定になってた、ということもあります。
本番環境でいろいろ実験するわけにもいかないので、テストサーバーに適当なサブドメインを割り当てて、Let’s EncryptのSSLサーバー証明書を使って自由に実験できるのはうれしいです。
今後正式リリースされ、プロジェクトが安全に運用できている(これが大事!)ことが確認できれば、本番環境でもLet’s EncryptのSSLサーバー証明書を使用してもよいと思います。
ドメイン認証(DV)の証明書しか取得できませんが、実際のところ、料金や取得の簡単さなどの理由で、企業認証(OV)ではなくドメイン認証(DV)の証明書を使用するケースも多いですよね。
ただし、有効期間が90日間と短いため、長くても3ヶ月に一度は証明書の更新作業が必要となります。
公式サイトを見ると、この点は正式リリース後も変わらないような印象を受けます。
それでも、通常の
「CSR作成→(場合によってはお客様に依頼して)認証局に申請→発行された証明書を設置」
という非同期フローに比べると、SSL証明書ファイル群が一発で生成されるので、更新作業1回あたりの手間が少ないというメリットがあります。
(関連記事)
・Let’s EncryptによるSSLサーバー証明書の取得、自動更新設定(2019年1月版)
https://inaba-serverdesign.jp/blog/20190205/lets_encrypt_ssl_certificate_update.html