原文はこちら。
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
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という新しい標準アルゴリズムがKeyFactory
とSignature
のために定義されました。HSS/LMS KeyFactory
とSignature
の実装は、公開鍵と署名検証のみをサポートします。これは、NISTの勧告が、鍵と署名の生成をハードウェア上で行うことを要求しているためです。署名を生成しようとすると、Signature
のinitSign
メソッドはInvalidKeyException
をスローします。秘密鍵を生成しようとすると、KeyFactory
のgeneratePrivate
メソッドで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 Cipher
, Mac
, 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プロバイダが、Cipher
、Mac
、および 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 AlgorithmParameters
、Cipher
、Mac
、および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.timeout | X.509証明書のAuthorityInformationAccess 拡張内の場所から証明書を取得する際の、接続タイムアウト |
com.sun.security.cert.readtimeout | X.509証明書のAuthorityInformationAccess 拡張内の場所から証明書を取得する際の、読み込みタイムアウト |
com.sun.security.ocsp.readtimeout | OCSPを使用して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