uzullaがブログ

uzullaがブログです。

メモ、ちょっと古いTomcatのデフォルトとFirefox39のhttps通信の相性問題解決について

備忘録でございます。

問題

SSL周りはここ数年で脆弱性の報告が多く上がっており、最近のブラウザは過去のSSL通信との互換性を捨て始めている。(というより、Weakなサーバーを拒否するようになった)

先日バージョンがあがったFirefox 39では、以下のようなエラーが表示されることがある。

f:id:uzulla:20150709020846p:plain

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の設定のベスト秘伝のたれをだれかがメンテ&公開しつづければ世界が平和になるとおもうのだが…)

副作用

古いブラウザはつながらなくなる。たとえばXP+IEとか。ガラケーとか。

あるいは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なのがキレそうになる。

まとめ

tomcathttps対応はあんまり見かけなくて面倒なので、nginxなどを前段に入れる方が良い。

*1:すくなくとも、RapidSSLではできる。(例の、リセラーのJPドメインの問題はあるのだが…)