JDK 15 Security Enhancements

原文はこちら。
The original article was written by Sean Mullan (Java Security Tech Lead, Oracle).
https://seanjmullan.org/blog/2020/10/13/jdk15

JDK 15が2020年9月15日にリリースされました。これまでのJDK 14、JDK 13、JDK 12のブログエントリと同じように、このリリースにおける興味深く有用なセキュリティ強化点を4カテゴリ (Crypto、PKI、TLS、Tool)に分けてご紹介します。詳細やその他の機能強化はJDK 15のリリースノートに記載があります。

JDK 15.0.1 General-Availability Release
https://jdk.java.net/15
JDK 14 Security Enhancements
https://seanjmullan.org/blog/2020/03/19/jdk14
JDK 13 Security Enhancements
https://seanjmullan.org/blog/2019/08/05/jdk13
JDK 12 Security Enhancements
https://seanjmullan.org/blog/2019/03/19/jdk12
JDK 15.0.1 Release Notes
https://jdk.java.net/15/release-notes

JDK 15における最も重要なセキュリティ機能追加は、Edwards-curve Digital Signature Algorithm (EdDSA) のサポートです。これは改善されたセキュリティとその他の署名アルゴリズムにおけるパフォーマンス向上をもたらします。詳細はCryptoの章をご覧ください。

Table of Contents

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

Crypto

Edwards-curve Digital Signature Algorithm (EdDSA)

JDK 15はEdDSA 署名アルゴリズムをサポートするようになりました。この機能はJEP 339で定義されており、Ed25519とEd448アルゴリズムの両方がサポートされています。

JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)
https://openjdk.java.net/jeps/339

EdDSAは、一般的に使用されるサイドチャネル攻撃に耐性を持つように設計されています。プラットフォームに依存しないJavaの実装はシークレットで分岐せず、タイミングはシークレットに依存しません。EdDSA鍵を表す新しい標準クラスとインターフェースがJava SEプラットフォームに追加されました。SunECプロバイダは、SignatureKeyFactoryKeyPairGenerator APIでEdDSAをサポートするように強化されています。以下は、EdDSAキーペアを生成し、コンテンツに署名するという、JEPにある例です。

KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
// algorithm is pure Ed25519
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();

この機能に関するより詳細の情報はJEP 339と以下のBugにあります。

[JDK-8190219] Crypto support for the EdDSA Signature Algorithm
https://bugs.openjdk.java.net/browse/JDK-8190219

(訳注)以下の通り、JDK 16ではTLS実装でEdDSA署名(ed25519とed448)とEdDSA鍵を使う証明書をサポートする予定です。

[JDK-8254709] TLS support for the EdDSA signature algorithm
https://bugs.openjdk.java.net/browse/JDK-8254709

SHA-3 Mac algorithm support

HmacアルゴリズムのSHA-3ファミリー(HmacSHA3-224、HmacSHA3-256、HmacSHA3-384、HmacSHA3-512)がサポートされるようになりました。SHA-3はダイジェストアルゴリズムで、SHA-2と同等の強さと考えられています、以下のように、javax.crypto.Mac APIを使いこれらのアルゴリズムへアクセスします。

Mac mac = Mac.getInstance("HmacSHA3-256");

javax.crypto.Mac
https://docs.oracle.com/javase/jp/15/docs/api/java.base/javax/crypto/Mac.html
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/javax/crypto/Mac.html

この機能強化により、JDKにおけるSHA-3のサポートが拡張されています。JDK 9ではSHA-3ハッシュアルゴリズムが追加されましたが、JDK 16ではSHA-3署名アルゴリズムを追加する予定です。

JEP 287: SHA-3 Hash Algorithms
https://openjdk.java.net/jeps/287
[JDK-8252260] Enhance JDK providers to support SHA3 based signatures
https://bugs.openjdk.java.net/browse/JDK-8252260

The native elliptic curves have been disabled by default

SunECプロバイダのネイティブCコードで実装された楕円曲線はデフォルトで無効化されました。これらの楕円曲線はもはや推奨されず、最新の数式や技術を使用して実装されていません。これらの楕円暗号の一つを使おうとするAPIは、“Legacy SunEC curve disabled” (レガシーのSunEC曲線は無効化されています)のメッセージと当該曲線の名前を付けて例外をスローします。再度有効化するには(それはご自身でリスクを負ってください)、以下のシステムプロパティにfalseを指定します。

$ java -Djdk.sunec.disableNative=false ...

しかしながら、これらの曲線を再度有効化したとしても、TLSやCertPath、署名済みJARで利用する場合はデフォルトで無効化されていますのでご注意ください。詳細情報はJDK 14リリースノートをご覧ください。

