JDK 21 Security Enhancements

原文はこちら。
The original article was written by Sean Mullan (Java Security Tech Lead, Oracle).
https://seanjmullan.org/blog/2023/09/22/jdk21

JDK21が2023年9月19日にリリースされました。

JDK 21
https://openjdk.java.net/projects/jdk/21/

以前のブログと同様、今回のリリースで最も興味深く、役に立つと思われるセキュリティ強化点のリストをまとめました。また、各分野で何が変わったのかを見つけやすくするために、適切なカテゴリー(暗号、TLSなど)に分類しました。JDK 21 のリリースノートにも、これらの機能強化やその他の機能強化の詳細が記載されています。

Sean Mullan’s Blog
https://seanjmullan.org/blog/
JDK 21 Release Notes
https://jdk.java.net/21/release-notes

このリリースのハイライトには、KEM(Key Encapsulation Mechanism)の新しいAPIと、HSS/LMS(Hierarchical Signature System (HSS) / Leighton-Micali Signature (LMS))の署名検証実装が含まれています。これらはいずれも、大規模な量子コンピューター攻撃に耐えるために必要なツールをJavaアプリケーションに提供するための、重要な初期要素です。

Table of Contents

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

Crypto

Key Encapsulation Mechanism API

このリリースでは、Key Encapsulation Mechanism(KEM)の新しい標準APIが導入されました(JEP 452で詳しく説明されています)。

JEP 452: Key Encapsulation Mechanism API
https://openjdk.org/jeps/452

KEMとは、公開鍵の特性を利用して、2者間で共有される共通鍵を安全に確立する最新の暗号メカニズムです。KEMの人気は高まっており、ポスト量子暗号(PQC)のために開発される新しいアルゴリズムの重要な構成要素となるでしょう。

JDK には、RFC 9180 で定義されている DHKEM アルゴリズム用の KEM の実装が含まれています。

RFC 9180: Hybrid Public Key Encryption
https://rfc-editor.org/rfc/rfc9180#name-dh-based-kem-dhkem

API の主な新しいクラスは javax.cryto.KEM です。KEM API の説明には、API の使用例が例示されています。

KEM (Java SE 21 & JDK 21)
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/javax/crypto/KEM.html

// Receiver side
var kpg = KeyPairGenerator.getInstance("X25519");
var kp = kpg.generateKeyPair();

// Sender side
var kem1 = KEM.getInstance("DHKEM");
var sender = kem1.newEncapsulator(kp.getPublic());
var encapsulated = sender.encapsulate();
var k1 = encapsulated.key();

// Receiver side
var kem2 = KEM.getInstance("DHKEM");
var receiver = kem2.newDecapsulator(kp.getPrivate());
var k2 = receiver.decapsulate(encapsulated.encapsulation());

assert Arrays.equals(k1.getEncoded(), k2.getEncoded());

JEP: JEP 452 Key Encapsulation Mechanism API
https://openjdk.org/jeps/452

Leighton-Micali Signature (HSS/LMS) verification

SUNプロバイダーは現在、Leighton-Micali Signature (LMS) システムとそのマルチツリー型であるHierarchical Signature System (HSS) の署名検証をサポートしています。

RFC 8554で定義されているHSS/LMSは、ステートフルなハッシュ・ベースの署名システムであり、NISTが量子攻撃に対する保護を提供するために推奨している署名アルゴリズムの1つです。このアルゴリズムは、大規模量子コンピューターによって破られることはないと考えられています。

RFC 8554: Leighton-Micali Hash-Based Signatures
https://www.rfc-editor.org/rfc/rfc8554.html
NIST Special Publication 800-208: Recommendation for Stateful Hash-Based Signature Schemes
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-208.pdf

HSS/LMSという新しい標準アルゴリズムがKeyFactorySignatureのために定義されました。HSS/LMS KeyFactorySignatureの実装は、公開鍵と署名検証のみをサポートします。これは、NISTの勧告が、鍵と署名の生成をハードウェア上で行うことを要求しているためです。署名を生成しようとすると、SignatureinitSignメソッドはInvalidKeyExceptionをスローします。秘密鍵を生成しようとすると、KeyFactorygeneratePrivateメソッドでInvalidKeySpecExceptionがスローされます。

