服务器需要客户端证书时如何使用wsimport?

时间:2012-08-07 14:36:14

标签: java web-services jax-ws wsimport

我有一个使用相互SSL身份验证的Web服务。当我安装了客户端证书时,我可以在浏览器中正常访问它。

我需要能够使用wsimport来访问它,以生成访问服务的Java代码。

如何设置凭据以便我可以使用wsimport

访问该网址

以下是我正在尝试的示例,但由于无法进行身份验证而超时。

wsimport ./sample.wsdl -p com.company.ws.sample -Xnocompile -d ./src -extension -keep -XadditionalHeaders

感谢您的帮助

修改:

这是wsimport打印的内容。 WSDL绝对有效,在给定的位置,它是一个确定如何传递我的凭据进行身份验证的问题:

wsimport https://wsdl.location.com?WSDL -p com.company.ws.sample -Xnocompile 
-d ./src -extension -keep -XadditionalHeaders


parsing WSDL...

[ERROR] Received fatal alert: handshake_failure

Failed to read the WSDL document: "https://wsdl.location.com?WSDL", because 1) could 
not find the document; /2) the document could not be read; 3) the root element of 
the document is not <wsdl:definitions>.

[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s): 

 At least one WSDL with at least one service definition needs to be provided.

    Failed to parse the WSDL.

3 个答案:

答案 0 :(得分:8)

您可以直接调用WsImport java类(source)并为Java添加JVM必需的args,知道在哪里查找客户端证书。

这样的东西
java -classpath C:\jdk160_29\lib\tools.jar -Djavax.net.ssl.trustStore=c:\jdk160_29\.mykeystore com.sun.tools.internal.ws.WsImport https://host:8443/Webservice?wsdl -p com.test -s ./src"

应该这样做。

答案 1 :(得分:4)

我设法通过设置_JAVA_OPTIONS环境变量以及要传递的所有额外系统属性来实现此目的;作为Windows批处理文件,它看起来像这样(将密码放在适当的位置:

setlocal
set _JAVA_OPTIONS=%_JAVA_OPTIONS% -Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts" -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword={...passwordForThePFX...} -Djavax.net.ssl.keyStore=r:\cert.pfx
wsimport -s . -verbose https://your.host.name/path/to/service?wsdl
endlocal

出于理智的考虑,长期设置中的Java选项可以解决问题。行是:

-Djavax.net.ssl.trustStore="%JAVA_HOME%\jre\lib\security\cacerts"
-Djavax.net.ssl.keyStoreType=PKCS12
-Djavax.net.ssl.keyStorePassword={...passwordForThePFX...}   
-Djavax.net.ssl.keyStore=R:\cert.pfx

您可能需要也可能不需要trustStore设置;我必须安装几个,而Java正在为我挑选错误的cacerts文件。

同样,如果密钥库没有受密码保护,您将不再需要keyStorePassword。至于keyStoreType,如果您没有访问Java密钥库,则需要指定此项。

最终,唯一的&#34;强制性&#34; option是keyStore,它定义了客户端证书和密钥所在的位置(如果客户端证书不在任何核心Java证书存储中,则它是必需的)。就目前而言,上面的示例是通过从Windows证书存储区导出PFX文件生成的客户端证书。

答案 2 :(得分:2)

我发现更容易(不需要使用-D,classpath,...)来:
1。使用浏览器通过ssl下载wsdl(通过双击密钥库在默认浏览器中安装证书),或者使用soapUI(通过config / ssl安装密钥库)更轻松地显示wsdl内容
2。对下载的wsdl运行wsimport 这就是全部。