java - WsImport 找不到导入的证书

标签 java wsdl keytool wsimport pkcs#12

对另一个“无法找到证书”问题表示歉意。

我正在 Windows 7 计算机上进行开发。我正在使用多个 Java 版本,因此明确了所使用的 java 版本(此处为 Java6)的路径。我通过以下两行实现了这一点:

set path=c:\Program Files\Java\jdk1.6.0_45\bin;%path%
set java_home=c:\Program Files\Java\jdk1.6.0_45

我需要使用第三方网络服务 https://service.gov/Service.svc?wsdl提供certificate.PFX证书(服务URI和证书文件都被重命名,以保护第3方的利益)。我已确保在 Windows 中导入证书文件后,我可以在浏览器中打开 WSDL 文件。

我首先将证书导入我的 keystore 中(使用管理员命令提示符获得在系统文件夹中写入的权限):

keytool -importkeystore -srckeystore certificate.pfx -srcstoretype pkcs12 -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts"

我收到成功通知。尽管如此,我还是确保新证书出现在以下输出中:

keytool -list -keystore "c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts"

然后我创建一个新文件夹,其中包含名为 src 和 classes 的空白子文件夹。完成此操作后,我从该新文件夹运行 wsimport(使用 Java 类而不是二进制文件以确保我明确了解正在使用的信任库):

java -classpath "c:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" -Djavax.net.ssl.trustStore="c:\Program Files\Java\jdk1.6.0_45\jre\lib\security\cacerts" -Djavax.net.ssl.trustStorePassword=changeit com.sun.tools.internal.ws.WsImport https://service.gov/Service.svc?wsdl -s src -d classes

输出如下:

parsing WSDL...

[ERROR] sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Failed to read the WSDL document: https://service.gov/Service.svc?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.

WSDL 文件包含并由其他组织使用,因此问题肯定不属于第 3 方。

我错过了什么吗?对我来说,现在一切似乎都很明显了,但仍然不起作用。我也用Java8尝试过,结果几乎是一样的。唯一的区别是,在 Java8 中,WsImport 类不再存在,因此我使用 wsimport.exe 二进制文件。

预先感谢您的任何想法或提示。

最佳答案

pfx 文件(包含证书和私钥)用于客户端身份验证,而信任库用于验证服务器证书。了解 keystore 信任库之间的区别非常重要。

您已将客户端证书(和 key )导入到默认信任库 (cacerts) 中。你应该做的是:

  1. 将服务器 SSL 证书的颁发者 (CA) 导入到 cacerts 中。如果 CA 证书已在 cacerts 中,则可以跳过此步骤,这里可能就是这种情况。
  2. 使用 pfx 文件作为客户端身份验证的 keystore 。最简单的方法就是将其转换为jks:https://stackoverflow.com/a/3054034/2672392要传递给 wsimport 的属性是“javax.net.ssl.keyStore”和“javax.net.ssl.keyStorePassword”。

请参阅此答案以获取重要 SSL 属性的列表:https://stackoverflow.com/a/5871352/2672392

关于java - WsImport 找不到导入的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316716/

相关文章:

java - MoneyFormatter::parseMoney 抛出 MoneyFormatException

java - JScrollPane 内使用 <html> 标签自动换行 JLabel - 删除水平栏功能/逻辑

java - WSDL 使用 - 使用什么工具?

java - 使用 keytool 的 key 对和自签名证书之间的区别?

java - 如何在没有 CSR 的情况下在 Tomcat 中安装 GoDaddy SSL 证书?

java - AVA 格式不正确 : BlackBerry WebWorks SDK

java - struts 到 javascript 的字符串变量

java - 当父标签属性值唯一时,如何获取父标签的标签值?

java - 不用eclipse通过ant生成webservice

soap - Oracle Service Bus 中如何使用 WSDL?