JDK 27 Security Enhancements

原文はこちら。
The original article was written by Sean Mullan (Technical Lead of the Java Security Libraries Team at Oracle).
https://seanjmullan.org/blog/2026/09/15/jdk27

JDK 27が2026年9月15日にリリースされました!

これまでのブログ記事と同様に、今回のリリースにおいて私が最も興味深く、有用だと考えるセキュリティ機能強化の一覧をまとめました。

Sean Mullan’s Blog

また、それらを適切なカテゴリ(暗号、TLSなど)に分類しましたので、各分野でどのような変更があったかを把握しやすくなっているはずです。JDK 27のリリースノートには、これらの機能強化やその他の機能強化に関する詳細も記載されています。

JDK 27 Early-Access Release Notes (このWebページのタイトルが2026/09/23現在変更されていないため、Early-Accessが残っています)

今回のリリースのハイライトには、ポスト量子ハイブリッド鍵交換メカニズムに対するTLS 1.3のサポートや、PEM APIの3回目のプレビュー版が含まれます。

JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3
JEP 538: PEM Encodings of Cryptographic Objects (Third Preview)

Table of Contents

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

Crypto

JEP 538: PEM Encodings of Cryptographic Objects (Third Preview)

JDK 27には、JEP 538で定義されたPEM形式への暗号オブジェクトのエンコードおよびPEM形式からのデコードを行うAPIの第3プレビューが含まれています。PEMは、証明書、CRL、秘密鍵など、DERエンコードされた暗号データの転送や保存に広く使用されている形式です。これは、数年前に実施されたJCEアンケートにおいて、最も多く要望のあった機能の一つでした。JEP 538の履歴には、Second Preview以降の変更点のリストが記載されています。主なAPIは2つあり、暗号オブジェクトをPEM形式にエンコードするためのPEMEncoderクラスと、PEMデータを暗号オブジェクトにデコードするためのPEMDecoderクラスです。

PEMEncoder (Java SE 27 & JDK 27)
PEMDecoder (Java SE 27 & JDK 27)

このバージョンでは、DEREncodableインターフェースが、その用途をより適切に反映し、DERエンコーディングに限定されないことを明確にするため、BinaryEncodableに名称変更されました。

BinaryEncodable (Java SE 27 & JDK 27)

X509CertificateX509CRLなどの既存のクラスは、このインターフェースを実装するように改修されており、これによりこれらのオブジェクトをPEM形式へ、またはPEM形式からエンコード/デコードすることが容易になりました。PEMEncoder暗号化用に設定することもでき、これにより秘密鍵の暗号化とエンコードを1つの手順で簡単に行うことができます。同様に、PEMDecoder復号用に設定することができ、秘密鍵のデコードと復号を1つの手順で行うことが可能になります。より高度な使用法として、既存のEncryptedPrivateKeyInfoクラスが拡張され、秘密鍵の暗号化および復号を容易にするいくつかの新しいメソッドが追加されました。

EncryptedPrivateKeyInfo (Java SE 27 & JDK 27)

以下は、KeyStoreから取得したX509Certificateを PEM にエンコードする例です。

    X509Certificate cert = (X509Certificate)keystore.getCertificate("mycert");
    PEMEncoder encoder = PEMEncoder.of();
    String pem = encoder.encodeToString(cert);

以下はPEMをX509Certificateにデコードする例です。

    PEMDecoder decoder = PEMDecoder.of();
    X509Certificate cert = decoder.decode(pem, X509Certificate.class);

以下は、PrivateKeyをパスワードで暗号化し、PEM形式にエンコードする2つの例を示します。この例では、暗号化が設定されたPEMEncoderを使用しています。

    PEMEncoder encoderWithEncryption = PEMEncoder.of().withEncryption(password);
    String pem = encoderWithEncryption.encodeToString(privateKey);

