原文はこちら。
The original article was written by Sean Mullan (Java Security Tech Lead, Oracle).
https://seanjmullan.org/blog/2022/09/22/jdk19
2022年9月20日にJDK19がリリースされました。
JDK 19
https://openjdk.java.net/projects/jdk/19/
以前のブログと同様、今回のリリースで最も興味深く、有用だと思われるセキュリティ強化点をリストアップしてみました。また、それらを適切なカテゴリ(暗号、PKIなど)に分類し、各領域で何が変わったかを簡単に見つけられるようにしました。JDK 19のリリースノートには、これらの機能強化やその他の機能強化に関する詳細も記載されています。
Sean Mullan’s Blog
https://seanjmullan.org/blog/
JDK 19 Release Notes
https://jdk.java.net/19/release-notes
このリリースのハイライトは、Javaプラットフォームのデフォルトのセキュリティを強化するさらなる改善、そしてTLSパフォーマンスの改善です。他にも、Windows上のローカルマシン証明書にアクセスするためのKeyStoreサポートの追加や、HTTPSとKerberosによるTLSチャネルバインディングトークンのサポートなど、実に有用な機能強化も入っています。
Table of Contents
Crypto
Default key sizes increased
(デフォルトのキーサイズ増加)
KeyPairGenerator
とKeyGenerator
というJDK実装が生成するキーのデフォルトサイズが以下のように増えています。
アルゴリズム | デフォルトのサイズ |
---|---|
RSA RSASSA-PSS DH | 3072ビット(従来は2048ビット) |
EC | 384ビット(従来は256ビット) |
AES | crypto policyが許す場合には256ビット(従来は128ビット) 許さない場合には、128ビットへフォールバック |
[JDK-8267319] Use Larger Default Key Sizes and Algorithms Based on CNSA
https://bugs.openjdk.org/browse/JDK-8267319
SHA3 performance increased up to 2x
(SHA3のパフォーマンスが最大2倍に改善)
JDK “SUN”プロバイダーのSHA3メッセージダイジェストアルゴリズムのパフォーマンスが最大2倍に向上しました。
[JDK-8275914] SHA3: changing java implementation to help C2 create high-performance code
https://bugs.openjdk.org/browse/JDK-8275914
OAEPParameterSpec.DEFAULT is deprecated
(OAEPParameterSpec.DEFAULT
は非推奨に)
javax.crypto.spec.OAEPParameterSpec
クラスの静的フィールド DEFAULT
が非推奨になりました。
DEFAULT: OAEPParameterSpec (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/crypto/spec/OAEPParameterSpec.html#DEFAULT
この定数はSHA-1のような弱いデフォルトアルゴリズムを使います。アプリケーションはこの定数の利用を止め、 OAEPParameterSpec(String, String, AlgorithmParameterSpec, PSource)
コンストラクタを使って明示的にパラメータを指定すべきです。
OAEPParameterSpec (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/crypto/spec/OAEPParameterSpec.html#%3Cinit%3E(java.lang.String,java.lang.String,java.security.spec.AlgorithmParameterSpec,javax.crypto.spec.PSource)
[JDK-8284553] Deprecate the DEFAULT static field of OAEPParameterSpec
https://bugs.openjdk.org/browse/JDK-8284553
PSSParameterSpec(int) and PSSParameterSpec.DEFAULT are deprecated
(PSSParameterSpec(int)とPSSParameterSpec.DEFAULTは非推奨に)
PSSParameterSpec(int)
コンストラクタと静的フィールドDEFAULT
が非推奨になりました。
PSSParameterSpec (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/security/spec/PSSParameterSpec.html#%3Cinit%3E(int)DEFAULT
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/security/spec/PSSParameterSpec.html#DEFAULT
このコンストラクタと定数は、弱いSHA-1をデフォルトハッシュアルゴリズムとして利用するため、もう利用は推奨されません。アプリケーションはこのコンストラクタや定数の利用を止め、 PSSParameterSpec(String, String, AlgorithmParameterSpec, int, int)
コンストラクタを使って明示的にパラメータを指定すべきです。
PSSParameterSpec(String, String, AlgorithmParameterSpec, int, int)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/security/spec/PSSParameterSpec.html#%3Cinit%3E(java.lang.String,java.lang.String,java.security.spec.AlgorithmParameterSpec,int,int)
PKI
New Windows KeyStore types for accessing local machine certificates
(ローカルマシン証明書へのアクセスのための新たなWindows KeyStoreタイプ)
Windows-MY-LOCALMACHINE
とWindows-ROOT-LOCALMACHINE
という、2個のKeyStoreタイプが追加されました。これらは、Windows OSに格納されている、全アカウントが利用可能なキーや証明書へのアクセスを可能にするものです。別のWindows KeyStoreタイプであるWindows-MY
とWindows-ROOT
は、現在のユーザーアカウントのみに関連づけられているキーや証明書へのアクセスを可能にします。混乱を避けるため、これらのタイプに対する新しい名前として、それぞれ
Windows-MY-CURRENTUSER
(=Windows-MY
)Windows-ROOT-CURRENTUSER
(=Windows-ROOT
)
を導入しました。JDKプロバイダーガイドのSunMSCAPI Providerの章に、新しいKeyStoreタイプに関する記載があります。
The SunMSCAPI Provider : JDK Providers Documentation
https://docs.oracle.com/en/java/javase/19/security/oracle-providers.html#GUID-4F1737D6-1569-4340-B140-678C70E63CD5
[JDK-6782021] It is not possible to read local computer certificates with the SunMSCAPI provider
https://bugs.openjdk.org/browse/JDK-6782021
Enhanced support for OtherNames in X.509 certificates
(X.509証明書におけるOtherNamesのサポートを強化)
X509Certificate API の getSubjectAlternativeNames
と getIssuerAlternativeNames
メソッドの JDK 実装が強化され、OtherName
型に対してより有用な情報を返せるようになりました。
X509Certificate (Java SE 19 & JDK 19)
getSubjectAlternativeNames()
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/security/cert/X509Certificate.html#getSubjectAlternativeNames()
getIssuerAlternativeNames()
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/security/cert/X509Certificate.html#getIssuerAlternativeNames()
返されるリストの 3 番目と 4 番目の項目には、OID (String
) と ASN.1 エンコード値 (文字列の場合はString
、それ以外の場合はバイト配列) が含まれるようになりました。これらの追加された値は、アプリケーションがOtherName
がどの型であるかをより簡単に識別するのに役立ち、OIDと値を決定するためにエンコードされた値のさらなるパースを回避できます。
[JDK-8277976] Break up SEQUENCE in X509Certificate::getSubjectAlternativeNames
and X509Certificate::getIssuerAlternativeNames
in otherName
https://bugs.openjdk.org/browse/JDK-8277976
TLS
TLS performance related improvements
(TLSパフォーマンス関連の改善)
いくつかのパフォーマンスに関連する改善がなされ、スピードアップならびにTLSハンドシェイク時に利用されるメモリ利用量が削減されました。詳細は以下のIssueをご覧ください。
[JDK-8286433] Cache certificates decoded from TLS session tickets
https://bugs.openjdk.org/browse/JDK-8286433
[JDK-8284694] Avoid evaluating SSLAlgorithmConstraints twice
https://bugs.openjdk.org/browse/JDK-8284694
[JDK-8285398] Cache the results of constraint checks
https://bugs.openjdk.org/browse/JDK-8285398
3DES suites removed from default enabled TLS cipher suites
(3DES暗号スィートはデフォルトで有効なTLS暗号スィートから削除)
3DES暗号スィートはデフォルトで有効なTLS暗号スィートから削除されました。jdk.tls.disabledAlgorithms
セキュリティプロパティに 3DES
が含まれているため、3DES暗号スィートはすでに無効化されており、デフォルトでは TLS 接続のハンドシェイク時に考慮されないことに注意してください。この変更により、偶発的または悪意を持って3DES暗号スイートを有効にすることが非常に難しくなりました。RFC 7525には以下のような記述があります。
Implementations SHOULD NOT negotiate cipher suites that use algorithms offering less than 128 bits of security. (実装は128ビット未満のセキュリティを提供するアルゴリズムを使用する暗号スイートをネゴシエートするべきではない。)
Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) – https://www.rfc-editor.org/rfc/rfc7525
3DESの強度は112ビットで、これは128ビット未満のセキュリティです。このスイートを再度有効にすることはお勧めしませんが、必要であれば、再度有効化するための指示がリリースノートに含まれています。
TLS Cipher Suites Using 3DES Removed From the Default Enabled List (JDK-8163327) – JDK 19 Release Notes
https://jdk.java.net/19/release-notes#JDK-8163327
[JDK-8163327] Remove 3DES from the default enabled cipher suites list
https://bugs.openjdk.org/browse/JDK-8163327
New APIs for customizing TLS and DTLS signature schemes
(TLSおよびDTLS署名スキームのカスタマイズのための新たなAPI)
2個の新たなAPIが追加されました。アプリケーションはこれを使って、TLSまたはDTLS接続のネゴシエート時に使用される署名スキームの優先順位をカスタマイズして取得できます。
SSLParameters (Java SE 19 & JDK 19)
setSignatureSchemes
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLParameters.html#setSignatureSchemes(java.lang.String[])
getSignatureSchemes
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLParameters.html#getSignatureSchemes()
[JDK-8280494] (D)TLS signature schemes
https://bugs.openjdk.org/browse/JDK-8280494
RFC 6125 endpoint identification algorithm fully supported
(RFC 6125エンドポイント識別アルゴリズムを完全サポート)
RFC 6125ではTLS証明書のアイデンティティ検証のための手続きを定義しています。
RFC 6125: Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)
https://rfc-editor.org/rfc/rfc6125
JDK実装は、今回修正された1カ所を除きほとんど準拠していました。(今後)JDK実装は、TLS証明書内のワイルドカード文字が左端のラベル以外を構成している場合、ワイルドカードドメインとの照合を試みません。具体的には、以下のような場合には照合しません。
foo.*.example.net
必要であれば、アプリケーションは独自のHostnameVerifier
やTrustManager
を実装することで、この制限を回避することができます。
[JDK-7192189] Support endpoint identification algorithm in RFC 6125
https://bugs.openjdk.org/browse/JDK-7192189
New SSLException constructors that take cause as a parameter
(cause(原因)をパラメータとして受け取るSSLExceptionの新しいコンストラクタ)
SSLHandshakeException
、SSLKeyException
、SSLPeerUnverifiedException
、SSLProtocolException
の4個のAPIに、原因 (Throwable
) をパラメータとして受け取るAPIに新たなコンストラクタが追加されました。
SSLHandshakeException (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLHandshakeException.html#%3Cinit%3E(java.lang.String,java.lang.Throwable)
SSLKeyException (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLKeyException.html#%3Cinit%3E(java.lang.String,java.lang.Throwable)
SSLPeerUnverifiedException (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLPeerUnverifiedException.html#%3Cinit%3E(java.lang.String,java.lang.Throwable)
SSLProtocolException (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/javax/net/ssl/SSLProtocolException.html#%3Cinit%3E(java.lang.String,java.lang.Throwable)
これにより、initCauseメソッドを個別に呼び出すのに比べて便利になります。
[JDK-8282723] Add constructors taking a cause to JSSE exceptions
https://bugs.openjdk.org/browse/JDK-8282723
Tools
Default digest and signature algorithms strengthened for jarsigner
(jarsigner
のデフォルトのダイジェストアルゴリズム、署名アルゴリズムを強化)
JARファイル署名時にjarsigner
が使うデフォルトのダイジェストおよび署名アルゴリズムが強化されました。デフォルトのダイジェストアルゴリズムはSHA-256からSHA-384に変更されました。624ビットと同じもしくはそれより大きいRSAキーやRSASSA-PSSキー向け署名アルゴリズムのデフォルトはSHA256withRSAからSHA384withRSAに変更されました。ただし、SHA512withRSAが使われる7680ビット以上のキーの場合を除きます。
下表は、jarsignerツールの仕様にある署名アルゴリズムの表です。
The jarsigner Command
https://docs.oracle.com/en/java/javase/19/docs/specs/man/jarsigner.html
[JDK-8267319] Use Larger Default Key Sizes and Algorithms Based on CNSA
https://bugs.openjdk.org/browse/JDK-8267319
RC2 and RC4 added to jdk.security.legacyAlgorithms
security property
(RC2とRC4がjdk.security.legacyAlgorithms
セキュリティプロパティに追加された)
RC2とARCFOUR (RC4) が、java.security
構成ファイルのjdk.security.legacyAlgorithms
セキュリティプロパティに追加されました。これらのアルゴリズムを使うキーはもはや推奨されません。キーストアのシークレットキー・エントリに関連づけられたコマンドで、このアルゴリズムのキーが利用されている場合、keytool
は以下のように警告を発します。
$ keytool -genseckey -keyalg RC2 -keysize 128 -keystore keystore
Enter keystore password:
Generated 128-bit RC2 secret key
Warning:
The generated secret key uses the RC2 algorithm which is considered a security risk.
[JDK-8286090] Add RC2/RC4 to jdk.security.legacyAlgorithms
https://bugs.openjdk.org/browse/JDK-8286090
DES, DESede, and MD5 added to jdk.security.legacyAlgorithms security property
(DES、DESede、MD5がjdk.security.legacyAlgorithms
セキュリティプロパティに追加された)
DES、DESede (3DES)、MD5が、java.security
構成ファイルのjdk.security.legacyAlgorithms
セキュリティプロパティに追加されました。これらのアルゴリズムを使うキーはもはや推奨されません。キーや証明書がこれらのアルゴリズムを使っている場合、keytool
は以下のように警告を発します。
$ keytool -genseckey -keyalg DES -keystore keystore
Enter keystore password:
Generated 56-bit DES secret key
Warning:
The generated secret key uses the DES algorithm which is considered a security risk.
[JDK-8255552] Add DES/3DES/MD5 to jdk.security.legacyAlgorithms
https://bugs.openjdk.org/browse/JDK-8255552
New jarsigner -providerPath
option
(jarsigner
の新たなオプション -providerPath
)
新たな -providerPath
オプションがjarsigner
ツールに追加されました。このオプションを使うとユーザーが代替キーストア実装のクラスパスを指定でき、-providerClass
オプションと組み合わせて使用できます。以下はその例です。
$ jarsigner -keystore keystore -storetype MYKS -providerPath mods/test.myks \
-providerClass org.test.MyProvider signed.jar mykey
Enter keystore password:
jar signed.
[JDK-8281175] Add a -providerPath option to jarsigner
htps://bugs.openjdk.org/browse/JDK-8281175
New Kerberos ktab
options for providing salt values
(ソルト値提供のための新しいKerberos ktab
のオプション)
Windowsのktab
ツールに2つの新しいオプションが追加され、-a
オプションを使ってキーを生成する際に、ユーザーが代替のソルト値を提供できるようになりました。これらのソルト値は、レルムとユーザー名を連結したデフォルトのソルトの代わりに使用されます。-s オプションで、ユーザが独自のソルトを指定できます。また、-f
オプションで、KDCからソルトを取得します。これらのオプションは、KDCが異なるソルト値を使用している場合や、単にユーザーが異なるソルト値を使用したい場合に便利です。
[JDK-8279064] New options for ktab to provide non-default salt
https://bugs.openjdk.org/browse/JDK-8279064
Networking
ネットワークの領域で重要なJDK 19のセキュリティ関連の機能強化で、大きなセキュリティ上のメリットが得られ、特筆すべきものが他に2個あります。
HTTPS Channel Binding support for Java GSS/Kerberos
(Java GSS/KerberosのHTTPチャネルバインディングのサポート)
この機能強化により、javax.net.HttpsURLConnection
を使い、HTTPS上でNegotiate/Kerberos認証を行う TLS チャンネルバインディングのサポートが追加されました。新たなシステムプロパティである jdk.https.negotiate.cbt
の導入により、ユーザーはHttpsURLConnection
がどのチャネルバインディングトークンを使用するか構成できます。
jdk.https.negotiate.cbt
– Networking Properties (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/net/doc-files/net-properties.html#jdk.https.negotiate.cbt
詳細はリリースノートを参照してください。
HTTPS Channel Binding Support for Java GSS/Kerberos (JDK-8279842) – JDK 19 Release Notes
https://jdk.java.net/19/release-notes#JDK-8279842
[JDK-8279842] HTTPS Channel Binding support for Java GSS/Kerberos
https://bugs.openjdk.org/browse/JDK-8279842
Disable http DIGEST mechanism with MD5 and SHA-1 by default
(MD5やSHA-1を使ったhttp DIGESTメカニズムをデフォルトで無効化)
MD5ならびにSHA-1 HTTP DIGESTメカニズムはデフォルトで無効化されています。これらのアルゴリズムはもはや推奨されません。新たなシステムプロパティである http.auth.digest.reEnabledAlgorithms
の導入により、必要であればこれらのメカニズムを再度有効化できますが、自己責任でお願いいたします。
http.auth.digest.reEnabledAlgorithms
– Networking Properties (Java SE 19 & JDK 19)
https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/net/doc-files/net-properties.html#http.auth.digest.reEnabledAlgorithms
[JDK-8281561] Disable http DIGEST mechanism with MD5 and SHA-1 by default
https://bugs.openjdk.org/browse/JDK-8281561