まんぷく

君も今日からLet's Encrypt !!

Let’s Encryptがパブリックベータに

当初の予定からは数ヶ月遅れたものの、とうとうLet’s Encrptのパプリックベータサービスが始まりました。

Let’s Encryptは名前からなんとなく想像がつく(つかない?)とは思いますが、無料でオープンな認証局として電子証明書(SSL証明書)を発行してくれるサイトで、Internet Security Research Group (ISRG)によって提供されています。

プレミアムスポンサーにはmozillaAkamaiCiscoEFFの四つが並んでいて、なかなかに豪華な顔ぶれです。

ここまで読んでもよく分からない方もいらっしゃると思うので、もう少し簡単に説明するとLet’s Encryptは電子証明書を無料で、しかもほぼリアルタイムで発行してくれるサービスとセットになった認証局です。

今までは有料でSSL証明書を発行している業者しかなかったので、非常に画期的なサービスです。ただし証明書の有効期間が90日と短い事や、今のところ用途はウェブサーバーに限られているようなので、メールサーバーなどでの利用も含めて証明書が必要な場合は、引き続き有料サービスを利用することになると思います。

今後はHTTPSが当たり前になっていく

現在主流のウェブ技術はHTTP/1.1が基礎になっていまして、これがRFC2616として提案されたのは1999年6月と16年も前の事になります。

ここまで広範に利用されることを想定していなかったので、今となっては非効率な部分がいくつもあって、問題点を解決するために次期バージョンであるHTTP/2がRFC7540として今年の5月に提案され、標準となりました。

そのRFCに従って各プログラムの実装が進んだので、今ではブラウザとサーバーの大半がHTTP/2に対応しています。またHTTP/2の策定には日本のコミュニティも貢献していて、日本人開発者によって実装されたHTTP/2サーバーはいくつもあります。

さて前置きが長くなりましたが、既に主要なブラウザ(ChoromeやFirefox、Safariなど)はHTTP/2対応を完了していますが、HTTP/2を利用するためにはHTTPSが必須となっているため、今後はすべてのウェブサーバーがHTTPS対応を迫られることになっていくと思います。

そして、この流れを加速するように現れたのがLet’s Encryptです。

ちなみにLet’s Encryptとは直接関係はありませんが、SHA-1アルゴリズムには脆弱性が見つかっていて、これで署名された電子証明書は2017年1月に無効になる予定でしたが、Amazon’s EC2のように低コストで大きな計算能力が得られる環境の出現で、想定よりも低コストで偽の証明書が作成出来るようになったので、ブラウザの大半を担っているGoogle、Microsoft、Mozillaの三社が証明書を無効化する時期を大幅に前倒しする方向で検討している模様。Ars Technicaの記事

Let’s Encryptの導入手順

こちら見てもらうと分かりますが、導入は簡単でDebian系のLinuxであればコマンドいくつか入力するだけで導入出来ます。詳しいドキュメントも用意されていますので、他のOSをお使いの方はそちらをお読みください。

以下のコマンドを実行すると、自動で必要なパッケージをダウンロードして実行出来る状態になります。root権限が必要なので、sudoが使用出来るユーザーで実行する必要があります。

インストール

$ git clone https://github.com/letsencrypt/letsencryptw
$ cd letsencrypt
$ ./letsencrypt-auto --help

その後./letsencrypt-auto --apacheを実行すれば、自動的に導入されるはずだったのですが、残念ながら弊社のサーバー環境ではうまくいかず以下のエラーが出て、うまく行きませんでした。

The apache plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError()

仕方がないので./letsencrypt-auto certonly --standalone -d mumpk.com -d www.mumpk.comを使って、単に証明書だけを発行するようにしたところ、これは全く問題なく実行されて/etc/letsencryptディレクトリ以下に必要なファイルが作成されました。

Apacheの設定

証明書が発行されたので、Apacheの設定だけですのでApatch + SSLで検索して設定方法を探して下さい(笑)。とりあえずletsencryptに関連するのは以下の部分だけです。

SSLCertificateFile /etc/letsencrypt/live/mumpk.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mumpk.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mumpk.com/fullchain.pem

蛇足ながら今までHTTPSを使っていなかった場合はSSLモジュールを有効にする必要ありますのでa2enmod sslを実行するか、直接シンボリックリンクを作るかして、モジュールを有効にしてください。それとiptablesの設定も要チェックです。

あれ?Safariだけ繋がらない!

設定後にApacheを再起動して早速接続テストをしてみました。ChromeとFirefoxでは問題なく繋がって鍵マークが出てちょっと嬉しいです。しかしなぜかSafariだけが接続に失敗します。

最初は原因が分からず困惑しましたが、コンソールログを見ると下記のエラーが出ており、どうやらOS X El CapitanとiOS 9から新たに導入されたApp Transport Security(ATS)という機能に起因するもののようです。

2015/12/21 14:26:20.523 com.apple.WebKit.Networking[806]: CFNetwork SSLHandshake failed (-9806)

要するにNSURLSessionクラスはデフォルトでSSLを使うようになったものの、対応しているCipher Suiteが限定されているため、今の設定ではハンドシェイクに失敗してしまっていたと。このページのRequirements for Connecting Using ATSの項目に詳しく書かれています。

The negotiated TLS connection cipher suite must support forward secrecy (FS) and be one of the following: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

ATSが対応しているCipher suiteを使うようにssl.confを書き換える必要があることが分かったものの、結局どう書けば正しいのか今ひとつ分からず、イラッとしながら探し続けた結果、Mozilla SSL Configuration Generatorなる素晴らしいページを発見し一気に解決しました。

弊社サーバー環境がほぼ合致するので、ここで例示されているサンプルをそっくりそのままコピーしただけですが(笑)

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on

Mozillaの中の人達がメインで開発して下さったようで、チョー感謝感激雨あられです。オープンソース最高です。といいつつ私自身は全く貢献していなくて情けないですが、ともかくもありがとうございます。

ついでに<VirtualHost>ディレクティブにも見かけない設定があったので、これも追加しました。どうやらこのヘッダーに対応しているブラウザは自動的にHTTPSを使うようになるみたいです。ちなみにこっちはa2enmod headersでheadersモジュールを有効にしないと動かないです。

Header always set Strict-Transport-Security "max-age=15768000"

Let’s Encrypt導入のまとめ

  1. git clone https://github.com/letsencrypt/letsencryptwを実行しソースコードを取得。
  2. ./letsencrypt-auto --helpを実行しインストール。
  3. ./letsencrypt-auto certonly --standalone -d mumpk.com -d www.mumpk.comを実行し証明書を作成。
  4. Mozilla SSL Configuration Generatorで設定ファイルの雛形を取得。
  5. /etc/apache2/sites-available/にSSL設定ファイルを作成。
  6. a2ensite ファイル名で有効化。
  7. a2enmod ssl及びa2enmod headersでモジュールを有効化。
  8. apache2ctl -tで設定確認。
  9. apache2ctl restarでApacheを再起動。
  10. Qualys SSL LabsのSSL Server Testで確認。

ざっとこんな感じですね。これで今日からあなたのウェブサーバーもHTTPSですね。

Let’s Encrypt !!

Categories
tech

Tags
Let's / Encrypt / letsencrypt