WsImport无法找到导入的证书

时间:2016-03-30 18:21:40

标签: java wsdl keytool wsimport pkcs12

为另一个“无法找到证书”的问题道歉。

我正在使用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证书的第三方Web服务https://service.gov/Service.svc?wsdl(服务URI和证书文件都重命名为保护第三方利益的方式)。我确保在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类而不是二进制文件,以确保我明确表示正在使用的信任库):

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文件包含并被其他组织使用,所以问题肯定不在第三方的一边。

我错过了什么吗?对我来说,这一切现在看来显而易见,但它仍然无效。我也尝试过使用Java8,结果几乎相同。唯一的区别是在Java8中,WsImport类不再存在,所以我使用的是wsimport.exe二进制文件。

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

1 个答案:

答案 0 :(得分:1)

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

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

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