JDK 22 Security Enhancements

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

  1. Crypto
  2. PKI
  3. TLS
  4. XML Signature
  5. Tools

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

AsymmetricKeyjava.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 – G1
CN=emSign Root CA - G1, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN
emSign Root CA – G2
CN=emSign Root CA - G2, O=eMudhra Technologies Limited, OU=emSign PKI, C=IN
emSign ECC Root CA – G3
CN=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 G5
CN=DigiCert TLS RSA4096 Root G5, O="DigiCert, Inc.", C=US
DigiCert TLS ECC P384 Root G5
CN=DigiCert TLS ECC P384 Root G5, O="DigiCert, Inc.", C=US
DigiCert CS RSA4096 Root G5
CN=DigiCert CS RSA4096 Root G5, O="DigiCert, Inc.", C=US
DigiCert CS ECC P384 Root G5
CN=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 X2
CN=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 v2
CN=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 CA
CN=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.maxInboundCertificateChainLengthjdk.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

このリリースでは、jarsignerkeytoolユーティリティにも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:propertiespropertiesで指定されたセキュリティ・プロパティの値を表示
-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

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください