SSLの設定は面倒だね

iOS 9やMac OS X El CaptionのSafariからはHTTP/2対応だし、「ハッハッ、見ろ!第1種電気通信事業がゴミのようだ!! #通信の最適化()」を考えるとSSL/TLS対応は流れ的には止められない。

でも「Chrome 45のセキュリティ改善により、開けないサイトが現れる(更新)」もあったりして色々HTTPS周りは面倒なのだ。

対応はわかるんだけど接続する方法が皆無つーのがChromeかっこよすぎる。
そいう意味ではSSLは面倒っちゃー面倒。

で、公開懺悔日記はChromeの最新版でも閲覧できるししばらく放置していたらFacebookで指摘が・・・

11057254 10207590692907684 3902362205018252497 o

「古い暗号スイートにより暗号化されています。」だって・・・
気持ち悪いので古い暗号スイートではなくいけている暗号スイートにしてみる。

ssl.confでSSLCipherSuiteをいじる。

SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4:!SSLv2:!LOW:!EXP

これが正しいかはわからないんだよなぁ。
ググってみても正しいかは不明^^;;

ついでに「SSLCompression Off」も入れてみた。

SSLCompression

ブラウザとの HTTPS 接続に SSL/TLS データ圧縮を使っている場合に
中間者攻撃者が平文の HTTP ヘッダを取得する可能性があるので、データ圧縮をしないよう設定します。

圧縮はいまいちいけていないっぽいのでOFFにしておく。
これが効果があるかは不明。
数年前では効果があるっぽいけど・・・今となってはどうなんでしょうか?

上記slideshareによると

  • よほどNetworkに問題があるケースでない限り、SSL圧縮は無効化した方が応答時間やスループットは改善すると思われる
  • セキュリティの観点からは、圧縮無効化が推奨

となっているし「SSLCompression Off」でいいと思う。

“SSLLabでチェック

SSLCipherSuite変更しただけでチェックしてみるとTLS導入時には「B」だったけど「A-」まであがっている。

あとはA+まで持って行くにはForward Secrecy対応だな

Forward Secrecy

過去の秘密データを守るに詳しく書かれている。

実用化されているのはDHE(ディフィー・ヘルマン鍵共有)と、ECDHE(楕円曲線ディフィー・ヘルマン鍵共有)です。

SSLCipherSuiteでDHEとECDHEのみにしたら良いような気がする。
ということで「A better SSL configuration for Apache 2」を参考にssl.conを修正

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
SSLCompression Off

かなりSSLCipherSuiteが短くなった・・・

Header add Strict-Transport-Security(HSTS)

HSTS はwww.barasu.orgに対するAccessはHTTPではなくHTTPS通信を行うようにする機能です。
対応ブラウザではリダイレクトとか考えなくて良さそうな気がする。
2月には「HTTP Strict Transport Security comes to Internet Explorer」ということでIEでもHSTSに対応済みと。
古いIEではHSTSには未対応ですがしゃーないっすね。

ssl.confに

Header always set Strict-Transport-Security “max-age=315360000; includeSubDomains”

と書けば対応しているブラウザで閲覧すると強制的にHTTPSになります。

OCSP Stapling

OCSP(Online Certificate Status Protocol)とは、SSL/TLS暗号化通信の初期フェーズにおいて証明書の失効を確認するための手順。

詳しくは「NginxでのOCSP Stapling対応設定」を読んでください。

少しだけレスポンスが早くなるという理解。

ssl.confは

# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off

OSCP Staplingの確認は下記コマンド

$ openssl s_client -connect サーバ名:443 -tls1 -status -reconnect 2 > &1 < /dev/null | head

対応されているサーバ

$ openssl s_client -connect www.barasu.org:443 -tls1 -status -reconnect 2> &1 < /dev/null | head [~]
depth=1 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 1 Primary Intermediate Server CA
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
OCSP response:
======================================
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)

対応されていないサーバ

$ openssl s_client -connect www.facebook.com:443 -tls1 -status -reconnect 2> &1 </dev/null | head [~]
depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
OCSP response: no response sent

Certificate chain
0 s:/C=US/ST=CA/L=Menlo Park/O=Facebook, Inc./CN=*.facebook.com
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3

Facebookでも対応していないから対応は必須ではない気がする^^;;

ssl.confのテンプレート

設定が複雑過ぎるのでテンプレートを探していたらMozilla SSL Configuration Generatorなんてサイトを見つけた。
ここでApacheのバージョンとかOpenSSLのバージョンを入れるとconfigがはき出される便利なサイト。

このconfをマネして作ってみた。

ssl labで確認

これで満足。
これをテンプレートにして各サーバに適用していこう。