我无法理解为什么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 Authorities
是Empty
。在这种情况下,客户端(Weblogic)不发送证书。如您所见,开发人员发出警告消息:
no suitable certificate found - continuing without client authentication
当我使用SoapUI
而不是Weblogic与服务器通信时,握手成功。 SoapUI发送Identity.jks
密钥库中包含的证书。
WebLogic希望服务器从SoapUI
中查找内容时,Cert Authorities:
<Empty>
的限制是否较宽松,并且无论如何都会发送密钥库中存在的唯一证书?
由于我已将weblogic设置为仅使用具有该别名的密钥,所以我希望它发送它...
任何人都知道Weblogic用于查找匹配的客户端证书的标准是什么?
我对日志的解释正确吗?
欢迎提出任何想法/帮助。
答案 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
将被忽略。客户端将继续而不发送其客户端证书,但是,由于服务器希望客户端发送一个证书,因此握手过程将以失败告终。