当前位置: 首页 > 知识库问答 >
问题:

PKIX 路径不会与 Windows 环境中的任何信任锚错误链接

司寇研
2023-03-14

对于SSL和Webservices如何在细粒度级别上工作,我有点傻。我正在开发一个调用几个web服务的系统,其中一些有安全的URL,另一些没有问题。然而,目前我正在与Endicia的LabelServer Web API进行集成。webservice用于计算和打印邮资。

测试网址和WSDL在:https://www.envmgr.com/LabelService/EwsLabelService.asmx

我使用wsimport创建并设置了一个Java客户端以连接到这个Web服务,但当我尝试全部时,我得到了错误

PKIX路径验证失败:java.security.CertPathValidatorException:路径未与任何信任锚点链接

此错误记录在此处:Java7拒绝信任信任存储中的证书

其中讨论了Java7如何强制使用具有“错误”密钥用法的自签名证书出错。这种情况下的错误定义为不包含keyCertSign。Web服务可以与Java 6一起使用。我相信这种情况可能适用于此证书,因为它只是用作测试服务器,但我不知道如何验证这一点。

有一个关于它的错误报告已经解决了(http://bugs.java.com/bugdatabase/view_bug.do?bug_id=7018897),但我不确定这些如何转化为修复Windows Tomcat环境的问题。我将证书导出到我的机器上,但是我不确定如何从那里继续。

编辑:我尝试使用OpenSSL修改证书并将其添加到我的密钥库,如“拒绝信任信任存储中的证书”链接中所述,但没有成功。这似乎是一个由证书所有者完成的过程,对吗?我想知道是否有办法配置我的Java7环境来让这个证书通过。

共有3个答案

宣高朗
2023-03-14

尝试使用密钥工具将所需的证书导入到位于jdk_xxx/jre/lib/安全性/存储/存储中的 Java 信任库中

设置 jvm 参数 Djavax.net.debug=ssl 以查看更多调试信息

钱经赋
2023-03-14

Java 6和Java 7之间的证书链验证逻辑确实发生了变化。似乎证书链被认为是无效的,因为中间证书的有效结束日期在根证书的有效结束日期之后。这是一个Java错误,已在JDK 1.7.0_72和1.8.0_25中修复。

如果您无法升级 JDK,这里有一个解决方法,因为您说处于调试环境中,并且您可以控制密钥库。当然,您无法更改任何证书(因为您没有私钥),但您可以将中间证书或服务器证书导入本地密钥库,这意味着默认情况下它将受到信任,并且链的其余部分会毫无问题地进行验证。

  1. 下载www.envmgr.comwww.starfieldtech.com的证书trusted_certificate.pem
  2. 使用keytools将证书导入名为my_keystore的本地密钥库,并使用keytools-keystoremy_keystore-import cert-filetrusted_certificate.pem
  3. 启动wsimport-J-Djavax.net.ssl.trustStore=my_keystorehttps://www.envmgr.com/LabelService/EwsLabelService.asmx
明越
2023-03-14

默认的Java证书检查非常严格,而且显然越来越严格。一种解决方法是用自定义的< code>X509TrustManager初始化< code>SSLContext。一个什么都不做的信任管理器,也就是完全不安全的,我曾经为测试而写的,看起来像这样:

TrustManager[] trustAllCerts = new TrustManager[]{
   new X509TrustManager() {
      public java.security.cert.X509Certificate[] getAcceptedIssuers()
         {
            return null;
         }
      public void checkClientTrusted(
         java.security.cert.X509Certificate[] certs,
         String authType )
         {
         }
      public void checkServerTrusted(
         java.security.cert.X509Certificate[] certs,
         String authType )
         {
         }
   }
};

显然,您希望在实际程序中实际检查证书链。然后,您可以尝试使用它来初始化 SSL 上下文,如果您的 API 没有其他配置 SSL 的方法,则可以调用 SSL 上下文。如果 API 使用默认的 SSL 上下文,那么这应该可以正常工作。

在这种情况下,密钥用法似乎不是问题,因为证书链不是自签名的。测试 URL 似乎显示叶证书不是自签名的,并且 (2) 链中的其他两个证书似乎启用了证书签名。另一种可能性是 Java 6 和 Java 7 具有单独的信任存储区,并且根证书不在 Java 7 存储区中。您可能需要仔细检查一下。如果您有权访问 OpenSSL,则可以使用以下命令从服务器获取证书链:

openssl s_client -host www.example.com -port 443 -showcerts

显然,更新信任存储是关键(双关语)。业务方案报告:

我下载了适用于 Windows 64 的 OpenSSL,然后使用此命令下载证书链:

openssl s_client -host www.webserviceurl.com -port 443 -showcerts > c:\temp\certchain_output.crt

然后,我想这样将其导入浏览器的密钥库(从JDK的主目录/jre/lib/security):

keytool -import -alias ca -file certchain_output.crt -keystore cacerts -storepass changeit

我相信使用X509TrustManager也可以提供有效的解决方案

 类似资料:
  • 我正在尝试使用wsse:BinarySecurityToken(ValueType=)验证来自windows密钥库的CA证书http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3),但它通过一个异常失败:java.security.cert.CertPathValidatorExce

  • 问题内容: android应用有三台主机进行身份验证和授权。最终主机是REST API。首次使用Oauth身份验证和授权过程,它可以正常工作。 但是,如果 用户 在登录并访问REST API提供的服务后 杀死了该应用程序 ,然后再次打开该应用程序,则会出现此问题。 在这段时间内,身份验证和授权过程不会发生,只有REST API会发生。 这是造成原因, 但在首次使用(登录然后使用该应用程序)期间正在

  • 我正在Android上开发一个客户端应用程序,它连接到我的服务器,它在负载均衡器后面的AWS上,我在GoDaddy上创建了一个SSL证书,并将其添加到负载均衡器上。 浏览器上的一切都很顺利,它可以识别证书,但是当我试图用Android调用API时,我遇到了一个例外: 我找到了一些讨论谁说在app上添加证书,但是在证书服务器端是不是就没有办法修复了呢?这不是证书的问题吗?

  • 我遇到了Android4设备的一个问题,它在连接到服务器时收到以下异常: 但出于某种原因,我不明白它在Android4版本中开始失败了。 我尝试了信任所有证书的解决方案[LINK],它起作用了,但这显然存在安全问题,比如将您的应用程序暴露于“中间人”攻击 如何实现具有默认行为但仅将服务器的证书白名单的TrustManager。 在证书链给了我两个证书的格式: 用获得的url和证书替换了示例中的ur

  • 问题内容: 我正在尝试建立与HTTPS站点的连接,并且我GOT打印例外:。 我的原始代码如下: 然后,我在这里阅读了Google的文章,并将代码修改为: 关于文件,我使用此站点来检查该站点的证书。我发现了3个证书,我不知道该使用哪个证书。我一一尝试。 一个名称“ VeriSign 3类公共主要证书颁发机构-G5”导致以下例外: 当我使用一个名称为“ VeriSign Class 3 Secure

  • 问题内容: 在我的服务器(生产服务器)中,我具有goDaddy ssl证书。我有iOS和Android应用程序都与服务器连接,iOS都没有问题连接,Android版本为4. 一切都很好,但是设备版本为2.3。我总是收到SSLHandshakeException。 我在Android开发人员页面(https://developer.android.com/training/articles/secu