Issue: [JDK-8298127] HSS/LMS Signature Verification
https://bugs.openjdk.org/browse/JDK-8298127

Support for PKCS#11 PBES2 password-based cryptography algorithms

The SunPKCS11 provider now supports PBES2 password-based cryptography algorithms for CipherMac, and SecretKeyFactory. These algorithms use the PKCS#11 standard mechanisms for password-based cryptography. With this enhancement, it is now possible to use the SunPKCS11 provider for integrity and privacy protection with a PKCS12 KeyStore. The list of new algorithms for each service are:

SunPKCS11プロバイダが、CipherMac、および SecretKeyFactoryで PBES2 パスワードベース暗号化アルゴリズムをサポートするようになりました。これらのアルゴリズムは、パスワードベース暗号化用の PKCS#11 標準メカニズムを使用します。この機能拡張により、PKCS12 KeyStoreを使用した完全性とプライバシーの保護にSunPKCS11プロバイダーを使用できるようになりました。各サービスの新しいアルゴリズムの一覧は以下のとおりです。

  • Cipher
    • PBEWithHmacSHA1AndAES_128
    • PBEWithHmacSHA224AndAES_128
    • PBEWithHmacSHA256AndAES_128
    • PBEWithHmacSHA384AndAES_128
    • PBEWithHmacSHA512AndAES_128
    • PBEWithHmacSHA1AndAES_256
    • PBEWithHmacSHA224AndAES_256
    • PBEWithHmacSHA256AndAES_256
    • PBEWithHmacSHA384AndAES_256
    • PBEWithHmacSHA512AndAES_256
  • Mac
    • HmacPBESHA1
  • SecretKeyFactory
    • PBEWithHmacSHA1AndAES_128
    • PBEWithHmacSHA224AndAES_128
    • PBEWithHmacSHA256AndAES_128
    • PBEWithHmacSHA384AndAES_128
    • PBEWithHmacSHA512AndAES_128
    • PBEWithHmacSHA1AndAES_256
    • PBEWithHmacSHA224AndAES_256
    • PBEWithHmacSHA256AndAES_256
    • PBEWithHmacSHA384AndAES_256
    • PBEWithHmacSHA512AndAES_256
    • PBKDF2WithHmacSHA1
    • PBKDF2WithHmacSHA224
    • PBKDF2WithHmacSHA256
    • PBKDF2WithHmacSHA384
    • PBKDF2WithHmacSHA512
    • HmacPBESHA1

PKCS#11 標準メカニズムがまだ定義されていない PBES2 アルゴリズムのサポートも追加されました。

  • Mac
    • HmacPBESHA224
    • HmacPBESHA256
    • HmacPBESHA384
    • HmacPBESHA512
  • SecretKeyFactory
    • HmacPBESHA224
    • HmacPBESHA256
    • HmacPBESHA384
    • HmacPBESHA512

Issue: [JDK-8301553] Support Password-Based Cryptography in SunPKCS11
https://bugs.openjdk.org/browse/JDK-8301553

Support for PBES2 Cipher and Mac algorithms with SHA-512/224 and SHA-512/256 digests