Weak Named Curves in TLS, CertPath, and Signed JAR Disabled by Default
https://www.oracle.com/java/technologies/javase/14-relnote-issues.html#JDK-8233228

この変更で無効化された曲線は以下の通りです。

secp112r1
secp112r2
secp128r1
secp128r2
secp160k1
secp160r1
secp160r2
secp192k1
secp192r1
secp224k1
secp224r1
secp256k1
sect113r1
sect113r2
sect131r1
sect131r2
sect163k1
sect163r1
sect163r2
sect193r1
sect193r2
sect233k1
sect233r1
sect239k1
sect283k1
sect283r1
sect409k1
sect409r1
sect571k1
sect571r1
X9.62 c2tnb191v1
X9.62 c2tnb191v2
X9.62 c2tnb191v3
X9.62 c2tnb239v1
X9.62 c2tnb239v2
X9.62 c2tnb239v3
X9.62 c2tnb359v1
X9.62 c2tnb431r1
X9.62 prime192v2
X9.62 prime192v3
X9.62 prime239v1
X9.62 prime239v2
X9.62 prime239v3
brainpoolP256r1
brainpoolP320r1
brainpoolP384r1
brainpoolP512r1

以下の曲線はJavaで最新のテクニックで実装されており、今回の変更による影響はありません。

secp256r1
secp384r1
secp521r1
x25519
x448
ed25519
ed448

PKI

Two root CA certificates have been removed

以下のルートCAが失効し、JDKのcacertsキーストアから削除されました。

  1. AddTrust Class 1 CA Root

Sectigoが所有するルート証明書。対象のDistinguished nameは以下の通り。

CN=AddTrust Class 1 CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE

2. Keynectis Root CA

Docusignが所有するルート証明書。対象のDistinguished nameは以下の通り。

CN=KEYNECTIS ROOT CA, OU=ROOT, O=KEYNECTIS, C=FR

Sectigoが所有する別の2個のルート証明書も失効しましたが、これらのルート証明書に連鎖するコード署名証明書が発行されており、タイムスタンプ付きのアプリケーションでまだ使用されている可能性があるため、現時点ではまだcacertsキーストアに残っています。

1. AddTrust Qualified CA Root

このルート証明書は以下のDistinguished nameを持つ。

CN=AddTrust Qualified CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE

2. AddTrust External CA Root

このルート証明書は以下のDistinguished nameを持つ。

CN=AddTrust External CA Root, OU=AddTrust External TTP Network, O=AddTrust AB, C=SE

TLS

Support for the Certificate Authorities extension

JDK TLS 1.3 の実装で、”certificate_authorities” 拡張がサポートされるようになりました。

Certificate Authorities [The Transport Layer Security (TLS) Protocol Version 1.3] (RFC8446)
https://tools.ietf.org/html/rfc8446#section-4.2.4

この拡張は、どのCA(認証局)をクライアントやサーバーがサポートしているかをクライアントやサーバーが示すために使われます。これにより、受信者が認証にどの証明書を使用するかを判断するのに役立ちます。クライアント認証が要求された場合、サーバーはこの拡張を常に送信します。この拡張をクライアント側で有効化するには、以下のシステムプロパティをtrueにする必要があります。

jdk.tls.client.enableCAExtension=true

しかしながら、拡張で指定可能なCAの個数に関連する制限があることにご注意ください。、詳細はリリースノートをご覧ください。

Support for certificate_authorities Extension
https://www.oracle.com/java/technologies/javase/15-relnote-issues.html#JDK-8206925

The SSLSession.getPeerCertificateChain() method has been modified to throw UnsupportedOperationException

SSLSession.getPeerCertificateChain() APIはデフォルトでUnsupportedOperationExceptionをスローするメソッドになりました。このAPIはjavax.security.cert.X509Certificate型に依存しているため、将来の削除のために廃止されており、もはや使用すべきではありません。

SSLSession#getPeerCertificateChain()
https://docs.oracle.com/javase/jp/15/docs/api/java.base/javax/net/ssl/SSLSession.html#getPeerCertificateChain()
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/javax/net/ssl/SSLSession.html#getPeerCertificateChain()
javax.security.cert.X509Certificate
https://docs.oracle.com/javase/jp/15/docs/api/java.base/java/security/cert/X509Certificate.html
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/javax/security/cert/X509Certificate.html

UnsupportedOperationExceptionを投げることで、開発者はアプリケーションに残っている利用コードを特定して削除できます。アプリケーションでは今後はSSLSession.getPeerCertificates()を利用ください。

