为什么旧版 JDK8 不接受我们自己的 CA 签名的证书?

问题描述 投票:0回答:1

我们正在尝试保护从 Java 程序到远程服务器的连接。服务器正在提供由我们自己的 CA 签名的证书,而我们的 Java 程序拒绝该证书:

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)

该错误仅发生在较旧的 JDK8 补丁级别上,但是:8u111。有了 8u401 一切正常...

$JAVAHOME/jre/lib/security/cacerts
是指向旧版和新版 JDK 版本的相同文件的符号链接,根据
keytool -list
,该文件确实包含我们的 CA 证书:

Certificate fingerprint (SHA-256): 57:4D:F6:93:1E:27:80:39:66:7B.....
OURCOMPANY
Certificate fingerprint (SHA-256): 83:81:CF:C1:68:99:29:F0:D2:C1.....
OURCOMPANY

证书本身是否还有其他问题导致它们无法在旧版 JDK 中使用?是旧版 JDK 无法识别的摘要方法 (SHA-256)吗?我发现旧版本最初附带的

cacerts
文件使用 1024 位 RSA 进行指纹识别...

是否有一种方法可以在不升级整个 JDK 的情况下启用 SHA-256 的使用(由于不相关的原因,我们目前无法做到这一点)?

例如,我们能否将 CA 的证书导入到旧的 KeyStore 中——使用 RSA 1024 指纹识别,还是由证书本身确定摘要方法?

ssl java-8 sha ca
1个回答
0
投票

您可能需要从 Oracle 下载并激活 无限强度管辖权策略文件

实际上,您可以使用它们打开和关闭 Java 中更强的加密。 (您需要一个 Oracle 帐户才能下载。)

链接页面说

仅 8u161、7u171 和 6u181 之前的 JDK 8、7 和 6 更新需要无限策略文件。在这些版本及更高版本上,默认情况下可以使用更强大的加密算法。

这符合您的观察结果,即 8u111 不执行握手,而 8u401 执行握手。

© www.soinside.com 2019 - 2024. All rights reserved.