大変ご無沙汰しております。もはやセキュリティ技術者とはいえない状態でわけのわからない仕事に忙殺されております。さて、今日は Java の話題です。Java SE 6のリリースが2006年12月でしたから、かれこれ5年、ようやく2011年7月28日 Java SE 7 がリリースされました。今日は「祝 Java SE 7 リリース記念」ということで暗号、セキュリティ、SSL/TLSの部分を中心に変更点を見ていこうと思います。

早速ダウンロード

7月28日になって何度もダウンロードページを訪れていたんですが、日本時間で夜の10時か11時頃にようやくダウンロードできるようになっていたみたいです。バージョンを見るとこんな感じ、、、

% java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)
一昨日、Java SE 7 Preview Release b147 というのを落としたんですが、内容的には同じもののようです。

サポートするJCEプロバイダの差分をみてみましょう

Java SE 7 で変更点のひとつの目玉は楕円暗号のサポートなんだそうです。 Java SE 6 と Java SE 7(b147) でJCE(Java Cryptographic Extension)プロバイダの提供物の違いをdiffを取ってつらつら眺めてみました。 全体的にsun実装の内部パッケージ名がcom.sun.net.ssl.internalからsun.securityに変更になっているようです。

Java SE 6Java SE 7(b147)
SUN 1.6SUN 1.7
CertStore.LDAPのパッケージ名が変更になっただけ
SunRsaSign 1.6SunRsaSign 1.7
バージョン変更のみ
なしSunEC 1.7
楕円暗号のプロバイダが新規提供
SunJSSE 1.6SunJSSE 1.7
TLSv1.1、TLSv1.2の新規提供。内部パッケージ名の変更
SunJCE 1.6SunJCE 1.7
KeyGeneratorでSunTls12Prfの新規提供
SunJGSS 1.0SunJGSS 1.7
バージョン変更のみ
SunSASL 1.5SunSASL 1.7
SASLプロバイダ。NTLM認証の新規提供
XMLDSig 1.6XMLDSig 1.7
XML署名。W3C Canonical XML 1.1の新規サポート
SunPCSC 1.6SunPCSC 1.7
バージョン変更のみ
SunMSCAPI 1.6SunMSCAPI 1.7
Windows版のみ提供のMS CAPIを使ったプロバイダ。 SignatureでNONEwithRSA、SHA256withRSA、SHA384withRSA、SHA512withRSAの 新規サポート
XML正規化1.1(Canonical XML 1.1)をサポートしたのは個人的にはちょっと嬉しいかもしんない。SunSASLのNTLM認証もいろいろ遊べそうですね。SunSASLについてはここにサポートアルゴリズムが書いてあるんですが、そこにはNTLMについて触れてません。しかしながらSunSASLプロバイダのinfoを見てみるとこんな感じになってます。
Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5, NTLM; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5, NTLM)
どっちが正しいんでしょうね?時間のあるときみてみようと思います。

楕円暗号(Elliptic Curve Cryptography)のサポート

Java SE 7になってようやく楕円暗号のためのJCEプロバイダであるSunECが新たに提供されるようになりました。ECDH、ECDSAをサポートしておりSSL/TLSや署名なんかにちゃんと使えます。 署名アルゴリズムについては以下をサポートしています。

