メモ、ちょっと古いTomcatのデフォルトとFirefox39のhttps通信の相性問題解決について
備忘録でございます。
問題
SSL周りはここ数年で脆弱性の報告が多く上がっており、最近のブラウザは過去のSSL通信との互換性を捨て始めている。(というより、Weakなサーバーを拒否するようになった)
先日バージョンがあがったFirefox 39では、以下のようなエラーが表示されることがある。
An error occurred during a connection to *******. SSL received a weak ephemeral Diffie-Hellman key in Server Key Exchange handshake message. (Error code: ssl_error_weak_server_ephemeral_dh_key)
書いてある通りだが、設定が甘いサーバーはお断り、ということである。
(ちなみに、Firefox以外は特に怒らなかったりする)
解決策
tomcatのserver.xmlに以下のような記述をしたらよろしい。
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="443" scheme="https" secure="true" keystoreFile="conf/keystore" keystorePass="*****" (略) sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA" />
(20150717:RC4削った RC4 NOMORE )
ciphersの指定が「これでいいのか」は議論の余地があるとおもうが、まあ兎に角これでFirefoxさんが怒ることはなくなった。
(ところで、数多あるウェブサーバーにいえることだが、ciphersの設定のベスト秘伝のたれをだれかがメンテ&公開しつづければ世界が平和になるとおもうのだが…)
あるいはTomctで苦労しない、別の解決策
まあ、Tomcatが直接ブラウザからコネクションを受け取るのがどうか、という話もごもっともであり、前段にnginxとか入れたら良いと思う。のだが、世の中には色々ある。
さらなる余談
作業のついでに、サーバーの証明書がSHA2対応でなかったので、こちらはChromeも半切れであった(つながりはするが)。ついでに証明書を再発行した。
最近(といってもここ5年くらい?)は何度でも証明書がタダで再発行できるので便利だ*1
過去にも、にたような記事をはてダで書いたが、こちらは最近のSHA2での鍵ペアとCSR取得方法のメモである。(ちなみに、これはjdk1.6の話であり、これより古いJavaだとエラーがでるかもしれない(というか、でるはず))
# 鍵ペア生成 $ keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -sigalg SHA256withRSA -keystore keystore # つらつらとCSR生成時のお決まりの情報を聞かれるのでフィルする # CSR出力 $ keytool -certreq -keyalg RSA -alias tomcat -file www.example.com.csr -keystore keystore # 発行された証明書のインポート(p7s形式の場合) $ keytool -import -keystore keystore -alias tomcat -file www.example.com.p7s # なんか文句いわれたら、ちゃんと確認した上でyesで読み込む
完全にここらへんは備忘録であるので、深くは書かない。
どうでもいいが、いまだに
姓名を入力してください。 [Unknown]:
これがCommon Nameなのがキレそうになる。