10

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

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

如何设置我的凭据以便我可以使用 访问 URL 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.
4

3 回答 3

13

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

就像是

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"

应该做的伎俩。

于 2012-11-29T16:31:39.623 回答
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

为了理智起见,长 '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 证书存储中时才是强制性的)。就目前而言,上面的示例适用于 PFX 文件中的客户端证书,该文件是通过从 Windows 证书存储中导出而生成的。

于 2013-10-14T15:29:55.557 回答
2

我发现更容易(无需使用 -D,类路径,...):
1. 使用浏览器通过 ssl 下载 wsdl(通过双击密钥库在默认浏览器中安装证书)甚至更容易使用显示 wsdl 内容的 soapUI(通过 config/ssl 安装密钥库)
2. 对下载的 wsdl 运行 wsimport
就是这样。

于 2014-10-28T08:28:36.410 回答