SSL链接一个很奇怪的错误

  • 背景

       
       
    1. git代码相同,数据库相同的情况下,测试版本报异常,但是本地的开发版没有异常出现,同事电脑上的代码和数据库都一致,也报异常。一直搞不懂原因。联想到最近换了SSL证书,排除证书过期,域名不一直以后,google之,得到答案,参考[这里](https://stackoverflow.com/questions/26180650/unable-to-find-valid-certification-path-to-requested-target-but-browser-says),发现证书链在根证书中没有被信任。
  • 异常报告

       
       
    1. Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    2. Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    3. Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
  • 异常原因

    • 原因一:你的SSL证书和域名不匹配

           
           
      1. 就是颁发的证书域名和你真正访问的域名不一致
    • 原因二:证书链不完整

           
           
      1. 证书链由两个环节组成—信任锚(CA 证书)环节和已签名证书环节。自我签名的证书仅有一个环节的长度—信任锚环节就是已签名证书本身。
      2. 证书链可以有任意环节的长度,所以在三节的链中,信任锚证书CA 环节可以对中间证书签名;中间证书的所有者可以用自己的私钥对另一个证书签名。CertPath API 可以用来遍历证书链以验证有效性,也可以用来构造这些信任链。
      3. 证书最初生成时是一个自签名证书。自签名证书是其签发者(签名者)与主题(其公共密钥由该证书进行验证的实体)相同的证书。如果拥有者向 CA 发送证书签名请求 (CSR),然后输入响应,自签名证书将被证书链替换。链的底部是由 CA 发布的、用于验证主题的公共密钥的证书(回复)。链中的下一个证书是验证 CA 的公共密钥的证书。通常,这是一个自签名证书(即,来自 CA、用于验证其自身的公共密钥的证书)并且是链中的最后一个证书。
      4. 在其他情况下,CA 可能会返回一个证书链。在此情况下,链的底部证书是相同的(由 CA 签发的证书,用于验证密钥条目的公共密钥),但是链中的第二个证书是由其他 CA 签发的证书,用于验证您向其发送了 CSR CA 的公共密钥。然后,链中的下一个证书是用于验证第二个 CA 的密钥的证书,依此类推,直至到达自签名的[根证书]。因此,链中的每个证书(第一个证书之后的证书)都需要验证链中前一个证书的签名者的[公共密钥]。

      微信截图_20180113110420.png

    • 根证书没有被信任

           
           
      1. 证书链是由根证书-----CA-----已签名证书这条证书链依次被信任,如果根证书不被信任,那么由该根证书签发的所有颁发者证书都不被信任,进而导致颁发者颁发的所有证书都不被信任
  • 解决办法

    • 换个证书,换个JRE中默认被信任根证书签发的CA证书颁发的证书(这里提供jre中默认信任的证书列表)

           
           
      1. 算了,给出查找方法吧,在配置好java运行环境的情况下,
      2. windows运行
      3. keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts
      4. Linux运行
      5. keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
      6. 输入密钥库口令: <直接回车>
      7. ***************** WARNING WARNING WARNING *****************
      8. * 存储在您的密钥库中的信息的完整性 *
      9. * 尚未经过验证! 为了验证其完整性, *
      10. * 必须提供密钥库口令。 *
      11. ***************** WARNING WARNING WARNING *****************
      12. 密钥库类型: JKS
      13. 密钥库提供方: SUN
      14. 您的密钥库包含 104 个条目
      15. ....
      16. 然后这里会列出你所有的被信任的根证书颁发者
    • 手动将你的证书,CA证书和根证书引入到jre的信任列表中

           
           
      1. windows:
      2. keytool -import -alias my-cert -file c:\cert.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts
      3. linux:
      4. keytool -import -alias my-cert -file /your/cert/path/cert.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值