上記の例では、暗号化時にデフォルトのパラメータを使用しています。2つ目の例では、EncryptedPrivateKeyInfoクラスを使用し、パスワードベースの暗号化アルゴリズムなどの追加パラメータを指定して秘密鍵を暗号化し、その後PEM形式にエンコードしています。

    EncryptedPrivateKeyInfo epki =
        EncryptedPrivateKeyInfo.encrypt(privateKey, password, "PBEWithHmacSHA256AndAES_256", null, null);
    String pem = PEMEncoder.of().encodeToString(epki);

[JDK-8369917] LMS/HSS RFC 9858 Support

HSS/LMS 署名アルゴリズムの実装では、RFC 8554で定義されているものに加え、RFC 9858で定義されている追加のパラメータセットがサポートされるようになりました。

RFC 8554 – Leighton-Micali Hash-Based Signatures
RFC 9858 – Additional Parameter Sets for HSS/LMS Hash-Based Signatures

このRFCでは、SHA-256/192(出力切り捨て)およびSHAKEベースのハッシュ関数(SHAKE256/256およびSHAKE256/192)を使用するLMS/HSS向けの新しいパラメータセットが導入されています。これらの新しいパラメータセットを使用すると、より小さな署名を生成できます。なお、HSS/LMS の KeyFactory および Signature 実装は、公開鍵と署名の検証のみをサポートしています。

[JDK-8374808] Add new methods to KeyStore and KeyStoreSpi that return the creation date as an Instant instead of Date

KeyStoreおよびKeyStoreSpi API に、キーストアのエイリアスが作成された日付を Instant オブジェクトとして返す 2 つの新しいメソッドが追加されました。これらのメソッドは、作成日時をDateオブジェクトとして返すメソッドの代わりに使用できます。Instantはimmutableであり、java.timeパッケージ内の他のAPIと容易に連携できるようになりました。新しいメソッドは以下の通りです。

Various Performance Improvements

SHA-3、ML-KEM、ML-DSA、および楕円曲線(X25519、Ed25519)アルゴリズムに対して、数多くの重要なパフォーマンス改善が行われました。詳細については、以下のリリースノートを参照してください。

[JDK-8386238] Release Note: Significant Performance Gains in ML-KEM and ML-DSA Algorithms
[JDK-8381393] Release Note: Significant Performance Gains in X25519 Key Agreement and Ed25519 Signature Algorithms

Shawn Emery氏は、JDK 27で行われたCurve25519の改善に関する詳細とパフォーマンス数値を記載した有益なブログエントリを執筆しています。このブログでは、JDK 28を対象としたさらなる改善点についても取り上げられています。

Shawn Emery – Inside.java
Acceleration of Curve25519 Field Operations with Java Software and Intrinsics – Inside.java

PKI

[JDK-8372351] Add 2 WISeKey roots – Java Bug System

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

2個のWISeKeyルートCA証明書:これらのルート証明書は、OracleのJDK 25.0.4、21.0.12、17.0.20、11.0.32、および8u501リリースにおけるcacertsキーストアにも追加されています。

WISeKey Global Root GB CA(識別名は以下の通り)

CN=OISTE WISeKey Global Root GB CA, OU=OISTE Foundation Endorsed, O=WISeKey, C=CH

WISeKey Global Root GC CA(識別名は以下の通り)

CN=OISTE WISeKey Global Root GC CA, OU=OISTE Foundation Endorsed, O=WISeKey, C=CH

TLS

JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3

JDK 27 では、TLS 1.3 向けのポスト量子ハイブリッド鍵交換がサポートされるようになりました。これは、JDK 24で導入されたポスト量子アルゴリズムML-KEMを基盤とする重要な機能です。

この機能は、古典的な鍵交換アルゴリズムとポスト量子鍵交換アルゴリズムをハイブリッドなアプローチで組み合わせ、harvest now, decrypt later (HNDL)リスクから保護します。

Harvest now, decrypt later – Wikipedia
ハーヴェスト・ナウ、ディクリプト・レイター – Wikipedia

