从头解决PKIX path building failed

从头解决PKIX path building failed的问题

本篇涉及到PKIX path building failed的缘由和解决办法(包括暂时解决和长效解决的方法),也包括HTTP和HTTPS的区别。java

PKIX path building failed 通俗讲解。

通俗的讲,PKIX path building failed 出现的缘由是由于本身的Java环境没有相关网站的证书而致使的。算法

PKIX path building failed 具体内容。

PKIX的全称为Public-Key Infrastructure (X.509),经过wiki百科咱们能够知道X.509是一种证书的标准,这种标准用在不少网络协议,好比TLS/SSL。而TLS/SSL是HTTPS协议的标准(HTTPS比HTTP多的部分就在于TLS/SSL),因此本文章咱们掌握TLS/SSL的知识。小程序

TLS/SSL协议详解

接下是TLS和SSL的的关系以及其详解api

TLS和SSL的关系

  • SSL 又称Secure Sockets Layers,而TLS又称Transport Layer Security。
  • TLS位于传输层上,而SSL位于传输层和应用层之间。
  • SSL 总共有3版 分别是 1995年的SSL v1.0, 1995年的SSL v2.0, 1996年的SSL v3.0。
  • TLS 目前有四版分别是 1999年的TLS v1.0, 2006年的TLS v1.1, 2008年的TLS v1.2, 2018年的TLS v1.3。
  • SSL 是 TLS 的前身,而且目前已经不推荐使用, TLS v1.0 修正了SSL v3.0中的安全缺陷,可是因为TLS v1.0是能够降级到SSL v3.0因此依旧存在不安全的状况(当你访问使用较低版本的TLS协议或者任意版本的SSL协议时,你的浏览器会提示你,这个时候若是想规避风险,建议就不要继续了。)

TSL 握手机制。

  • TSL handshake
  1. Client 发送 clientHello 到Sever,内容包括
    • 支持的TSL最高版本号
    • cipher suite(一堆支持的加密算法)
    • 客户端随机数
  2. Server 返回ServerHello 到Client,内容包括
    • Server决定的TSL版本号
    • 服务器随机数
    • 选择的cipher suite
  3. Server发送他的certificate message(这里包含了server的public-key)到Client,这里使用证书能够保证public-key是正确的,由于certificate受到可信部门认证。
  4. Server发送ServerHelloDone信息到Client,告诉Client他的handshake已结束
  5. Client 发送ClientKeyExchange message 到 Server。包含:
    • PremasterSecret(这个里面包含的是sharekey,用server的public加密)。 除此以外,Client使用服务端随机数,客户端随机数,PremasterSecret造成share key
  6. Server使用本身的private key 解密 ClientKeyExchange message,并使用服务端随机数,客户端随机数,PremasterSecret造成share key。
  7. client 发送ChangeCipherSpec到Server,目的是告诉Server能够开始使用以上协商的share key了。包含
    • Finished massage:这个是以前握手信息的hash或者MAC(message authentication code (MAC) algorithm)算法的值
  8. Server 收到ChangeCipherSpec,后计算本身本地的内容,检查收到的hash/mac是否和本身的一致,不一致,此次握手将失败,一致发送ChangeCipherSpec到client,目的是告诉Client开始使用协商的share key。

cipher suite 详解

cipher suite 是为了保证链接过程的安全性,其中包括很4种算法原语的组合。客户端和服务器handshake时,由服务器肯定使用的算法,以后由服务器和客户端一块儿使用这样的算法。浏览器

  • 四种算法原语(对于一个cipher suite,只能有一个Kx,一个Au一个Enc,一个MAC,可是这些算法能够选择不一样的)
    • Key Exchange(Kx),常见DH 和 ECDH,(相似TLS握手机制)
    • Authentication (Au),常见DSA/RSA/ECDSA(证书,好比server发送回来的public key 就是放在sever的证书里的,client能够检查这个证书是否有效)
    • Encryption(Enc),主要AES(加密算法,和密码学有关,咱们此处不谈)
    • Message Authentication Code(MAC),常见SHA一、SAH25六、SHA384(对于message,对总体求hash/md等做为单独的tag,即做为客户端检查message完整性和未被篡改的凭证)
解决办法1(不建议)

以前说过HTTPS的网站才有TLS/SSL而PKIX在TLS/SSL中使用,因此咱们能够利用这种方法,把全部想要访问的网站的https://····换为http://····安全

解决方法2(程序内部自动过滤ssl,推荐)

然而有的时候,好比小程序去获取user的openid和session-key时,须要访问https://api.weixin.qq.com/sns/jscode2session,此时由于微信官方的api限制了必须使用https,因此去掉s则会报错。此时咱们采用在本地网络链接时忽略SSL。 我认为,在开发软件时,不少主机若是没有ssl认证,执行须要的网络链接就会失败,因此须要过滤ssl。 能够使用以下的工具类 服务器

如需复制代码请转到httpclient 实现https请求微信

解决办法3(解决maven等出现pkix的问题)

如图位置加入-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true网络

解决方法4 (导入证书)

以前不少博主使用的都不是最新的语法,建议在导入时使用keytool -help看一下最新的导入语法。 cmd在管理员模式进入java jdk 下的jre\lib\security目录。 个人是C:\Program Files\Java\jdk1.8.0_221\jre\lib\security 获取证书的方法能够参考其余博主,比较简单。 使用以下语言导入证书 keytool -importcert -noprompt -trustcacerts -alias xxx(你想要导入的别名) -file "C:\Program Files\Java\jdk1.8.0_221\jre\lib\security\xxx.cer(你的文件的地址)" -keystore "C:\Program Files\Java\jdk1.8.0_221\jre\lib\security\cacerts" -storepass changeitsession

相关文章
相关标签/搜索