JEP 288: Disable SHA-1 Certificates | 禁用 SHA-1 证书
摘要
通过提供更灵活的机制来禁用基于 SHA-1 签名的 X.509 证书链,以提高 JDK 的安全配置。
非目标
该机制不旨在禁用所有使用 SHA-1 证书。只有由 CertPathValidator
和 CertPathBuilder
API 的 PKIX
实现以及 TrustManagerFactory
API 的 SunX509
和 PKIX
实现验证的 X.509 证书链以及其他用途 (parsing 等) 不受影响的 JDK 中的 X.509 证书。 CertPathValidator
,CertPathBuilder
和 TrustManagerFactory
的第三方实现直接负责执行其自己的限制。
动机
由于 冲突攻击 的风险越来越高,基于 SHA-1 的数字签名算法的使用越来越成为安全问题。NIST 在 SP 800-57,Part 1 中建议不再使用 SHA-1 来应用数码签名。CA/Browser 论坛的 公共信任 SSL 证书的基线要求 规定,自 2016 年 1 月 1 日起,证书颁发机构不得使用 SHA-1 颁发任何下级 CA 或订阅者证书。其他软件供应商 (Google,Microsoft,Mozilla,Apple) 已发布了淘汰证书中 SHA-1 的计划。在 JDK 中,X.509 证书链用于验证被签名代码的完整性和作者以及 TLS 中服务器和客户端的身份验证。
描述
SHA-1 证书的使用继续减少,尤其是对于公共信任的 SSL/TLS 服务器 (截至 2017 年 3 月 3 日,0.0% 的热门 SSL 网站仍使用 SHA-1)。然而,许多企业使用私有证书颁发机构,通常需要更多时间来适应新的算法限制。此外,以前使用 SHA-1 证书签名和时间戳的代码应该在未来一段时间内继续工作。因此,禁用 所有SHA-1 证书可能会破坏许多应用程序。因此,这个 JEP 将增强算法约束机制,允许实施更灵活的 SHA-1 限制策略。
具体来说,对 jdk.certpath.disabledAlgorithms
安全属性的规范进行了以下增强:
新增名为
jdkCA
的约束条件,当设置时,如果在 JDK cacerts keystore 中预安装的信任锚点锚定证书链中使用算法,则限制该算法。此条件不适用于由其他证书锚定的证书链,包括后续添加到cacerts
keystore 的证书。此外,请注意,该限制不适用于信任锚定证书,因为它们是直接受信任的。新增名为
denyAfter
的约束条件,当设置时,如果在指定日期之后使用算法,则限制该算法。此限制不适用于信任锚定证书,因为它们是直接受信任的。此外,签名 JAR 中使用的代码签名证书链将特殊处理,如下所述:a. 如果证书链与未加时间戳的已签名 JAR 一起使用,则在指定日期之后将被限制
b. 如果证书链与已加时间戳的已签名 JAR 一起使用,则如果时间戳在指定日期之前,则不受限制。如果 JAR 在指定日期之后加上时间戳,则会受到限制。
新增名为
usage
的约束条件,当设置时,如果在指定用途的证书链中使用算法,则限制该算法。最初支持三个用途:TLSServer
用于 TLS/SSL 服务器证书链,TLSClient
用于 TLS/SSL 客户端证书链,以及SignedJAR
用于与已签名的 JAR 一起使用的证书链。
在上述增强之后,jdk.certpath.disabledAlgorithms
安全属性的规范如下 (有关每个约束条件的定义,请参见 java.security
文件):
DisabledAlgorithms:
" DisabledAlgorithm { , DisabledAlgorithm } "
DisabledAlgorithm:
AlgorithmName [Constraint] { '&' Constraint }
AlgorithmName:
(see below)
Constraint:
KeySizeConstraint | CAConstraint | DenyAfterConstraint |
UsageConstraint
KeySizeConstraint:
keySize Operator KeyLength
Operator:
<= | < | == | != | >= | >
KeyLength:
Integer value of the algorithm's key length in bits
CAConstraint:
jdkCA
DenyAfterConstraint:
denyAfter YYYY-MM-DD
UsageConstraint:
usage [TLSServer] [TLSClient] [SignedJAR]
此外,对 jdk.jar.disabledAlgorithms
安全属性的规范进行了以下增强:
新增名为
denyAfter
的约束条件,当设置时,如果在指定日期之后使用算法,则限制该算法,具体如下:a. 如果 JAR 没有加上时间戳,则在指定日期之后将被限制(视为未签名)
b. 如果 JAR 已加上时间戳,在指定日期之前加上时间戳的 JAR 将不受限制。如果 JAR 在指定日期之后加上时间戳,则会受到限制。
在上述增强之后,jdk.jar.disabledAlgorithms
安全属性的规范如下(有关每个约束条件的定义,请参见 java.security
文件):
DisabledAlgorithms:
" DisabledAlgorithm { , DisabledAlgorithm } "
DisabledAlgorithm:
AlgorithmName [Constraint] { '&' Constraint }
AlgorithmName:
(see below)
Constraint:
KeySizeConstraint | DenyAfterConstraint
KeySizeConstraint:
keySize Operator KeyLength
DenyAfterConstraint:
denyAfter YYYY-MM-DD
Operator:
<= | < | == | != | >= | >
KeyLength:
Integer value of the algorithm's key length in bits
以下是一些示例:
要禁用链接到 cacerts 文件中预安装的信任锚点的 SHA-1 证书,请将 "SHA1 jdkCA"
添加到 jdk.certpath.disabledAlgorithms
安全属性中:
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, EC keySize < 224, SHA1 jdkCA
要禁用用于 TLS 服务器身份验证并链接到 cacerts 文件中预安装的信任锚点的 SHA-1 证书,请将 "SHA1 jdkCA & usage TLSServer"
添加到 jdk.certpath.disabledAlgorithms
安全属性中:
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, EC keySize < 224, SHA1 jdkCA & usage TLSServer
要禁用签名时间在 2017 年 1 月 1 日之后的已签名 JAR 文件中的 SHA-1,将 "SHA1 usage SignedJAR & denyAfter 2017-01-01"
添加到 jdk.certpath.disabledAlgorithms
安全属性,并将 "SHA1 denyAfter 2017-01-01"
添加到 jdk.jar.disabledAlgorithms
安全属性:
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, EC keySize < 224, \
SHA1 usage SignedJAR & denyAfter 2017-01-01
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \
DSA keySize < 1024, SHA1 denyAfter 2017-01-01
测试
许多安全库回归测试当前使用 SHA-1 证书。这些将进行修改以重新启用 SHA-1 或替换为 SHA-2 证书。
风险和假设
“描述”部分概述了将有助于减轻某些用例的兼容性风险的其他约束条件。我们还将通过其他论坛和程序来传达这些变化,以确保用户了解它们并知道如何在新限制生效之前配置和测试其应用程序。