JDK 15的安全性增强 - seanjmullan


JDK 15已于2020年9月15日发布!我已经整理了一份清单,列出了我认为是此发行版中最有趣,最有用的安全性增强功能。此版本最重要的安全功能是对Edwards-curve数字签名算法的支持,该算法提供了比其他签名算法更高的安全性和性能。
 

加密货币

  • 爱德华兹曲线数字签名算法(EdDSA)

JDK 15现在支持EdDSA签名算法。JEP 339中定义了此功能。同时支持Ed25519和Ed448算法。
EdDSA旨在抵抗常用的旁通道攻击。与平台无关的Java实现不会在机密分支,并且计时与机密无关。
代表EdDSA密钥的新标准类和接口已添加到Java SE平台。该SunEC供应商已得到增强,支持EdDSA的Signature,KeyFactory和KeyPairGenerator API的。
这是来自JEP的一个示例,该示例生成一个EdDSA密钥对并签署一些内容:
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();

  • SHA-3 Mac算法支持

在SHA-3系列的HMAC算法现在支持:HmacSHA3-224, HmacSHA3-256,HmacSHA3-384,HmacSHA3-512。SHA-3是一种摘要算法,被认为与SHA-2一样强大。使用 javax.crypto.Mac API访问以下算法,例如:
Mac mac = Mac.getInstance("HmacSHA3-256");

此增强功能扩展了对JDK中SHA-3的支持。在JDK 9中,我们添加了对 SHA-3哈希算法的支持。在JDK 16中,我们将添加对 SHA-3签名算法的支持
  • 默认情况下,本机椭圆曲线native elliptic curves已禁用

SunEC 默认情况下,已禁用在提供程序中以本机C代码实现的椭圆曲线elliptic curves。这些曲线curves不再被推荐和/或不使用现代公式和技术来实现。尝试使用其中一条曲线curves的API会抛出一条Exception“消息”,并显示“ Legacy SunEC curve disabled”和曲线curves名称。
要重新启用它们(后果自负),请将jdk.sunec.disableNative 系统属性设置为false。例如:
$ java -Djdk.sunec.disableNative=false ...

但是请注意,如果重新启用它们,则在TLS,CertPath或Signed JAR中使用它们时,默认情况下仍会禁用它们。有关 更多信息,请参见 JDK 14发行说明
此项更改禁用的曲线curves为:
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。
 

公钥基础设施

  • 删除了两个根CA证书
    以下根CA已过期,并已从cacerts JDK的密钥库中删除:
    1. AddTrust 1类CA根此根证书由Sectigo拥有,并具有以下专有名称:CN=AddTrust Class 1 CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE
    2. Keynectis根CA此根证书由DocuSign拥有,并具有以下专有名称:CN=KEYNECTIS ROOT CA, OU=ROOT, O=KEYNECTIS, C=FR

    Sectigo拥有的另外两个根目录也已经到期,但是cacerts由于已经签发了可以回溯到这些根目录的代码签名证书,并且仍然可以在带有时间戳的应用程序中使用,因此它们现在仍将保留在密钥库中:
    1. AddTrust合格的CA根该根证书具有以下专有名称:CN=AddTrust Qualified CA Root, OU=AddTrust TTP Network, O=AddTrust AB, C=SE
    2. AddTrust外部CA根该根证书具有以下专有名称:CN=AddTrust External CA Root, OU=AddTrust External TTP Network, O=AddTrust AB, C=SE

 
TLS
  • 支持证书颁发机构扩展
    JDK TLS 1.3实现现在支持 “ certificate_authorities”扩展
    客户端或服务器使用此扩展名来指示其支持的CA。这可以帮助接收者确定要用于身份验证的证书。
    如果请求客户端身份验证,则此扩展名始终由服务器发送。默认情况下,客户端不发送此扩展名。要在客户端上启用扩展,请将jdk.tls.client.enableCAExtensionsystem属性设置 为true。但是,请注意,扩展中可以指定与CA数量相关的一些限制,有关更多信息,请参见 发行说明
  • 该SSLSession.getPeerCertificateChain()方法已被修改为抛出UnsupportedOperationException
    SSLSession.getPeerCertificateChain() API现在是默认情况下默认抛出UnsupportedOperationException的方法。不推荐使用此API删除,因此不再使用,因为它取决于不建议删除的 javax.security.cert.X509Certificate类型。抛出UnsupportedOperationException会帮助开发人员识别并删除其应用程序中所有剩余的用法。
    应用程序应SSLSession.getPeerCertificates() 改为使用 。
  • 用于配置TLS签名方案的新系统属性
    引入了两个新的系统属性,使您可以配置TLS连接的数字签名中使用的签名方案的名称。如果您希望更好地控制启用了哪些签名方案,或者如果其他TLS实现不支持某些签名方案并导致TLS握手失败,则这些属性将很有用。
    1. jdk.tls.client.SignatureSchemes:客户端使用的受支持的签名方案。
    2. jdk.tls.server.SignatureSchemes:在服务器端使用的受支持的签名方案。

    每个系统属性都应包含 在Java安全标准算法名称规范的“签名方案”部分中定义的受支持的签名方案名称的逗号分隔列表 。例如:
    $ java -Djdk.tls.server.SignatureSchemes=rsa_pkcs1_sha256,rsa_pss_pss_sha256 ...

 
工具类
  • jarsigner工具现在具有检查证书吊销的选项
    名为的新选项-revCheck已添加到中jarsigner。如果指定,它将检查签名者的证书链和TSA链(如果带有JAR的时间戳)中每个证书的吊销状态。这是一个例子:
    $ 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而keytool如果你使用弱密码算法现在发出警告之前,它们将被禁止
    如果安全工件使用的算法正在减弱但默认情况下尚未禁用,则这些警告会通知您。这会提醒您潜在的安全风险,并且还提前通知您,以便您可以在禁用那些功能较弱的算法之前升级到功能更强的算法。
    在此版本中,当使用大于或等于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加密路线图中列出 。
  • 该com.sun.jarsignerAPI已经被弃用去除
    以前在JDK 9中不推荐使用 该包中的ContentSigner 和ContentSignerParametersAPI com.sun.jarsigner,但现在将它们标记为删除,并将在后续版本的JDK中删除。
    这些API很少使用,现在有一个替代 JarSigner API更加强大,推荐改为使用。
    另外,jarsigner -altsigner依赖于这些API的选项也将在后续的JDK版本中删除,并发出警告:
    $ jarsigner -altsigner path foo.jar This option is deprecated and will be removed in a future release: -altsigner