【问题标题】:How to use wsimport when server expects client certificate?当服务器需要客户端证书时如何使用 wsimport?
【发布时间】:2023-03-26 21:36:01
【问题描述】:

我有一个使用相互 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.

【问题讨论】:

  • 分享您遇到的错误/异常堆栈跟踪有助于其他人理解问题。
  • 我已更新帖子以显示更多详细信息。谢谢

标签: java web-services jax-ws wsimport


【解决方案1】:

您可以直接调用 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"

应该可以解决问题。

【讨论】:

  • Exception in thread "main" java.lang.NoSuchFieldError: theInstance 对我来说失败了,但是我找到了替代方案。
【解决方案2】:

我通过设置 _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 证书存储中导出而生成的。

【讨论】:

  • 谢谢。就我而言,我还需要包含 -Djavax.net.ssl.trustStorePassword
【解决方案3】:

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

【讨论】:

  • 应该将选项-wsdllocation &lt;actualWsdlLocationURI&gt; 添加到wsimport,否则生成的webservice 类将指向wsdl 的绝对本地路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多