SunJCEプロバイダが、SHA-512/224およびSHA-512/256ダイジェストのPBES2 AlgorithmParametersCipherMac、およびSecretKeyFactoryアルゴリズムに対応しました。各サービスの新しいアルゴリズムのリストは以下の通りです。

  • AlgorithmParameters
    • PBEWithHmacSHA512/224AndAES_128
    • PBEWithHmacSHA512/256AndAES_128
    • PBEWithHmacSHA512/224AndAES_256
    • PBEWithHmacSHA512/256AndAES_256
  • Cipher
    • PBEWithHmacSHA512/224AndAES_128
    • PBEWithHmacSHA512/256AndAES_128
    • PBEWithHmacSHA512/224AndAES_256
    • PBEWithHmacSHA512/256AndAES_256
  • Mac
    • PBEWithHmacSHA512/224
    • PBEWithHmacSHA512/256
  • SecretKeyFactory
    • PBEWithHmacSHA512/224AndAES_128
    • PBEWithHmacSHA512/256AndAES_128
    • PBEWithHmacSHA512/224AndAES_256
    • PBEWithHmacSHA512/256AndAES_256
    • PBKDF2WithHmacSHA512/224
    • PBKDF2WithHmacSHA512/256

Issue: [JDK-8288050] Add support of SHA-512/224 and SHA-512/256 to the PBKDF2 and PBES2 impls in SunJCE provider
https://bugs.openjdk.org/browse/JDK-8288050

PKI

Enhanced OCSP, certificate, and CRL fetch timeouts

証明書やCRLの取得、OCSPに関連するネットワーク接続の接続タイムアウトや読み取りタイムアウトを制御できるシステムプロパティが追加されました。

プロパティ説明
com.sun.security.cert.timeoutX.509証明書のAuthorityInformationAccess拡張内の場所から証明書を取得する際の、接続タイムアウト
com.sun.security.cert.readtimeoutX.509証明書のAuthorityInformationAccess拡張内の場所から証明書を取得する際の、読み込みタイムアウト
com.sun.security.ocsp.readtimeoutOCSPを使用してX.509証明書の失効ステータスを確認する際の、読み込みタイムアウト

これらの新しいプロパティには柔軟な構文があり、タイムアウト値を秒またはミリ秒で指定できます。さらに、既存のプロパティ

  • com.sun.security.ocsp.timeout
  • com.sun.security.crl.timeout
  • com.sun.security.crl.readtimeout

も、この構文を使用できるように拡張されました (従来は秒単位のみ)。この構文では、タイムアウトをミリ秒単位で指定する場合はmsで終わる10進整数値で、秒単位で指定する場合は10進整数値あるいはsで終わる10進整数値で指定します。以下はcom.sun.security.cert.timeoutプロパティに100ミリ秒と指定する例です。

java -Dcom.sun.security.cert.timeout=100ms ...

もう一つは、com.sun.security.cert.timeoutプロパティに2秒を設定する例です。

java -Dcom.sun.security.cert.timeout=2s ...

Issue: [JDK-8179502] Enhance OCSP, CRL and Certificate Fetch Timeouts
https://bugs.openjdk.org/browse/JDK-8179502

New root CA certificates

新しいルートCA証明書がcacertsキーストアに追加されています。

Google Trust Services (GTS) root CA証明書 (4個)
Distinguished name
GTS Root R1
https://crt.sh/?id=3263026969
CN=GTS Root R1, O=Google Trust Services LLC, C=US
GTS Root R2
https://crt.sh/?id=3448820660
CN=GTS Root R2, O=Google Trust Services LLC, C=US
GTS Root R3
https://crt.sh/?id=3448822382
CN=GTS Root R3, O=Google Trust Services LLC, C=US
GTS Root R4
https://crt.sh/?id=3263026968
CN=GTS Root R4, O=Google Trust Services LLC, C=US

これらのルート証明書は、Oracle JDK 20.0.2、17.0.8、11.0.20、8u381、および7u391リリースのcacertsキーストアにも追加されています。

Issue: [JDK-8307134] Add GTS root CAs
https://bugs.openjdk.org/browse/JDK-8307134

TWCA Global Root CA
Distinguished name
TWCA Global Root CA
https://crt.sh/?id=8559119
CN=TWCA Global Root CA, OU=Root CA, O=TAIWAN-CA, C=TW

このルート証明書は、Oracle JDK 20.0.2、17.0.8、11.0.20、8u381、および7u391リリースのcacertsキーストアにも追加されています。

Issue: [JDK-8305975] Add TWCA Global Root CA
https://bugs.openjdk.org/browse/JDK-8305975

