我是基于 Https/SSL 的配置的新手。我正在尝试调用启用了客户端身份验证的简单计算器 Web 服务。以下是我的 tomcat(1) 的 server.xml 中的连接器条目
<Connector clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\cert\server.jks"
keystoreType="JKS" keystorePass="password"
truststoreFile="C:\cert\server.jks"
truststoreType="JKS" truststorePass="password"
SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS"
keyAlias="servercert"
/>
我正在使用 MyEclipse 生成的客户端来执行此操作(在启用 SSL 之前生成,然后将 wsdl url 更改为指向新的 HTTPS 连接)。我使用的 WSDL url 是:
https://localhost:8443/MyService/CalculatorPort?wsdl
我在另一个 tomcat(2) 中托管这个客户端。这是 tomcat(2) 的 server.xml 条目:
<Connector port="8444" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\Cert\servcert"
keystorePass="password"
keyAlias="servcert"
/>
但是现在当我调用 Web 服务时,它给了我以下错误
javax.xml.ws.WebServiceException: Failed to access the WSDL at: https://localhost:8443/MyService/CalculatorPort?wsdl. It failed with:
Software caused connection abort: recv failed.
com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:162)
com.sun.xml.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:144)
com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:263)
com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:226)
com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:174)
com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:104)
javax.xml.ws.Service.<init>(Service.java:56)
com.myeclipseide.ws.CalculatorService.<init>(CalculatorService.java:54)
org.apache.jsp.index_jsp._jspService(index_jsp.java:86)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
笔记:
- 当仅启用服务器端 SSL 并禁用客户端身份验证时,它工作正常。
- 我已将 JDK 的 cacert 密钥库中的服务器证书和客户端证书作为可信证书导入。
- 如果我在浏览器中导入证书,即使启用了客户端身份验证,我也可以访问 WSDL。但是当我通过启用客户端身份验证的tomcat(2)中托管的客户端访问它时,它不起作用。
在我看来,客户端没有使用我配置为 tomcat(2) 的 server.xml 一部分的密钥库。但我不确定。请帮我解决这个问题。