我正在尝试使用带有 Metro JAX-WS 的 GlassFish 3.1.2.2 连接到合作伙伴 Web 服务,但我收到 HTTP 错误 403.7 - 禁止:需要 SSL 客户端证书。
我已将合作伙伴提供的私钥导入 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 属性设置为这个新键:
$ grep sas domains/dev/config/domain.xml
<jvm-options>-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=XXX</jvm-options>
然后,当我拨打 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>
我有此配置可用于其他 Web 服务,但由于某种原因不适用于此配置...不确定 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/Metro 没有以预期的方式呈现客户端证书。
关于我可能遗漏的内容或如何排除故障的任何想法/建议?
我尝试设置 -Djavax.net.debug=ssl,但字节在 GlassFish 日志中显示为单独的日志条目,因此非常难以阅读。我还尝试从容器外部的独立 Java 程序运行它,但后来我遇到了类路径问题。
谢谢