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

时间:2018-06-29 07:56:56

标签: java ssl iis weblogic ssl-client-authentication

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

我已经检查并尝试了SO中的所有其他问题/答案,例如: Java not providing client certificate for mutual 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密钥库中包含的证书。

WebLogic希望服务器从SoapUI中查找内容时,Cert Authorities: <Empty>的限制是否较宽松,并且无论如何都会发送密钥库中存在的唯一证书?

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

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

我对日志的解释正确吗?

欢迎提出任何想法/帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

由于似乎有兴趣,所以我在回答自己的问题以解决该问题。

在编写const map = new Map(Object.keys(collection[0]).map(k => [k, {header:k, rows:[]}])); collection.forEach(el =>Object.entries(el).forEach(([k, v]) => map.get(k).rows.push(v))) console.log( [...map.values()])以便通过<script> const collection=[{title:"Product A",price:234,cost:234},{title:"Product B",price:100,cost:200},{title:"Product C",price:344,cost:55},{title:"Product D",price:222,cost:332}]; </script>与其他服务器通信时,我们需要确保用于初始化通信的SSL上下文已与Java clients和{{1 }}。

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

以下是示例:

Two-Way SSL

Custom Identity Keystore的值就是我们所说的Custom Trust keystore,而-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

注意:完成同一件事的另一种方法是,在向服务器发出请求之前,直接在客户端代码本身中加载和设置Identity&Trust密钥库。在线上有多个示例说明了如何执行此操作。

重要:在编写应通过双向SSL进行通信的客户端时,请确保永远不要盲目地信任所有证书。许多客户端库为您提供了一个布尔选项Custom Identity Keystore,该布尔选项在开发过程中很有用,但是如果您将其保留在生产环境中,javax.net.ssl.trustStore起作用。这是因为通过告诉SSL上下文信任任何证书,不会检查服务器证书交换密钥(因为无论如何您都信任它),因此服务器中的Custom Trust Keystore将被忽略。客户端将继续而不发送其客户端证书,但是,由于服务器希望客户端发送一个证书,因此握手过程将以失败告终。