Microsoft root CA証明書 (2個)
Distinguished name
Microsoft ECC Root CA 2017
https://crt.sh/?id=2565145421
CN=Microsoft ECC Root Certificate Authority 2017, O=Microsoft Corporation, C=US
Microsoft RSA Root CA 2017
https://crt.sh/?id=2565151295
CN=Microsoft RSA Root Certificate Authority 2017, O=Microsoft Corporation, C=US

これらのルート証明書は、Oracle JDK 20.0.2、17.0.8、11.0.20、8u381、および7u391リリースのcacertsキーストアにも追加されています。

Issue: [JDK-8304760] Add 2 Microsoft TLS roots
https://bugs.openjdk.org/browse/JDK-8304760

Certigna Root CA
Distinguished name
Certigna Root CA
https://crt.sh/?id=8559119
CN=Certigna, O=Dhimyotis, C=FR

このルート証明書は、Oracle JDK 20.0.1、17.0.7、11.0.19、8u371、および7u381リリースのcacertsキーストアにも追加されています。

Issue: [JDK-8245654] Add Certigna Root CA
https://bugs.openjdk.org/browse/JDK-8245654

TLS

The default Diffie-Hellman group size has been increased from 1024 bits to 2048 bits

TLS 1.0/1.1/1.2のJDK実装では、TLS_DHE 暗号スイートをネゴシエートし、 クライアントまたはサーバーがより強力な鍵サイズをネゴシエートするために使用できる FFDHEをサポートしていない場合、デフォルトのDiffie Hellman鍵サイズとして2048 ビットを使用するようになりました。JDKのTLS実装はFFDHEをサポートしており、デフォルトで有効になっていますが、JDKがTLSセッションをネゴシエートしている相手は、FFDHEをサポートしていない可能性があります。

回避策として、ユーザーはjdk.tls.ephemeralDHKeySizeシステムプロパティを1024に設定することで、以前のサイズに戻すことができますが、これは推奨されていません。そのため、自己責任で行ってください。また、この変更はTLS 1.0および1.1にも適用されますが、これらのプロトコルはもはや推奨されておらず、デフォルトで無効になっています。

DHグループの最小サイズはすでに2048ビットなので、この変更はTLS 1.3には影響しません。

この変更はJava Cryptographic Roadmapにも記載されており、Oracleの2023年10月のJDKリリース(21u、17u、11u、8u)を目標としています(訳注:2023/10のCPUでリリース済み)。

Oracle JRE and JDK Cryptographic Roadmap
https://www.java.com/en/jre-jdk-cryptoroadmap.html

Issue: [JDK-8301700] Increase the default TLS Diffie-Hellman group size from 1024-bit to 2048-bit
https://bugs.openjdk.org/browse/JDK-8301700

XML Signature

Support for the EdDSA signature algorithm

JDKのXML Signature (XML署名) 実装がEdwards-Curve Digital Signature Algorithm (EdDSA) をサポートするようになり、XML署名がEdDSAアルゴリズムで署名や検証ができるようになりました。

EdDSA
https://en.wikipedia.org/wiki/EdDSA

2個の新しい標準SignatureMethod URIも追加されています。

SignatureMethod.ED25519
https://docs.oracle.com/en/java/javase/21/docs/api/java.xml.crypto/javax/xml/crypto/dsig/SignatureMethod.html#ED25519

SignatureMethod.ED448
https://docs.oracle.com/en/java/javase/21/docs/api/java.xml.crypto/javax/xml/crypto/dsig/SignatureMethod.html#ED448

Issue: [JDK-8305972] Update XML Security for Java to 3.0.2
https://bugs.openjdk.org/browse/JDK-8305972

New system property to toggle XML Signature secure validation mode

org.jcp.xml.dsig.secureValidationという新しいシステム・プロパティが追加されました。