SunECでサポートする署名アルゴリズム
NONEwithECDSA
SHA1withECDSA
SHA256withECDSA
SHA384withECDSA
SHA512withECDSA
サポートしている楕円曲線の名前は以下の通りです。かなりの数サポートしていますね。カスタム定義した曲線の利用が可能なのかは時間があるとき調べてみたいと思います。
曲線名オブジェクト識別子
secp112r11.3.132.0.6
secp112r21.3.132.0.7
secp128r11.3.132.0.28
secp128r21.3.132.0.29
secp160k11.3.132.0.9
secp160r11.3.132.0.8
secp160r21.3.132.0.30
secp192k11.3.132.0.31
secp192r1,NIST P-192,X9.62 prime192v11.2.840.10045.3.1.1
secp224k11.3.132.0.32
secp224r1,NIST P-2241.3.132.0.33
secp256k11.3.132.0.10
secp256r1,NIST P-256,X9.62 prime256v11.2.840.10045.3.1.7
secp384r1,NIST P-3841.3.132.0.34
secp521r1,NIST P-5211.3.132.0.35
X9.62 prime192v21.2.840.10045.3.1.2
X9.62 prime192v31.2.840.10045.3.1.3
X9.62 prime239v11.2.840.10045.3.1.4
X9.62 prime239v21.2.840.10045.3.1.5
X9.62 prime239v31.2.840.10045.3.1.6
sect113r11.3.132.0.4
sect113r21.3.132.0.5
sect131r11.3.132.0.22
sect131r21.3.132.0.23
sect163k1,NIST K-1631.3.132.0.1
sect163r11.3.132.0.2
sect163r2,NIST B-1631.3.132.0.15
sect193r11.3.132.0.24
sect193r21.3.132.0.25
sect233k1,NIST K-2331.3.132.0.26
sect233r1,NIST B-2331.3.132.0.27
sect239k11.3.132.0.3
sect283k1,NIST K-2831.3.132.0.16
sect283r1,NIST B-2831.3.132.0.17
sect409k1,NIST K-4091.3.132.0.36
sect409r1,NIST B-4091.3.132.0.37
sect571k1,NIST K-5711.3.132.0.38
sect571r1,NIST B-5711.3.132.0.39
X9.62c2tnb191v11.2.840.10045.3.0.5
X9.62 c2tnb191v21.2.840.10045.3.0.6
X9.62 c2tnb191v31.2.840.10045.3.0.7
X9.62 c2tnb239v11.2.840.10045.3.0.11
X9.62 c2tnb239v21.2.840.10045.3.0.12
X9.62 c2tnb239v31.2.840.10045.3.0.13
X9.62 c2tnb359v11.2.840.10045.3.0.18
X9.62 c2tnb431r11.2.840.10045.3.0.20
Java SE 7のSunJSSEプロバイダでサポートしているCipherSuitesのリストはここにありますが、その中で楕円系のCipherSuitesはこんな感じ、、、かなりの数ですね。メンテしている環境別のCipherSuitesサポート状況のテーブルは、近いうちJava SE 7を含め歴代Javaのサポート状況を追記したいと思っています。
Java SE 7 SunJSSEプロバイダの提供する楕円系CipherSuites
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDH_ECDSA_WITH_RC4_128_SHA
TLS_ECDH_RSA_WITH_RC4_128_SHA
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
次に簡単なHTTPSクライアントを書いてTLSのelliptic_curves extensionに何が設定されているか、パケットキャプチャして調べてみました所、下のような感じになっていました。げげっ25個もサポートされています。多すぎです。IEやFireFoxでは確か3つぐらいだったはず。
TLS elliptic_curves拡張にある曲線名
secp256r1
sect163k1
sect163r2
secp192r1
secp224r1
sect233k1
sect233r1
sect283k1
secp384r1
sect409k1
sect409r1
secp521r1
sect571k1
sect571r1
secp160k1
secp160r1
secp160r2
sect163r1
secp192k1
sect193r1
sect193r2
secp224k1
sect239k1
secp256k1

その他気になった変更点

セキュリティ関係の変更点はここにまとめらているんですが、その中で気になったところをかいつまんで紹介したいと思います。

JSSE(SSL/TLS), TLS 1.1, TLS 1.2
TLSv1.1, TLSv1.2 がサポートされるようになりました。
JSSE(SSL/TLS) Connection-sensitive trust management
SSL/TLSで使われるアルゴリズムを署名アルゴリズム等弱い物を使わない等指定できるようです。 証明書の中のアルゴリズムまで制限できるのか気になるところ。
JSSE(SSL/TLS) Endpoint verification
HostnameVerifier()を定義すれば、 SSL/TLSのホストの一致確認方法を実装側で 制御できるようです。逆にホスト名をチェックしないこともできたり、証明書のへんなところに入っている ホスト名であっても認証できるようにしたりできますね。
JSSE(SSL/TLS) TLS renegotiation
2009年3月に発表されたSSL rebindingやSSL renegotiationといわれるSSL/TLSの仕様の欠陥をついた攻撃を防ぐためのTLS renegotiation拡張をサポートしているそうだ。
JSSE(SSL/TLS) Server Name Indication (SNI) for JSSE client
SNI拡張がサポートされた。確かにパケットキャプチャするとClientHelloに入っている。一台のウェブサーバーで複数のバーチャルホストに対してちゃんとHTTPS接続することができるようになります。これはテスト目的で前から非常に欲しかった機能。

以上、Java SE 7 リリース記念ということで、JCE関連の機能の変更点をみてみました。やべやべ、もう寝ないとorz

参考リンク

関連記事>

変更履歴

  • 2011-07-31 参考リンクにおいてリンク切れを修正、JCA、PKIを追加