java - Web服务客户端身份验证导致Tomcat异常

标签 java web-services tomcat ssl https

我是基于 Https/SSL 的配置的新手。我正在尝试调用启用了客户端身份验证的简单计算器 Web 服务。以下是来 self 的 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"
/>

但是现在当我调用网络服务时,它给我以下错误

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)

注意:

  1. 当仅启用服务器端 SSL 而禁用客户端身份验证时,它工作正常。
  2. 我已在 JDK 的 cacert keystore 中导入服务器和客户端的证书作为受信任的证书。
  3. 如果我在浏览器中导入证书,即使启用了客户端身份验证,我也能够访问 WSDL。但是,当我通过启用了客户端身份验证的 tomcat(2) 中托管的客户端访问它时,它不起作用。

在我看来,客户端没有使用我配置为 tomcat(2) 的 server.xml 的一部分的 keystore 。但我不确定。请帮我解决这个问题。

最佳答案

我找到了解决这个问题的方法。基本上托管客户端的 tomcat(2) 没有使用我想要的证书。解决方案是在tomcat启动时传递如下JVM变量

  • javax.net.ssl.keyStore
  • javax.net.ssl.keyStorePassword

这些文档可以很容易地在谷歌上找到。它们可以在 catalina.bat/catalina.sh 文件中配置为 JAVA_OPTS

关于java - Web服务客户端身份验证导致Tomcat异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880134/

相关文章:

java - 无法从/hibernate.cfg.xml 加载配置

java - Apache ivy 与 Eclipse 和多个项目

java - 当部署在 Glassfish 中时,基于 Spring-WS 的 SOAP 服务返回 405

由于 Mac OS X 上的 'java.net.SocketException Invalid argument',Tomcat 启动失败

java - 在 Android 设备中获取已安装软件包列表的最快方法

java - 我想从服务器下载文件并在 android 中查看具有各种文件扩展名的文件,例如(pdf,doc,mp4,jpeg))

java - 错误 415 不支持的媒体类型 : POST not reaching REST if JSON, 但如果 XML

php - SOAP wsdl,授权

session - 使用嵌入式 tomcat 7 java 覆盖默认 session 管理器

java - intellij idea中tomcat运行配置启动时间长