为另一个“无法找到证书”的问题道歉。
我正在使用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二进制文件。
提前感谢任何想法或提示。
答案 0 :(得分:1)
pfx文件(包含证书和私钥)用于客户端身份验证,而信任库用于验证服务器证书。了解密钥库与信任库之间的区别非常重要。
您已将客户端证书(和密钥)导入默认信任库(cacerts)。你应该做的是:
javax.net.ssl.keyStore
”和“javax.net.ssl.keyStorePassword
”。 有关重要SSL属性的列表,请参阅此答案:https://stackoverflow.com/a/5871352/2672392