ハイブリッド方式は、従来のアルゴリズムとポスト量子アルゴリズムの両方を組み合わせたものであり、いずれかのアルゴリズムが解読されない限り、安全性が保たれます。IETFがRFC 10024で定義した3つのハイブリッドグループ、X25519MLKEM768SecP256r1MLKEM768、およびSecP384r1MLKEM1024のサポートを追加しました。

RFC 10024: Post-Quantum Traditional (PQ/T) Hybrid Key Agreement Mechanisms for TLS 1.3 | RFC Editor

これらは、量子耐性のあるML-KEMアルゴリズムと従来の楕円曲線アルゴリズムを組み合わせています。X25519MLKEM768グループはデフォルトで有効になっています。この機能は追加設定なしで動作します。最も広く導入されているハイブリッドグループであるX25519MLKEM768グループを両端点がサポートしている限り、APIや設定の変更は必要ありません。

他のグループのいずれかを使用するには、システムプロパティjdk.tls.namedGroupsを設定するか、SSLParameters.setNamedGroups() APIを使用します。

Jamil Nimeh氏は、この機能に関する追加の詳細や、サポートされるグループをカスタマイズする方法を示す例を掲載した有益なブログエントリを執筆しています。

Jamil Nimeh – Inside.java
Post-Quantum Hybrid Key Exchange for TLS 1.3 – Inside.java

この機能は、2026年10月にリリースされるOracleのJDK 25アップデートリリースにもバックポートされる予定です。また、この機能をOracleのJDK 21、17、11、および8のアップデートリリースにバックポートする計画も発表しています。詳細については、Java Cryptographic Roadmapおよび、Aurelio Garcia-Ribeyro氏のブログ記事Post-Quantum Cryptography in Long-Term Support JDK Releasesをご覧ください。

Oracle JRE and JDK Cryptographic Roadmap
Post-Quantum Cryptography in Long-Term Support JDK Releases | java

[JDK-8372526] Add support for ZLIB TLS Certificate Compression

TLS 1.3ハンドシェイクを介して交換される証明書チェーンを、zlib圧縮アルゴリズムを使用して圧縮できるようになりました。この機能はデフォルトで有効になっていますが、jdk.tls.client.disableExtensionsおよびjdk.tls.server.disableExtensionsシステムプロパティにcompress_certificate拡張子を追加することで無効化できます。

[JDK-8373426] Remove ffdhe6144 and ffdhe8192 from default list of TLS named groups

ffdhe6144 および ffdhe8192 というNamed Groupが、デフォルトで有効になっている TLS Named Groupリストから削除されました。これらのグループは実際にはほとんど使用されないため、互換性のリスクは最小限であると考えられます。アプリケーションでは、システムプロパティjdk.tls.namedGroupsを設定するか、TLS ソケット接続の設定時にSSLParameter.setNamedGroupsメソッドを呼び出すことで、引き続きこれらのグループを使用できます。

[JDK-8369282] Distrust TLS server certificates anchored by Chunghwa ePKI Root CA

JDK は、中華電信(Chunghwa)が発行した TLS サーバー証明書を今後信頼しなくなります。2026年3月17日より前に発行された TLS サーバー証明書については、後日指定される日付または有効期限が切れるまで引き続き信頼されます。その日付以降に発行された証明書は拒否されます。詳細および影響を受ける認証局については、リリースノートを参照してください。この変更は、OracleのJDK 25.0.3、21.0.11、17.0.19、11.0.31、および8u491のリリースでも実施されています。

Tools

[JDK-8368692] Restrict Password::readPassword from reading from System.in

jdk.security.password.allowSystemInという新しいセキュリティプロパティが追加されました。これをtrueに設定すると、コンソールが利用できない場合に、標準入力ストリームからパスワードを読み込むことが可能になります。デフォルト値はtrueですが、今後のリリースではこのデフォルト値がfalseに変更される可能性があります。このプロパティが役立つ使用例など、詳細についてはリリースノートを参照してください。

[JDK-8364182] Add jcmd VM.security_properties command

