JEP 288:禁用 SHA-1 证书
概括
通过提供更灵活的机制来禁用具有基于 SHA-1 签名的 X.509 证书链,从而改进 JDK 的安全配置。
非目标
该机制的目标不是禁用 SHA-1 证书的所有使用。只有通过和APIPKIX
的实现以及API和的实现进行验证的 X.509 证书链才会受到限制。 JDK 中 X.509 证书的其他用法(解析等)不受影响。、、 和的第三方实现直接负责执行自己的限制。CertPathValidator``CertPathBuilder``SunX509``PKIX``TrustManagerFactory``CertPathValidator``CertPathBuilder``TrustManagerFactory
动机
由于存在碰撞攻击的风险,基于 SHA-1 的数字签名算法的使用日益成为安全问题。 NIST 在SP 800-57 第 1 部分中建议不应再使用 SHA-1 对数据应用数字签名。 CA/浏览器论坛的公众信任 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
:
-
名为 的新约束,设置后,如果在由 JDK cacerts
jdkCA
密钥库中预安装的信任锚锚定的证书链中使用该算法,则会限制该算法。此条件不适用于由其他证书锚定的证书链,包括随后添加到密钥库的证书链。另请注意,该限制 不适用于信任锚证书,因为它们是直接受信任的。cacerts
-
名为 的新约束
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
,设置后,如果在指定日期之后在签名的 JAR 中使用该算法,则会限制该算法,如下所示:A。如果 JAR 没有时间戳,则在指定日期之后它将受到限制(视为未签名)
b. 如果 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 服务器身份验证的 SHA-1 证书以及该链以信任 cacerts 文件中预安装的锚点,请添加"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
要在签名的 JAR 中禁用 SHA-1(时间戳早于 2017 年 1 月 1 日之前的 JAR 除外),请添加"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 证书。
风险和假设
描述部分概述了其他约束,这些约束将有助于减轻某些用例的兼容性风险。我们还将努力通过其他论坛和程序传达这些更改,以帮助确保用户了解这些更改并了解如何在新限制生效之前配置和测试其应用程序。
依赖关系
该 JEP 依赖于现有算法约束机制的三项增强(8140422、8154005、8160655 )。