从头解决PKIX path building failed的问题

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

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的的关系以及其详解

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),常见SHA1、SAH256、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 changeit

从头解决PKIX path building failed的更多相关文章

  1. 解决PKIX path building failed

    起因 上周在生产环境部署时,把安全证书加到k8s-ingress中时发现报该错误 解决 找网上解决方案,因为这种问题相对比较少见,也没百度,直接谷歌,找到解决方案如下:https://stackove ...

  2. 解决PKIX path building failed的问题

    Java在请求某些不受信任的https网站时会报:PKIX path building failed 解决方法一:使用keytool手动导入证书,为JRE环境导入信任证书 参考:http://www. ...

  3. 解决 java 使用ssl过程中出现"PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"

    今天,封装HttpClient使用ssl时报一下错误: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExc ...

  4. 解决PKIX(PKIX path building failed) 问题 unable to find valid certification path to requested target

    最近在写java的一个服务,需要给远程服务器发送post请求,认证方式为Basic Authentication,在请求过程中出现了 PKIX path building failed: sun.se ...

  5. 抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法

    抓取https网页时,报错sun.security.validator.ValidatorException: PKIX path building failed 解决办法 原因是https证书问题, ...

  6. 解决CAS单点登录出现PKIX path building failed的问题

    在一次调试中,出现了这个错误: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExceptio ...

  7. 解决 sun.security.validator.ValidatorException: PKIX path building failed

    今天用java HttpClients写爬虫在访问某Https站点报如下错误: sun.security.validator.ValidatorException: PKIX path buildin ...

  8. jsoup访问页面: PKIX path building failed

    在用jsoup访问页面时报错javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX p ...

  9. 异常信息:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

    上周五遇到一个问题,工程本地编译运行正常,打包本地tomcat运行也正常.部署到测试环境报错: 2017-05-05 09:38:11.645 ERROR [HttpPoolClientsUtil.j ...

随机推荐

  1. 55)PHP,在html嵌套PHP写法

    样例代码:

  2. 吴裕雄--天生自然python机器学习:决策树算法

    我们经常使用决策树处理分类问题’近来的调查表明决策树也是最经常使用的数据挖掘算法. 它之所以如此流行,一个很重要的原因就是使用者基本上不用了解机器学习算法,也不用深究它 是如何工作的. K-近邻算法可 ...

  3. D - Project Presentation(DFS序+倍增LCA)

    You are given a tree that represents a hierarchy in a company, where the parent of node u is their d ...

  4. 总结oracle18.3c-centos7-安装

    官网下载对应名字rpm包 oracle-database-ee-18c-1.0-1.x86_64.rpm下载依赖包 除非已有依赖 否则会报缺少依赖错误 1 curl -o oracle-databas ...

  5. Python--继承、封装、多态

    大概每个人在学生时代开始就使用Java了,我们一直在学习Java,但Java中总有一些概念含混不清,不论是对初级还是高级程序员都是如此.所以,这篇文章的目的就是弄清楚这些概念. 读完本文你会对这些概念 ...

  6. Qt 使用自带的OpenGL模块开发程序

    QT中使用opengl .pro文件中添加 QT += opengl 1.使用指定版本的OpenGL如下使用opengl4.5调用方法,使用指定版本的接口,必须设备图形显示设备支持对应OpenGL版本 ...

  7. spring boot原理分析启动依赖中parent帮我们干了什么

    主要内容: 1:分析spring-boot-starter-parent 这个依赖 通过前面几篇文章的学习,我们感受到了spring boot的魅力.最明显的感觉就是pom.xml文件.代码少了很多. ...

  8. MySQL之数据存储引擎

    1.什么是存储引擎: 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处 理文本用txt类型,处理表格用excel,处理图片用png等,数据库中的表也应该有不同的 ...

  9. Linux考试试题

    mkdir -p /data/oldboy touch lodboy.txt echo "inet addr:10.0.0.8  Bcast:10.0.0.255 Mask:255.255. ...

  10. java中的二维数组基础知识

    二维数组基本知识,毕竟常见的有:概念,初始化,遍历 概念: 理解二维数组,首先要先理解一维数组是什么.一维数组是个容器,存储相同数据类型的容器(这里不再做一位数组的具体介绍).二维数组就是用来存储一维 ...