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/

isdSSLサーバー証明書の取得

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を使うことになります。

isdLet’s Encrypt SSLサーバー証明書の使い道

まだベータプログラムなので、本番環境では使いにくいでしょうが、僕は以下のようなケースで使用したいと思います。

  1. 開発環境
  2. Webサイトの本番公開前で、諸事情で証明書の取得に時間がかかっているけどHTTPSのテストをしたい
  3. 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
 

Follow me!