我有一个使用相互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.
答案 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
这就是全部。