繁体   English   中英

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

[英]How to use wsimport when server expects client certificate?

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

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

如何设置凭据以便我可以使用wsimport访问URL?

这是我正在尝试的一个例子,但由于无法进行身份验证而超时。

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.

您可以直接调用WsImport java类( 源代码 )并为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"

应该做的伎俩。

我设法通过设置_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

为了理智,长'set'行中的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密钥库,则需要指定它。

最终,唯一的“强制”选项是keyStore ,它定义客户端证书和密钥所在的位置(并且只有在客户端证书不在任何核心Java证书存储区中时才是必需的)。 就目前而言,上面的示例是通过从Windows证书存储区导出PFX文件生成的客户端证书。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM