繁体   English   中英

Weblogic/Java 在与 IIS 的相互 SSL 集成中不发送客户端证书

[英]Weblogic/Java not sending Client Certificate in Mutual SSL Integration with IIS

我无法理解为什么 Weblogic/Java 在 SSL 握手期间没有通过 CertificateRequest 消息发送服务器(IIS 服务器)请求的客户端证书。

我已经检查并尝试了 SO 中的所有其他问题/答案,例如: Java 未为相互 SSL 提供客户端证书? 和类似的。

我创建了一个名为 Identity.jks 的自定义密钥库,只有一个证书条目,并且我已经按照 WL 指南(以及我在 Internet 上可以找到的所有其他内容)进行了正确的设置。

以下是 SSL 握手的调试日志:

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, SHA512withECDSA, SHA256withRSA, SHA384withRSA, SHA1withRSA, SHA256withECDSA, SHA384withECDSA, SHA1withECDSA, SHA1withDSA
Cert Authorities:
<Empty>
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>

正如您所看到的,服务器发送了一个CertificateRequest消息,但由于某些原因, Cert AuthoritiesEmpty 在这种情况下,客户端 (Weblogic) 不会发送证书。 如您所见,开发人员有一条警告消息说:

no suitable certificate found - continuing without client authentication

当我使用SoapUI而不是 Weblogic 与服务器通信时,握手成功。 SoapUI 发送包含在Identity.jks密钥库中的证书。

SoapUI是否限制较少,并且无论如何都会发送密钥库中存在的唯一证书,而 Weblogic 期望服务器在Cert Authorities: <Empty>找到某些内容?

由于我已将 weblogic 设置为仅使用具有该别名的密钥,因此我希望它发送它...

任何人都知道 Weblogic 用来查找匹配客户端证书的标准是什么?

我对日志的解释是否正确?

欢迎任何想法/帮助。

我在 Java HTTP 客户端上遇到了类似的问题。 根据您的 IIS 版本,服务器可能会或可能不会发回证书列表。 新版本没有。

确保您在密钥库中拥有完整的证书链和客户端证书。

由于似乎有兴趣,我正在回答我自己关于如何修复它的问题。

在编写Java clients以通过Two-Way SSL与其他服务器通信时,我们需要确保已使用Custom Identity KeystoreCustom Trust keystore设置用于启动通信的 SSL 上下文。

一种方便的方法是在 JVM 进程启动时(在启动 WebLogic 或其他 Web 应用程序服务器时)将身份和信任密钥库作为 JVM 选项传递。 JVM 参数可以通过服务器启动脚本(如果存在)或作为命令行参数传递。

下面是一个例子:

-Djavax.net.ssl.keyStore=D:\Path-to\identity.jks -Djavax.net.ssl.keyStoreType=JKS -Djavax.net.ssl.keyStorePassword=MyReallyComplexPassword -Djavax.net.ssl.trustStore=D:\Path-to\trust_keystore.jks  -Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStorePassword=MyTrustStorePassword

其中javax.net.ssl.keyStore的值就是我们所说的Custom Identity Keystore ,而javax.net.ssl.trustStore的值就是我们所说的Custom Trust Keystore

注意:完成同样事情的另一种方法是在向服务器发出请求之前,直接在客户端的代码中加载和设置 Identity & Trust 密钥库。 网上有多个例子解释了如何做到这一点。

重要提示:在编写应通过双向 SSL 进行通信的客户端时,请确保永远不要盲目信任所有证书。 许多客户端库给你一个布尔选项TrustAllCerts开发过程中非常有用但是如果你把它在生产Two-Way SSL无法工作。 这是因为通过告诉 SSL 上下文信任任何证书,不会检查服务器证书交换密钥(因为您无论如何都信任它),因此来自服务器的CertificateRequest被忽略。 客户端将继续而不发送其客户端证书,但是,因为服务器希望客户端发送一个,握手过程将以失败告终。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM