原文はこちら。
The original article was written by Sean Mullan (Java Security Tech Lead, Oracle).
https://seanjmullan.org/blog/2024/03/20/jdk22
JDK 22が2024年3月19日にリリースされました!以前のブログと同様、今回のリリースで最も興味深く、役に立つと思われるセキュリティ強化点のリストをまとめました。また、それらを適切なカテゴリ(暗号、TLSなど)にグループ分けしましたので、各特定分野で何が変更されたかを簡単に見つけることができるはずです。JDK 22 のリリースノートには、これらの機能強化やその他の機能強化の詳細も記載されています。
JDK 22
https://openjdk.java.net/projects/jdk/22/
Sean Mullan’s Blog
https://seanjmullan.org/blog/
JDK 22 Release Notes
https://jdk.java.net/22/release-notes
このリリースのハイライトは、java -XshowSettings
オプションの新しいセキュリティ・カテゴリと、いくつかの新しいルートCA 証明書です。
Table of Contents
Crypto
New java.security.AsymmetricKey interface (JDK-8318096)
[JDK-8318096] Introduce AsymmetricKey interface with a getParams method
https://bugs.openjdk.org/browse/JDK-8318096
java.security.AsymmetricKey
という新しい標準インターフェースが追加されました。
Interface AsymmetricKey
https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/security/AsymmetricKey.html
AsymmetricKey
はjava.security.Key
のサブインタフェースで、秘密鍵または公開鍵の非対称鍵を表します。既存のjava.security.PublicKey
およびjava.security.PrivateKey
クラスは、AsymmetricKey のサブインタフェースに改修されました。
AsymmetricKey
インターフェイスは、null
を返すgetParams
メソッドのデフォルト実装を提供します。
すべての非対称キーのサブクラスにgetParams
メソッドが追加されました。これには主に 2 つの利点があります。
- アプリケーションコードは、
instanceof
を使って最初にサブクラスを決定しなくても、公開鍵や秘密鍵からパラメータを取得できます。 - 多くの非対称アルゴリズム・パラメータは、既存の
NamedParameterSpec
サブクラスを用いて表現できます。将来、非対称アルゴリズムが導入された場合、AsymmetricKey
インターフェイスを使用して、(新アルゴリズムが導入されていない)以前のバージョンのJava SEでは、NamedParameterSpec
としてパラメータを表現可能な新しい非対称アルゴリズムをより簡単にサポートできるようになり、新しいアルゴリズム固有のAlgorithmParameterSpec
APIを導入する必要がなくなります。
Class NamedParameterSpec
https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/security/spec/NamedParameterSpec.html
The jdk.crypto.ec module has been subsumed into java.base (JDK-8308398)
[JDK-8308398] Move SunEC crypto provider into java.base
https://bugs.openjdk.org/browse/JDK-8308398
jdk.crypto.ec
モジュールは現在非推奨となっており、最終的には削除される予定です。jdk.crypto.ec
モジュールのコードはすべてjava.base
モジュールに移動されました。これには、SunECセキュリティプロバイダも含まれます。jdk.crypto.ec
モジュールはまだ存在しますが、現在は空です。
この変更により、楕円曲線暗号アルゴリズムに依存するアプリケーションのデプロイが容易になります。
PKI
New root CA certificates
以下の新しいルートCA証明書がcacerts
キーストアに追加されました。これらのルート証明書はそれぞれ、Oracle JDK 21.0.2、17.0.10、11.0.22、8u401、および7u411リリースのcacertsキーストアにも追加されています。
[JDK-8319187] Add three eMudhra emSign roots
https://bugs.openjdk.org/browse/JDK-8319187
emSign Root CA – G1CN=emSign Root CA - G1, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN |
emSign Root CA – G2CN=emSign Root CA - G2, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN |
emSign ECC Root CA – G3CN=emSign ECC Root CA - G3, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN |
[JDK-8318759] Add four DigiCert root certificates
https://bugs.openjdk.org/browse/JDK-8318759
DigiCert TLS RSA4096 Root G5CN=DigiCert TLS RSA4096 Root G5, O="DigiCert, Inc.", C=US |
DigiCert TLS ECC P384 Root G5CN=DigiCert TLS ECC P384 Root G5, O="DigiCert, Inc.", C=US |
DigiCert CS RSA4096 Root G5CN=DigiCert CS RSA4096 Root G5, O="DigiCert, Inc.", C=US |
DigiCert CS ECC P384 Root G5CN=DigiCert CS ECC P384 Root G5, O="DigiCert, Inc.", C=US |
[JDK-8317374] Add Let’s Encrypt ISRG Root X2
https://bugs.openjdk.org/browse/JDK-8317374
Let’s Encrypt ISRG Root X2CN=ISRG Root X2, O=Internet Security Research Group, C=US |
[JDK-8317373] Add Telia Root CA v2
https://bugs.openjdk.org/browse/JDK-8317373
Telia Root CA v2CN=Telia Root CA v2, O=Telia Finland Oyj, C=FI |
[JDK-8314960] Add Certigna Root CA – 2
https://bugs.openjdk.org/browse/JDK-8314960
Certigna Root CACN=Certigna Root CA, OU=0002 48146308100036, O=Dhimyotis, C=FR |
TLS
Additional system properties to control maximum length of client and server certificate chains (JDK-8311596)
[JDK-8311596] Add separate system properties for TLS server and client for maximum chain length
https://bugs.openjdk.org/browse/JDK-8311596
jdk.tls.client.maxInboundCertificateChainLength
とjdk.tls.server.maxInboundCertificateChainLength
というシステム・プロパティが追加され、TLS サーバおよびクライアント証明書チェーンの最大長を制御できるようになりました。これらのプロパティは、クライアントとサーバーの設定用に別々のプロパティを持っており、柔軟に設定できます。
クライアント側でサーバーの証明書チェーンの最大サイズを制御したい場合、 jdk.tls.client.maxInboundCertificateChainLength
に整数値を設定します。以下はその例です。
$ java -Djdk.tls.client.maxInboundCertificateChainLength=7 ...
サーバー側でクライアントの証明書チェーンの最大サイズを制御したい場合、 jdk.tls.server.maxInboundCertificateChainLength
に整数値を設定します。以下はその例です。
$ java -Djdk.tls.server.maxInboundCertificateChainLength=5 ...
これらのプロパティを設定すると、既存のjdk.tls.maxCertificateChainLength
システムプロパティがオーバーライドされます。プロパティが設定されていない場合、サーバ証明書チェーンにはデフォルトの10が使用され、クライアント証明書チェーンには8が使用されます。
XML Signature
Support for SHA-3 based RSA signature algorithms (JDK-8319124)
[JDK-8319124] Update XML Security for Java to 3.0.3
https://bugs.openjdk.org/browse/JDK-8319124
JDKのXML署名実装が、SHA-3ダイジェストを使用したRSA署名アルゴリズムで署名されたXML署名をサポートするようになりました。また、4つの新しい標準SignatureMethod
URIが追加されました。
SignatureMethod.SHA3_224_RSA_MGF1 SHA3-224とMGF1を使うRSA署名アルゴリズム |
SignatureMethod.SHA3_256_RSA_MGF1 SHA3-256とMGF1を使うRSA署名アルゴリズム |
SignatureMethod.SHA3_384_RSA_MGF1 SHA3-384とMGF1を使うRSA署名アルゴリズム |
SignatureMethod.SHA3_512_RSA_MGF1 SHA3-512とMGF1を使うRSA署名アルゴリズム |
Tools
keytool and jarsigner support for the HSS/LMS signature algorithm (JDK-8302233)
[JDK-8302233] HSS/LMS: keytool and jarsigner changes
https://bugs.openjdk.org/browse/JDK-8302233
JDK 21でHSS/LMS署名アルゴリズムのJCEサポートを追加しました(詳細は JDK 21のときのエントリを参照)。
JDK 21 Security Enhancements
https://seanjmullan.org/blog/2023/09/22/jdk21#crypto
https://logico-jp.io/2023/12/08/jdk-21-security-enhancements/#crypto
このリリースでは、jarsigner
とkeytool
ユーティリティにもHSS/LMSサポートを追加し、機能を拡張しました。
jarsigner
は、HSS/LMSアルゴリズムによるJARファイルの署名と検証をサポートするようになりました。keytool
は、HSS/LMS公開鍵のキーペアの生成をサポートするようになりました。
JDKはHSS/LMS署名検証のみサポートするため、HSS/LMSでJARファイルに署名するには、署名をサポートするサードパーティプロバイダを使用する必要があることに注意してください。同様に、キーペアを生成するには、HSS/LMSキーペアの生成をサポートするサードパーティプロバイダを使用する必要があります。
以下はkeytool
でHSS/LMSキーペアを生成する例です。
$ keytool -genkeypair -alias Duke -dname CN="Duke" -keystore <keystore> -keyalg HSS/LMS \
-groupname LMS_SHA256_M24_H5,LMOTS_SHA256_N24_W1,LMS_SHA256_M24_H5,LMOTS_SHA256_N24_W1
この例では、上記のコマンドで指定されたグループ名を持つHSS/LMSキーペアを生成しています。また、HSS/LMSキーペアの生成をサポートするサードパーティのJCEプロバイダを指定するために、追加のオプションを指定する必要がある場合があります。
以下はjarsigner
を使用してHSS/LMSでJARに署名する例です。
$ jarsigner -keystore <keystore> -sigalg HSS/LMS <jarfile> Duke
この例では、HSS/LMS署名アルゴリズムで、指定された鍵ストアに “Duke” というエイリアス名で保存されている秘密鍵を使ってJARファイルに署名しています。また、HSS/LMS 署名をサポートするサードパーティJCEプロバイダを指定するために、追加のオプションを指定する必要がある場合があります。また、デフォルトでは秘密鍵のアルゴリズムに基づいて決定されるため、-sigalg
オプションを指定する必要はないことに注意してください。
New security category for the java -XshowSettings option (JDK-8281658)
[JDK-8281658] Add a security category to the java -XshowSettings
option
https://bugs.openjdk.org/browse/JDK-8281658
java -XshowSettings
オプションを使用すると、システムプロパティやVM設定など、現在のJDK設定に関する有用な情報を表示できます。JDK 22ではこのオプションが強化され、セキュリティ関連の設定の詳細が表示されるようになりました。新しいオプションの構文は次のとおりです。
-XshowSetttings:security | すべてのセキュリティ設定を表示 |
-XshowSetttings:security:properties | properties で指定されたセキュリティ・プロパティの値を表示 |
-XshowSetttings:security:providers | インストールされているセキュリティ・プロバイダとサポートされているアルゴリズムを表示 |
-XshowSetttings:security:tls | 有効なTLSプロトコルと暗号スイートを表示 |
以下は、これらの各オプションを表示する例です。
$ java -XshowSettings:security:properties
Security properties:
crypto.policy=unlimited
http.auth.digest.disabledAlgorithms=MD5, SHA-1
jceks.key.serialFilter=
java.base/java.lang.Enum;
java.base/java.security.KeyRep;
java.base/java.security.KeyRep$Type;
java.base/javax.crypto.spec.SecretKeySpec;
!*
jdk.certpath.disabledAlgorithms=
MD2,
MD5,
SHA1 jdkCA & usage TLSServer,
RSA keySize < 1024,
DSA keySize < 1024,
EC keySize < 224,
SHA1 usage SignedJAR & denyAfter 2019-01-01
jdk.io.permissionsUseCanonicalPath=false
jdk.jar.disabledAlgorithms=
MD2,
MD5,
RSA keySize < 1024,
DSA keySize < 1024,
SHA1 denyAfter 2019-01-01
jdk.sasl.disabledMechanisms=
jdk.security.caDistrustPolicies=SYMANTEC_TLS
jdk.security.legacyAlgorithms=
SHA1,
RSA keySize < 2048,
DSA keySize < 2048,
DES,
DESede,
MD5,
RC2,
ARCFOUR
jdk.tls.alpnCharset=ISO_8859_1
jdk.tls.disabledAlgorithms=
SSLv3,
TLSv1,
TLSv1.1,
DTLSv1.0,
RC4,
DES,
MD5withRSA,
DH keySize < 1024,
EC keySize < 224,
3DES_EDE_CBC,
anon,
NULL,
ECDH
...
$ java -XshowSettings:security:providers
Security provider static configuration: (in order of preference)
----------------------------------------
Provider name: SUN
Provider information: SUN (DSA key/parameter generation; DSA signing;
SHA-1, MD5 digests; SecureRandom; X.509 certificates; PKCS12, JKS &
DKS keystores; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP,
Collection CertStores, JavaPolicy Policy; JavaLoginConfig
Configuration)
Provider services: (type : algorithm)
AlgorithmParameterGenerator.DSA
aliases: [OID.1.2.840.10040.4.1, 1.3.14.3.2.12, 1.2.840.10040.4.1]
AlgorithmParameters.DSA
aliases: [OID.1.2.840.10040.4.1, 1.3.14.3.2.12, 1.2.840.10040.4.1]
CertPathBuilder.PKIX
CertPathValidator.PKIX
CertStore.Collection
CertStore.com.sun.security.IndexedCollection
CertificateFactory.X.509
aliases: [X509]
Configuration.JavaLoginConfig
KeyFactory.DSA
aliases: [1.3.14.3.2.12, 1.2.840.10040.4.1, OID.1.2.840.10040.4.1]
KeyFactory.HSS/LMS
aliases: [OID.1.2.840.113549.1.9.16.3.17,
1.2.840.113549.1.9.16.3.17]
KeyPairGenerator.DSA
aliases: [1.2.840.10040.4.1, OID.1.2.840.10040.4.1, 1.3.14.3.2.12]
KeyStore.CaseExactJKS
KeyStore.DKS
KeyStore.JKS
KeyStore.PKCS12
MessageDigest.MD2
aliases: [OID.1.2.840.113549.2.2, 1.2.840.113549.2.2]
MessageDigest.MD5
aliases: [OID.1.2.840.113549.2.5, 1.2.840.113549.2.5]
MessageDigest.SHA-1
aliases: [SHA1, SHA, 1.3.14.3.2.26, OID.1.3.14.3.2.26]
MessageDigest.SHA-224
aliases: [OID.2.16.840.1.101.3.4.2.4, SHA224,
2.16.840.1.101.3.4.2.4]
MessageDigest.SHA-256
aliases: [SHA256, OID.2.16.840.1.101.3.4.2.1,
2.16.840.1.101.3.4.2.1]
MessageDigest.SHA-384
aliases: [OID.2.16.840.1.101.3.4.2.2, SHA384,
2.16.840.1.101.3.4.2.2]
MessageDigest.SHA-512
aliases: [OID.2.16.840.1.101.3.4.2.3, 2.16.840.1.101.3.4.2.3,
SHA512]
MessageDigest.SHA-512/224
aliases: [SHA512/224, OID.2.16.840.1.101.3.4.2.5,
2.16.840.1.101.3.4.2.5]
MessageDigest.SHA-512/256
aliases: [SHA512/256, OID.2.16.840.1.101.3.4.2.6,
2.16.840.1.101.3.4.2.6]
MessageDigest.SHA3-224
aliases: [OID.2.16.840.1.101.3.4.2.7, 2.16.840.1.101.3.4.2.7]
MessageDigest.SHA3-256
aliases: [OID.2.16.840.1.101.3.4.2.8, 2.16.840.1.101.3.4.2.8]
MessageDigest.SHA3-384
aliases: [OID.2.16.840.1.101.3.4.2.9, 2.16.840.1.101.3.4.2.9]
MessageDigest.SHA3-512
aliases: [2.16.840.1.101.3.4.2.10, OID.2.16.840.1.101.3.4.2.10]
SecureRandom.DRBG
SecureRandom.NativePRNG
SecureRandom.NativePRNGBlocking
SecureRandom.NativePRNGNonBlocking
SecureRandom.SHA1PRNG
Signature.HSS/LMS
aliases: [1.2.840.113549.1.9.16.3.17,
OID.1.2.840.113549.1.9.16.3.17]
Signature.NONEwithDSA
aliases: [RawDSA]
Signature.NONEwithDSAinP1363Format
Signature.SHA1withDSA
aliases: [DSS, 1.3.14.3.2.13, OID.1.2.840.10040.4.3, SHA1/DSA, DSA,
SHA-1/DSA, SHAwithDSA, DSAWithSHA1, SHA/DSA, 1.2.840.10040.4.3,
1.3.14.3.2.27]
Signature.SHA1withDSAinP1363Format
Signature.SHA224withDSA
aliases: [2.16.840.1.101.3.4.3.1, OID.2.16.840.1.101.3.4.3.1]
Signature.SHA224withDSAinP1363Format
Signature.SHA256withDSA
aliases: [2.16.840.1.101.3.4.3.2, OID.2.16.840.1.101.3.4.3.2]
Signature.SHA256withDSAinP1363Format
Signature.SHA3-224withDSA
aliases: [2.16.840.1.101.3.4.3.5, OID.2.16.840.1.101.3.4.3.5]
Signature.SHA3-224withDSAinP1363Format
Signature.SHA3-256withDSA
aliases: [2.16.840.1.101.3.4.3.6, OID.2.16.840.1.101.3.4.3.6]
Signature.SHA3-256withDSAinP1363Format
Signature.SHA3-384withDSA
aliases: [2.16.840.1.101.3.4.3.7, OID.2.16.840.1.101.3.4.3.7]
Signature.SHA3-384withDSAinP1363Format
Signature.SHA3-512withDSA
aliases: [2.16.840.1.101.3.4.3.8, OID.2.16.840.1.101.3.4.3.8]
Signature.SHA3-512withDSAinP1363Format
Signature.SHA384withDSA
aliases: [2.16.840.1.101.3.4.3.3, OID.2.16.840.1.101.3.4.3.3]
Signature.SHA384withDSAinP1363Format
Signature.SHA512withDSA
aliases: [2.16.840.1.101.3.4.3.4, OID.2.16.840.1.101.3.4.3.4]
Signature.SHA512withDSAinP1363Format
...
$ java -XshowSettings:security:tls
Security TLS configuration (SunJSSE provider):
Enabled Protocols:
TLSv1.3
TLSv1.2
Enabled Cipher Suites:
TLS_AES_256_GCM_SHA384
TLS_AES_128_GCM_SHA256
TLS_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_DSS_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_EMPTY_RENEGOTIATION_INFO_SCSV