0

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)

ノート:

  1. サーバー側の SSL のみが有効で、クライアント認証が無効になっている場合は、正常に機能します。
  2. サーバーとクライアントの証明書を信頼できる証明書として JDK の cacert キーストアにインポートしました。
  3. ブラウザで証明書をインポートすると、クライアント認証が有効になっていても WSDL にアクセスできます。しかし、クライアント認証が有効になっている tomcat(2) でホストされているクライアント経由でアクセスすると機能しません。

Tomcat(2) の server.xml の一部として設定したキーストアをクライアントが使用していないように思えます。しかし、よくわかりません。この問題で私を助けてください。

4

1 に答える 1

0

この問題の解決策を見つけました。基本的に、クライアントをホストする tomcat(2) は、意図した証明書を使用していませんでした。解決策は、Tomcat の起動時に次の JVM 変数を渡すことです

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

これらのドキュメントは、Google で簡単に見つけることができます。これらは、catalina.bat/catalina.sh ファイルで JAVA_OPTS として構成できます。

于 2012-11-19T07:20:55.210 に答える