我正尝试使用GlassFish 3.1.2.2 w/Metro JAX-WS连接到合作伙伴Web服务,并且出现HTTP错误403.7 - 禁止:需要SSL客户端证书。GlassFish Metro客户端证书出站web服务调用失败
我已经导入我们的合作伙伴提供到GlassFish的密钥存储私钥:
$ keytool -importkeystore -srckeystore XXX.pfx -srcstoretype pkcs12 -destkeystore keystore.jks
$ keytool -changealias -alias "le-75e085d7-0ceb-4734-ac52-0e64646924c8" -destalias "XXX" -keystore keystore.jks
$ keytool -keypasswd -alias XXX -keystore keystore.jks
我则在GlassFish的domain.xml中httpsOutboundKeyAlias属性设置为这个新的关键:
然后,当我做一个WS电话:
[#|2013-03-26T17:58:30.888-0700|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=137;_ThreadName=Thread-2;|#.: ---[HTTP request - https://XXX]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://XXX"
User-Agent: Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body>[...]</S:Body></S:Envelope>--------------------
|#]
[#|2013-03-26T17:58:31.847-0700|INFO|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=137;_ThreadName=Thread-2;|#.: ---[HTTP response - https://XXX - 403]---
null: HTTP/1.1 403 Forbidden
Content-Length: 1913
Content-Type: text/html
Date: Wed, 27 Mar 2013 00:58:31 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
[...]
<h2>HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)</h2>
我有这个配置工作o其他webservices,但不是由于某种原因这个...不知道IIS的行为是不同的?
我似乎能够精细连接使用curl呈现使用OpenSSL的来自合作伙伴的PFX文件转换成一个PEM客户端证书:
$ openssl pkcs12 -in XXX.pfx -out XXX.pem -nodes
$ curl -vk -E XXX.pem -H "Accept: text/xml, multipart/related" -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: \"http://XXX\"" -d @req.xml https://XXX
所以不知道为什么的GlassFish /地铁未在提交客户端证书预计时尚。
关于我可能缺少什么或如何排除故障的任何想法/建议?
我试着设置-Djavax.net.debug = ssl,但字节在GlassFish日志中显示为单独的日志条目,所以它很难读。 我也尝试从容器外的独立Java程序运行它,但后来碰到classpath issues。
谢谢
当跟踪javax.net。debug = ssl我可以清楚地看到***证书请求,但Glassfish在***证书链之后不提供任何证书,因为它与其他实例连接到其他服务器。 – TheArchitect 2013-03-28 01:36:57
我还验证了客户端证书链中的顶级CA与握手过程中服务器提供的证书颁发机构(1)之一相匹配,以及(2)GlassFish cacerts.jks信任库中的证书,因此我不知道为什么GlassFish是不出示客户证书... – TheArchitect 2013-03-28 01:38:43