java程序在访问https资源时,出现报错
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
这本质上,是java在访问https资源时的证书信任问题。如何解决这个问题呢?
为何有这个问题?
解决这个问题前,要了解
1)https通信过程
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
2)java程序的证书信任规则
如上文所述,客户端会从服务端拿到证书信息。调用端(客户端)会有一个证书信任列表,拿到证书信息后,会判断该证书是否可信任。
如果是用浏览器访问https资源,发现证书不可信任,一般会弹框告诉用户,对方的证书不可信任,是否继续之类。
Java虚拟机并不直接使用操作系统的keyring,而是有自己的security manager。与操作系统类似,jdk的security manager默认有一堆的根证书信任。如果你的https站点证书是花钱申请的,被这些根证书所信任,那使用java来访问此https站点会非常方便。因此,如果用java访问https资源,发现证书不可信任,则会报文章开头说到的错误。

解决问题的方法
1)将证书导入到jdk的信任证书中(理论上应该可行,未验证)
2)在客户端(调用端)添加逻辑,忽略证书信任问题
第一种方法,需要在每台运行该java程序的机器上,都做导入操作,不方便部署,因此,采用第二种方法。下面贴下该方法对应的代码。
验证可行的代码
1)先实现验证方法
HostnameVerifier hv = new HostnameVerifier() {public boolean verify(String urlHostName, SSLSession session) {System.out.println("Warning: URL Host: " + urlHostName + " vs. "+ session.getPeerHost());return true;}};private static void trustAllHttpsCertificates() throws Exception {javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];javax.net.ssl.TrustManager tm = new miTM();trustAllCerts[0] = tm;javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, null);javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}static class miTM implements javax.net.ssl.TrustManager,javax.net.ssl.X509TrustManager {public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {return true;}public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {return true;}public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)throws java.security.cert.CertificateException {return;}public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)throws java.security.cert.CertificateException {return;}}

2)在访问https资源前,调用
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);

参考文档(本文其实是将这三篇文章中,相关的内容整合到一起):
http://blog.csdn.net/mingli198611/article/details/8055261《HTTP和HTTPS详解》
http://www.cnblogs.com/wupher/archive/2012/08/05/2623561.html《使用Keytool为JDK添加https证书信任》
http://mengyang.iteye.com/blog/575671《解决PKIX path building failed的问题》

java在访问https资源时,忽略证书信任问题相关推荐

  1. jodd忽略ssl证书_关于java访问https资源时,忽略证书信任问题

    java程序在访问https资源时,出现报错 sun.security.validator.ValidatorException: PKIX path building failed: sun.sec ...

  2. Java:使用split方法时忽略中英文的符号区别

    Java:使用split方法时忽略中英文的符号区别 split(",|,")

  3. HttpClient访问https,设置忽略SSL证书验证

    访问https时报错:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provid ...

  4. 浏览器请求状态码为空,谷歌net::ERR_INSECURE_RESPONSE, 火狐Network error安全性错误无法载入此资源 ,IE网络错误0x800c0019访问此资源的安全证书无效问题

    这几天刚入职老板让我解决的一个跨域问题,解决一半之后发生了这个证书问题,由于项目是内网开发,而且上级已经无法下发新的证书,特此记录一下这个问题. 环境:linux下的nginx,前端 和 后台java ...

  5. https遇到自签名证书/信任证书

    对于CA机构颁发的证书Okhttp默认支持 可以直接访问 但是对于自定义的证书就不可以了(如:https ://kyfw.12306.cn/otn/), 需要加入Trust 下面分两部分来写,一是信任 ...

  6. HttpClient 使用证书访问https站点

    使用HttpClient访问https 站点时,如果JRE或者JDK没有导入某个站点的证书,则会报如下错误: javax.net.ssl.SSLHandshakeException: sun.secu ...

  7. Spring RestTemplate 访问https站点

    RestTemplate 是Spring对HttpClient的封装, API的调用和结果的解析更简单了.举例来说,访问一个站点并获取结果的代码只需要两行代码就可以了,类似: String url = ...

  8. java忽略证书验证(兼容http,https)

    概述 日常上传.下载文件时可能有不需要验证证书的场景,比如证书过期.不正确之类的也可以正常的上传下载文件. Java中使用https协议时,是通过X.509证书进行校验的. 首先我们先了解下什么是X. ...

  9. HttpClient 忽略证书直接访问https站点

    使用HttpClient访问https 站点时,如果Java没有导入该站点的证书的话,则会报如下错误: javax.net.ssl.SSLHandshakeException: sun.securit ...

最新文章

  1. spine - unity3D(摘自博主softimagewht)
  2. 打开git命令窗口_用动图的形式打开 10 大 Git 命令?
  3. 关于UITableView的Cell zhuanzai
  4. [六字真言]1.唵.遁入佛门之异常.md
  5. URLRewiter使用
  6. contenttype文件ajax_jquery ajax contentType设置
  7. golang语言渐入佳境[29]-math包核心方法
  8. openwrt路由器更换了Flash之后需要修改的源码
  9. 应用案例 | 2018款奥迪 A4 Avant 车发动机无法起动故障诊断
  10. react项目 上线配置流程
  11. java中时间类型转换_java中时间类型转换
  12. CSS普通属性篇(一):relative与absolute
  13. 使用Python开发游戏运行脚本(一)成功调用大漠插件
  14. 微信小程序的推广方案有哪些
  15. c语言二分答案最小值,C语言程序设计第2版课后习题答案(贾宗璞许合利人民邮电-第2版).doc...
  16. java暗装没有快捷键_全网最全最硬最实用的idea 使用技巧与快捷键,开发必备的百分百快捷键...
  17. angular12简单搭建项目的过程记录
  18. 超火的数码产品犀牛rhino模型素材网站合集看过来
  19. 10项目管理--项目沟通管理
  20. Redis 数据库keys 命令的模糊查询

热门文章

  1. AtCoder beginner contest 43 (ABC 43)题解
  2. 如何做好前端代码规范,让你的代码更丝滑
  3. 前端代码规范(阿里) --- Vue
  4. 魔众相册系统 v1.2.0 系统内核升级,界面显示优化
  5. 【自动驾驶模拟器AirSim快速入门 | 01】自动驾驶模拟器AirSim实战演练
  6. 怎么对document.write写出来的内容调整对齐方式_干不过写PPT的?麦肯锡老阿姨教你4招...
  7. 泰尔解说Google云计算业务:关键在于垄断
  8. IFS系统功能清单之七——人力资源(Human Resources)
  9. U盘防拷贝选择隐大师
  10. Android 开发技巧总结(二)