jcmdツールが更新され、VM.security_propertiesという新しいコマンドが追加されました。

The jcmd Command

このコマンドを使用すると、実行中の JVM に対して設定されているセキュリティプロパティの値を表示できます。これにより、本番環境や開発環境において、セキュリティ関連の設定問題を診断・トラブルシューティングするための、簡単でスクリプト化可能な方法が提供されます。以下は使用例です。

$ jcmd 36864 VM.security_properties
36864:
#Wed Sep 16 08:33:07 EDT 2026
com.sun.security.allowedAIALocations=
com.sun.security.crl.maxSize=20971520
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.crypto.legacyAlgorithms=Cipher.RSA/ECB/PKCS1Padding
jdk.epkcs8.defaultAlgorithm=PBEWithHmacSHA256AndAES_128
jdk.includeInExceptions=hostInfoExclSocket
jdk.io.permissionsUseCanonicalPath=false
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024, SHA1 denyAfter 2019-01-01
jdk.quic.tls.keyLimits=AES/GCM/NoPadding 2^23, ChaCha20-Poly1305 2^23
jdk.sasl.disabledMechanisms=
jdk.security.caDistrustPolicies=SYMANTEC_TLS,ENTRUST_TLS,CAMERFIRMA_TLS,CHUNGHWA_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, TLS_RSA_*, rsa_pkcs1_sha1 usage HandshakeSignature, ecdsa_sha1 usage HandshakeSignature, dsa_sha1 usage HandshakeSignature
jdk.tls.keyLimits=AES/GCM/NoPadding KeyUpdate 2^37, ChaCha20-Poly1305 KeyUpdate 2^37
jdk.tls.legacyAlgorithms=NULL, anon, RC4, DES, 3DES_EDE_CBC
jdk.xml.dsig.secureValidationPolicy=disallowAlg http\://www.w3.org/TR/1999/REC-xslt-19991116,disallowAlg http\://www.w3.org/2001/04/xmldsig-more\#rsa-md5,disallowAlg http\://www.w3.org/2001/04/xmldsig-more\#hmac-md5,disallowAlg http\://www.w3.org/2001/04/xmldsig-more\#md5,disallowAlg http\://www.w3.org/2000/09/xmldsig\#sha1,disallowAlg http\://www.w3.org/2000/09/xmldsig\#dsa-sha1,disallowAlg http\://www.w3.org/2000/09/xmldsig\#rsa-sha1,disallowAlg http\://www.w3.org/2007/05/xmldsig-more\#sha1-rsa-MGF1,disallowAlg http\://www.w3.org/2001/04/xmldsig-more\#ecdsa-sha1,disallowAlg http\://www.w3.org/TR/1999/REC-xpath-19991116,maxTransforms 5,maxReferences 30,disallowReferenceUriSchemes file http https,minKeySize RSA 1024,minKeySize DSA 1024,minKeySize EC 224,noDuplicateIds,noRetrievalMethodLoops
keystore.type=pkcs12
keystore.type.compat=true
krb5.kdc.bad.policy=tryLast
login.configuration.provider=sun.security.provider.ConfigFile
networkaddress.cache.negative.ttl=10
policy.allowSystemProperty=true
policy.expandProperties=true
securerandom.drbg.config=
securerandom.source=file\:/dev/random
securerandom.strongAlgorithms=NativePRNGBlocking\:SUN,DRBG\:SUN
security.overridePropertiesFile=true
security.provider.1=SUN
security.provider.10=JdkLDAP
security.provider.11=JdkSASL
security.provider.12=Apple
security.provider.13=SunPKCS11
security.provider.2=SunRsaSign
security.provider.3=SunEC
security.provider.4=SunJSSE
security.provider.5=SunJCE
security.provider.6=SunJGSS
security.provider.7=SunSASL
security.provider.8=XMLDSig
security.provider.9=SunPCSC
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
sun.security.krb5.disableReferrals=false
sun.security.krb5.maxReferrals=5

コメントを残す

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