getPeerCertificates
https://docs.oracle.com/javase/jp/15/docs/api/java.base/javax/net/ssl/SSLSession.html#getPeerCertificates()
https://docs.oracle.com/en/java/javase/15/docs/api/java.base/javax/net/ssl/SSLSession.html#getPeerCertificates()

New system properties for configuring TLS signature schemes

2個の新たなシステムプロパティが導入されました。これらを使ってTLS接続のデジタル署名で使われる署名スキームの名前を構成できます。これらのプロパティは、どの署名方式を有効にしているかをより制御したい場合や、他の TLS 実装でサポートされていない署名方式があり、それが原因でTLS ハンドシェイクが失敗している場合に役に立ちます。

  • jdk.tls.client.SignatureSchemes
    クライアント側で利用されるサポート対象の署名スキーム
  • jdk.tls.server.SignatureSchemes
    サーバー側で利用されるサポート対象の署名スキーム

各システムプロパティには、Java Security Standard Algorithm Names SpecificationのSignature Schemesで定義されているサポート対象の署名スキームの名前のカンマ区切りのリストが含まれています。

Signature Schemes
https://docs.oracle.com/en/java/javase/15/docs/specs/security/standard-names.html#signature-schemes

以下はその例です。

$ java -Djdk.tls.server.SignatureSchemes=rsa_pkcs1_sha256,rsa_pss_pss_sha256 ...

Tools

The jarsigner tool now has an option to check certificate revocation

jarsigner-revCheck という名前の新しいオプションが追加されました。このオプションを指定した場合、署名者の証明書チェーンの各証明書の失効状況をチェックし、JARがタイムスタンプされている場合はTSAのチェーンをチェックします。以下はその例です。

$ jarsigner -verify -revCheck HelloWorld.jar
Contacting OCSP server at http://s2.symcb.com ...
Contacting OCSP server at http://sv.symcd.com ...
Contacting OCSP server at http://s.symcd.com ...
Contacting OCSP server at http://ts-ocsp.ws.symantec.com ...

jar verified.

jarsigner and keytool now emit warnings if you are using weak cryptographic algorithms before they are disabled

セキュリティ成果物が弱体化したアルゴリズムを使用している場合にこれらの警告が通知されますが、デフォルトではまだ無効化されていません。これにより、潜在的なセキュリティリスクが警告されるとともに、弱いアルゴリズムが無効になる前に、より強力なアルゴリズムにアップグレードできるように事前に通知します。

このバージョンでは、1024 ビット以上 2048 ビット未満の SHA-1 または RSA/DSA 鍵が使用されている場合に警告が出ます。以下はその例です。

$ jarsigner -keystore ks -digestalg SHA-1 HelloWorld.jar signer
Enter Passphrase for keystore:

jar signed.

Warning: 
The SHA-1 algorithm specified for the -digestalg option is considered a security risk. This algorithm will be disabled in a future update.
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2021-04-27).

The signer certificate will expire on 2021-04-27.

この変更は、2020年10月のCPUリリースでOracle JDK 11、8、7にもバックポートされました。Java Cryptographic Roadmapに記載されています。

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

The com.sun.jarsigner APIs have been deprecated for removal

com.sun.jarsigner パッケージの ContentSigner と ContentSignerParameters API は、 JDK 9で非推奨とされていましたが、現在は削除のマークが付けられており、以降のバージョンのJDKで削除される予定です。

ContentSigner
https://docs.oracle.com/javase/jp/15/docs/api/jdk.jartool/com/sun/jarsigner/ContentSigner.html
https://docs.oracle.com/en/java/javase/15/docs/api/jdk.jartool/com/sun/jarsigner/ContentSigner.html
ContentSignerParameters
https://docs.oracle.com/javase/jp/15/docs/api/jdk.jartool/com/sun/jarsigner/ContentSignerParameters.html
https://docs.oracle.com/en/java/javase/15/docs/api/jdk.jartool/com/sun/jarsigner/ContentSignerParameters.html

これらのAPIはほとんど使用されていませんでしたが、現在はより強力な代替のJarSigner APIがあり、そちらを代わりに使用してください。

JarSigner
https://docs.oracle.com/javase/jp/15/docs/api/jdk.jartool/jdk/security/jarsigner/JarSigner.html
https://docs.oracle.com/en/java/javase/15/docs/api/jdk.jartool/jdk/security/jarsigner/JarSigner.html

さらに、これらの API に依存する jarsigner -altsigner オプションも、後続の JDK リリースで削除されることになっており、利用時には警告が出るようになっています。

$ jarsigner -altsigner path foo.jar
This option is deprecated and will be removed in a future release: -altsigner

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中