我们正在尝试保护从 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 指纹识别,还是由证书本身确定摘要方法?
您可能需要从 Oracle 下载并激活 无限强度管辖权策略文件。
实际上,您可以使用它们打开和关闭 Java 中更强的加密。 (您需要一个 Oracle 帐户才能下载。)
链接页面说
仅 8u161、7u171 和 6u181 之前的 JDK 8、7 和 6 更新需要无限策略文件。在这些版本及更高版本上,默认情况下可以使用更强大的加密算法。
这符合您的观察结果,即 8u111 不执行握手,而 8u401 执行握手。