gpt4 book ai didi

java - KeyUsage 不允许数字签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:47 34 4
gpt4 key购买 nike

我正在尝试从我的 Java EE 程序向需要证书身份验证的主机发送 HTTPS 请求。我有一个正确的 keystore 文件,带有导入 CA 的信任库,两者的列表显示证书在里面。

但是我收到以下错误:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at ...

...

Caused by: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at sun.security.validator.EndEntityChecker.checkTLSServer(EndEntityChecker.java:270)
at sun.security.validator.EndEntityChecker.check(EndEntityChecker.java:141)
at sun.security.validator.Validator.validate(Validator.java:264)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)
... 29 more

查看扩展部分的证书内容,我看到如下:

Extensions:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 33 87 72 1D 09 2F DF FF 1A A7 D1 C0 E1 CF C5 FA 3.r../..........
0010: A4 19 54 2E ..T.
]
]

#2: ObjectId: 2.16.840.1.113730.1.1 Criticality=false
NetscapeCertType [
SSL client
]

#3: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 74 9F 43 07 CC 75 FA D3 D0 13 0F 65 36 CC 4A 9A t.C..u.....e6.J.
0010: E0 8E 9C 52 ...R
]
]

#4: ObjectId: 2.5.29.31 Criticality=false
CRLDistributionPoints [
[DistributionPoint:
[URIName: http://test.az:7447/Test%20CA.crl]
]]

#5: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
]

所以我的证书确实包含KeyUsage [ DigitalSignature ]

抛出异常的地方的代码片段如下所示:

private final static int KU_SIGNATURE = 0;

...

private void checkTLSServer(X509Certificate cert, String parameter)
throws CertificateException {
Set<String> exts = getCriticalExtensions(cert);

...

} else if (KU_SERVER_SIGNATURE.contains(parameter)) {
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
ValidatorException.T_EE_EXTENSIONS, cert);
}
}

...
}

checkKeyUsage函数:

private boolean checkKeyUsage(X509Certificate cert, int bit)
throws CertificateException {
boolean[] keyUsage = cert.getKeyUsage();
if (keyUsage == null) {
return true;
}
return (keyUsage.length > bit) && keyUsage[bit];
}

它在返回 (keyUsage.length > bit) && keyUsage[bit];

时失败

问题是为什么上面表达式的结果= false?当 bit = 0 和 cert.getKeyUsage() 必须返回 boolean 数组 [true, false, false, false, false, false, false, false, false]

最佳答案

错误实际上来自验证服务器的证书。该证书有一个不包含数字签名位的 key 使用部分。

一些密码套件需要数字签名位,特别是 Diffie-Hellman key 交换(DHE_RSA 和 ECDHE_RSA)。您可以通过避免使用这些密码类型来避免此错误。否则需要服务器证书支持。

关于java - KeyUsage 不允许数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355031/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com