DOMValidateContext (Java SE 21 & JDK 21)
https://docs.oracle.com/en/java/javase/21/docs/api/java.xml.crypto/javax/xml/crypto/dsig/dom/DOMValidateContext.html#org.jcp.xml.dsig.secureValidation

これを使うと、XML署名のセキュア処理モードをより簡単に有効または無効にできます。このプロパティをtrueに設定すると有効、falseに設定すると無効になります。

セキュア処理モードはデフォルトで有効になっており、XML署名における弱いアルゴリズムやその他の潜在的に安全でない構造を制限することで、さらなるセキュリティを提供することに注意してください。詳細については、java.securityファイルのjdk.xml.dsig.secureValidationPolicyセキュリティプロパティを参照してください。

弱いアルゴリズムを使用するレガシー署名を検証する場合などでセキュア処理モードを無効にする必要がある場合もありますが、一般的にセキュア処理モードを無効にすることは推奨されませんので、自己責任で行ってください。

Issue: [JDK-8301260] Add system property to toggle XML Signature secure validation mode
https://bugs.openjdk.org/browse/JDK-8301260

New security property to enable or disable support for the here() function

here()関数は、W3C Recommendation for XML Signature で定義されているXPath関数で、XPath変換で使用するノードセットを選択するのに役立ちます。

XML Signature Syntax and Processing Version 1.1
https://w3.org/TR/xmldsig-core1/#function-here

しかし、here()関数は標準の XPath関数ではなく、標準の Java XPath API ではサポートされていません。また、here()関数をサポートするには、Xalan内部 APIへの実装固有の依存が必要です。最終的には、この関数のサポートをデフォルトで無効にする予定です。

このリリースでは、jdk.xml.dsig.hereFunctionSupportedという新しいセキュリティ・プロパティを追加し、そのデフォルト値をtrueに設定しました(つまり、here()関数はデフォルトでサポートされています)。ぜひこのプロパティをfalseにして、アプリケーションに何か問題が起こらないかをテストしてください。

Issue: [JDK-8305972] Update XML Security for Java to 3.0.2
https://bugs.openjdk.org/browse/JDK-8305972

Tools

keytool now warns if weak PBE algorithms are used

keytoolユーティリティは、弱いパスワードベース暗号 (password-based encryption, PBE) アルゴリズムを-genseckey-importpassで指定していると、警告を発するようになりました。以下は弱いPBEアルゴリズムとともにkeytool -genseckeyを使った場合に出る警告の例です(このケースではPBEwithMD5andDESをキー生成アルゴリズムとして指定しています)。

$ keytool -genseckey -keystore ks -keyalg PBEwithMD5andDES
Enter keystore password:  
Enter the password to be stored:  
Re-enter password: 

Warning:
The generated secret key uses the PBEwithMD5andDES algorithm which is considered a security risk.

Issue: [JDK-8286907] keytool should warn about weak PBE algorithms
https://bugs.openjdk.org/browse/JDK-8286907

The jarsigner -altsigner and -altsignerpath options are removed

jarsignerユーティリティから-altsigner-altsignerpathの両オプションが削除されています。com.sun.jarsigner.ContentSignerおよびcom.sun.jarsigner.ContentSignerParameters APIはこれらのオプションに依存していますが、これらも同様に削除されました。これらのAPIは元々JDK 9でdeprecated (廃止対象) で、JDK 15で削除マークがついていました。代替のAPIとしてJarSignerがあり、これはずっと強力なのでこちらを利用することを推奨いたします。

JarSigner (Java SE 15 & JDK 15)
https://docs.oracle.com/en/java/javase/15/docs/api/jdk.jartool/jdk/security/jarsigner/JarSigner.html

jarsignerにこれらのオプションをつけて実行すると以下のエラーが発生します(以下のケースは-altsignerをつけています)。

$ jarsigner -altsigner
Illegal option: -altsigner

Please type jarsigner --help for usage

Issue: [JDK-8303410] Remove ContentSigner APIs and jarsigner -altsigner and -altsignerpath options
https://bugs.openjdk.org/browse/JDK-8303410

コメントを残す

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