【问题标题】:WsImport unable to find imported certificateWsImport 找不到导入的证书
【发布时间】:2016-07-18 22:07:39
【问题描述】:

为另一个“找不到证书”问题道歉。

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

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 二进制文件。

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

【问题讨论】:

    标签: java wsdl keytool wsimport pkcs12


    【解决方案1】:

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

    您已将客户端证书(和密钥)导入默认信任库 (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”。

    有关重要 SSL 属性的列表,请参阅此答案:https://stackoverflow.com/a/5871352/2672392

    【讨论】:

    • 我只获得了客户端证书。如何获得服务器证书?当我打开 WSDL 时,我尝试从浏览器中获取它,但它看起来与我的客户端证书非常相似,我无法验证它是否不同。我现在正在使用他们的测试环境,因此证书很可能是自行颁发的(因此“无法找到请求目标的有效证书路径”部分)。
    • @mapto 是的,您可以简单地从浏览器获取服务器证书。它是否是自签名的并不重要。在这两种情况下,您都必须将颁发者添加到信任库。如果是自签名的,则颁发者就是证书本身。
    • 在调试此链接 (gist.github.com/michalbcz/4170520) 中提供的存根 TrustManager 时也非常有用。尽管如此,在生产环境中使用它还是一个安全漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多