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

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 targetat sun.security.ssl.Alerts.getSSLException(Alerts.java:192)

此处以访问天气预报的服务为例,演示相关问题和解决方法。

示例, 访问城市天气预报

在浏览器中通过以下地址可以访问某个城市的天气预报:
https://free-api.heweather.com/v5/forecast?city=CN101220101&key=5c043b56de9f4371b0c7f8bee8f5b75e
返回的结果如下:

可以看到返回的是JSON格式的数据, 在浏览器的地址栏可以看到, 该站点是安全的。

因为Java读取的证书库和浏览器使用的不是同一套, 所以即时浏览器能访问, 使用Java 代码访问的时候, 并不能读到那些证书。 JRE的证书库文件在lib\security的子目录中,文件名是cacerts, 比如: C:\Program Files\Java\jre1.8.0_211\lib\security\cacerts
如果机器安装了JDK , 则证书文件也可能使用的是 "%JAVA_HOME%/jre/lib/security/cacerts" .。

使用HttpClient访问的代码如下:

 @Testpublic void https() throws Exception {String url = "https://free-api.heweather.com/v5/forecast?city=CN101220101&key=5c043b56de9f4371b0c7f8bee8f5b75e";try (CloseableHttpClient httpclient = HttpClients.createDefault()) {HttpGet httpGet = new HttpGet(url);try (CloseableHttpResponse response = httpclient.execute(httpGet)) {System.out.println(response.getStatusLine()); // 获取响应状态,比如 HTTP/1.1 200 OKHttpEntity entity = response.getEntity(); // 获取响应结果String rtn = EntityUtils.toString(entity); // 将结果转换为字符串System.out.println(rtn);EntityUtils.consume(entity); // 如果返回内容是输入流类型, 关闭输入流}}}

如果没有安装证书, 则会出现本篇开篇提到的错误。

解决方案

让HttpClient 可以访问https 站点的解决方案有以下几种:

方法1. 导入站点的证书到Java的证书库文件中
方法2. HttpClient 访问时使用网站的证书进行访问。
方法3. HttpClient 访问https站点时忽略认证
方法4. HttpClient 访问https站点时信任所有证书

方法3 和方法4 在本系列的其他篇进行介绍,这里主要对方法2进行介绍。

HttpClient 访问时使用网站的证书进行访问

  1. 在Chrome下载证书 weather.cer
  2. 将下载的证书导入一个新的证书库文件
  3. HttpClient 访问时加载证书库文件进行访问

1 下载证书

在浏览器中下载证书可以参考:
如何在浏览器中下载网站的https证书

2. 导入证书到证书库文件

keytool -import -alias weather -file weather.cer -keystore cacerts
keytool -import -file weather.cer -keystore weather.keystorechangeit

3. 加载证书库后访问

 @Testpublic void loadKeyStoreAndAccess() throws Exception {SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(new File("D:\\ca\\study\\weather.keystore"), "changeit".toCharArray(), new TrustSelfSignedStrategy()).build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();try {HttpGet httpget = new HttpGet(url);System.out.println("Executing request " + httpget.getRequestLine());CloseableHttpResponse response = httpclient.execute(httpget);try {HttpEntity entity = response.getEntity();System.out.println("----------------------------------------");System.out.println(response.getStatusLine());System.out.println(EntityUtils.toString(entity));EntityUtils.consume(entity);} finally {response.close();}} finally {httpclient.close();}}

备注

笔者在某些机器上测试时, 发现不加载证书库也可以获取结果, 查询之后发现, 本地的Java证书库中已经有天气预报的站点的证书:
该站点证书信息如下:

使用keytool 查看Java中的证书
keytool -list -v -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit

以下命令的显示中有如下证书信息:

别名: comodoaaaca [jdk]
创建日期: 2016-8-25
条目类型: trustedCertEntry所有者: CN=AAA Certificate Services, O=Comodo CA Limited, L=Salford, ST=Greater Manchester, C=GB
发布者: CN=AAA Certificate Services, O=Comodo CA Limited, L=Salford, ST=Greater Manchester, C=GB
序列号: 1
有效期为 Thu Jan 01 08:00:00 GMT+08:00 2004 至 Mon Jan 01 07:59:59 GMT+08:00 2029
证书指纹:MD5:  49:79:04:B0:EB:87:19:AC:47:B0:BC:11:51:9B:74:D0SHA1: D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49SHA256: D7:A7:A0:FB:5D:7E:27:31:D7:71:E9:48:4E:BC:DE:F7:1D:5F:0C:3E:0A:29:48:78:2B:C8:3E:E0:EA:69:9E:F4
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

这个证书的信息会上面查看的证书信息正好吻合。
如果要重现问题, 可以先删除已经安装的证书

keytool -delete -alias "xxx" -keystore  "%JAVA_HOME%/jre/lib/security/cacerts"  -storepass changeit
  • heweather.com 这个站点使用的某个证书机构的根证书
  • 这些根证书是JDK安装的时候就已经信任了的。所以默认这些站点时可以直接访问的。
  • 虽然删除某些证书能在heweather.com重现上面问题, 但建议还是使用本地机器或是内部网站进行测试。参考:

HttpClient 使用证书访问https站点相关推荐

  1. curl+个人证书访问https站点

    目前,大公司的OA管理系统(俗称内网),安全性要求较高,通常采用https的双向 认证模式. 首先,什么是https,简单的说就是在SSL协议之上实现的http协议(get.post等操作) 什么是双 ...

  2. Spring Boot RestTemplate 忽略证书访问https

    在Spring Boot中,RestTemplate 一般使用 @Autowired 注解自动装配, 类似: @Autowiredprivate RestTemplate restTemplate; ...

  3. Spring RestTemplate 访问https站点

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

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

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

  5. IIS 使用OpenSSL 生成的自签名证书,然后使用SingalR 客户端访问Https 站点通信

    使用SignalR 的客户端去发送消息给使用 https 部署的站点,官方文档目前并没有详细的教程,所以在此记录下步骤: 使用管理员身份打开cmd 窗口,选择一个整数保存文件夹的地址,切换到对应的文件 ...

  6. curl+个人证书(又叫客户端证书)访问https站点

    目前,大公司的OA管理系统(俗称内网),安全性要求较高,通常采用https的双向 认证模式. 首先,什么是https,简单的说就是在SSL协议之上实现的http协议(get.post等操作).更多的介 ...

  7. 用curl访问HTTPS站点并登录

    开发网站,少不了测试.现在的网站为了加强安全性,都启用了HTTPS协议.所谓HTTPS,也就是HTTP文本在SSL协议中传输.用curl命令行来测试HTTPS站点是个很有用的功能,写点脚本,就可以做功 ...

  8. curl 忽略证书访问 https

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具.然而在使用cr ...

  9. 无证书访问https外部接口

    楼主公司需要调用gis服务器,但是服务器提供的https请求,同时公司也没有证书,这样会照成访问后不能直接调到接口,需要手动添加证书.所以用一下方式调用https接口可以避免上述情况. java直接访 ...

最新文章

  1. 傅立叶变换、拉普拉斯变换、Z变换之间 篇二
  2. App in Scala
  3. href up test.php,test.php
  4. 计算机考研专业基础知识视频教程链接
  5. Openstack学习笔记(十五)-Horizon源代码学习笔记(五)
  6. oracle下载安装教程
  7. oppor11点击Android,OPPO R11怎么网络共享?OPPO R11三种共享网络设置教程
  8. 证书与签名(二):数字签名流程与签名认证流程
  9. 微信公众平台开发之签到积分查询功能
  10. 千锋教育网络安全课程笔记
  11. DAO:去中心化的新兴领导者
  12. AQS抽象队列同步器原理详解
  13. unity 骨骼物理 头发 布料模拟
  14. ios10之后的一些新特性
  15. [Practical.Vim(2012.9)].Drew.Neil.Tip51 学习摘要
  16. 程序员:不要自称码农
  17. html中如何让两张图片的间隙消失,css怎样处理图片间隙问题?
  18. linux下仿qq聊天源代码,Linux+glade(GTK+)+C语言+mysql的模仿QQ聊天工具(完善版)...
  19. [转]addusernbsp;-nbsp;新增使用者指令(ubu…
  20. cs免杀之基于混淆和加壳

热门文章

  1. HDU 5752.Sqrt Bo
  2. Linux学习之七--mysql的安装使用
  3. [C++][代码库]Vector3空间向量类
  4. (转)matlab 字符串处理函数
  5. centos 下安装mysql
  6. php中用date()取出的当前时间查8个小时的解决方法。
  7. Ubuntu系统桌面任务栏和启动器全部消失解决方案
  8. 2021年终总结模板.pptx(附下载链接)
  9. 快看漫画个性化推荐探索与实践.pdf(附下载链接)
  10. 面试必备资源!程序员面试——算法工程师面试大全第二部分