JDK 19 Security Enhancements

原文はこちら。
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

  1. Crypto
  2. PKI
  3. TLS
  4. Tools
  5. Networking

Crypto

Default key sizes increased
(デフォルトのキーサイズ増加)

KeyPairGeneratorKeyGeneratorというJDK実装が生成するキーのデフォルトサイズが以下のように増えています。

アルゴリズムデフォルトのサイズ
RSA
RSASSA-PSS
DH
3072ビット(従来は2048ビット)
EC384ビット(従来は256ビット)
AEScrypto 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-LOCALMACHINEWindows-ROOT-LOCALMACHINEという、2個のKeyStoreタイプが追加されました。これらは、Windows OSに格納されている、全アカウントが利用可能なキーや証明書へのアクセスを可能にするものです。別のWindows KeyStoreタイプであるWindows-MYWindows-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 の getSubjectAlternativeNamesgetIssuerAlternativeNames メソッドの 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

必要であれば、アプリケーションは独自のHostnameVerifierTrustManagerを実装することで、この制限を回避することができます。

[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の新しいコンストラクタ)

SSLHandshakeExceptionSSLKeyExceptionSSLPeerUnverifiedExceptionSSLProtocolExceptionの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

Default Signature Algorithms

[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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中