我对SSL和Webservices如何在细粒度级别上工作有点痴迷.我正在开发一个调用多个Web服务的系统,其中一些具有安全URL,另一些则没有什么问题.但是,目前我正在与Endicia的LabelServer Web API进行集成.Web服务用于计算和打印邮资.
测试URL和WSDL位于:https://www.envmgr.com/LabelService/EwsLabelService.asmx
我使用wsimport创建和设置一个Java客户端来连接到这个webservice但是当我尝试所有它时我得到了错误
PKIX路径验证失败:java.security.cert.CertPathValidatorException:Path不与任何信任锚链接
此错误记录在此处:Java7拒绝信任信任存储中的证书
其中讨论了Java 7如何使用带有"坏"关键字的自签名证书强制出错.在这种情况下,错误定义为不包含keyCertSign.Web服务确实可以使用Java 6.我可以相信这种情况可能适用于此证书,因为它仅用作测试服务器,但我不知道如何验证.
有一个关于它的错误报告已经解决了(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7018897),但我不确定这些转换如何解决Windows Tomcat的问题环境.我将证书导出到我的机器上,但不确定如何从那里开始.
编辑:我尝试使用OpenSSL修改证书并将其添加到我的密钥库,如"拒绝信任信任存储中的证书"链接中所述,它不起作用.看起来这是一个由证书所有者完成的过程,对吗?我想知道是否有一些方法可以配置我的Java 7环境让这个证书通过.
我们最近更新了一个从Java 6到Java 8的项目,现在我们已经打了一个关于SSL握手的问题.
服务层使用客户端来请求和接收来自第三方应用程序的呼叫.在服务层中,使用初始化密钥库
System.setProperty("javax.net.ssl.trustStore", keyStoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", keyStorePassword);
Run Code Online (Sandbox Code Playgroud)
并通过applicationContext.xml注入:
<property name="keyStoreFile" value="/keystore/keystore.keystore" />
<property name="keyStorePassword" value="password" />
Run Code Online (Sandbox Code Playgroud)
奇怪的是:1.显然,这不是一个完整的文件路径.2.此服务器上没有密钥库(无论Java 6如何都可以使用).
如果出现错误,客户端应该信任所有证书:
/**
* Sets a trust manager that ignores the certificate chains. Use if the
* server has a certificate that can't be verified.
*
*/
private void trustHttpsCertificates() throws Exception {
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return …Run Code Online (Sandbox Code Playgroud)