WsImport 无法找到导入的证书

WsImport unable to find imported certificate

对另一个 "unable to find certificate" 问题表示歉意。

我正在 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

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

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

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 class 而不是二进制文件来确保我明确使用的信任库):

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 class 不再存在,所以我使用 wsimport.exe 二进制文件。

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

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

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

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

有关重要 SSL 属性的列表,请参阅此答案: