本篇主要描述JAVA经常遇到的场景:不校验服务器CA证书。主要包含以下内容:

  • HttpsURLConnection不校验服务器CA证书
  • Spring RestTemplate不校验服务器CA证书

HttpsURLConnection不校验服务器CA证书

有些情况下,虽然服务器端使用的是https协议,但是其证书不是由权威机构颁发的,客户端如果使用jdk默认的证书会校验失败。为了在项目初期进行调试,我们可以忽略服务器证书校验。由前一篇文章可知,要达到不校验服务器证书的目的,必须将hostname校验和CA证书校验同时关闭。
要忽略hostname校验,可以通过前一篇文章JAVA中HTTPS那些事儿中的HostnameVerifier小节介绍的case4场景来实现。要忽略证书校验,则需要自定义SSLSocketFactory。整体代码如下:

public void ignore() throws NoSuchAlgorithmException, KeyManagementException {// 自定义证书校验器TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }}};SSLContext sc = SSLContext.getInstance("SSL");sc.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());// 自定义hostname校验器HostnameVerifier allHostsValid = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}};HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);}

从代码中可以看到setDefaultSSLSocketFactory和setDefaultHostnameVerifier都是HttpsURLConnection的静态方法,也就是此处的设置是全局的。所以在进行实际的HTTPS访问前,调用一次ignore方法,即可在后续所有的HTTPS访问中达到不校验服务器CA证书的目的。

Spring RestTemplate不校验服务器CA证书

Spring中的RestTemplate是用于访问Restful服务的便捷工具类,该类依靠更下层的组件来完成网络请求。默认使用JDK中的HttpURLConnection,同时支持配置Apache HttpComponents HttpClient(4.3+)、OkHttp(2.x and 3.x)、Netty4。所以要使RestTemplate在访问HTTPS服务时忽略证书校验,其实需要配置的是底层的实现组件。

  • 如果使用默认实现HttpURLConnection,如果要忽略证书只需要按照前一小节HttpsURLConnection不校验服务器CA证书进行操作即可。
    Apache HttpComponents HttpClient(4.3+)不校验CA证书
  • Apache的HttpClient也是依赖于标准的java加密(Java
    Cryptography-JCE)和安全socket扩展(Secure
    Sockets-JSEE),所以需要忽略证书同样需要创建一个javax.net.ssl.SSLContext。与HttpsURLConnection一样Apache
    HttpClient提供可选的HostnameVerifier功能,并提供两个实现类DefaultHostnameVerifier和NoopHostnameVerifier,第一个采用RFC
    2818规则校验hostname,第二个则不进行校验。如果需要不校验服务器CA证书,Apache
    HttpClient提供了一个帮助了可以直接使用,代码如下:
public static void main(String[] args) throws IOException, KeyStoreException,NoSuchAlgorithmException, KeyManagementException {// 配置Apache HttpClientHttpClient httpClient = HttpClients.custom().setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build()).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();// 让RestTemplate使用Apache HttpClient访问网络HttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory();requestFactory.setHttpClient(httpClient);RestTemplate restTemplate = new RestTemplate(requestFactory);restTemplate.getMessageConverters().add(new FormHttpMessageConverter());String resp = restTemplate.getForObject(IgnoreServerCerts.testUrl,String.class);System.out.println(resp);}

其他
RestTemplate同时支持使用OkHttp(2.x and 3.x)和Netty4,但是由于项目中暂未所用,我对这些组件也不熟悉,如果有使用到可以自行研究。

总结

本篇文章主要介绍的是java中怎么实现不校验HTTPS服务器证书,主要介绍JDK中的HttpURLConnection和Apache HttpComponents HttpClient(4.3+)怎么忽略。同时明确Spring的RestTemplate是依赖于底层网络访问组件实现的Http访问,要忽略证书只需要配置底层组件即可。
至此,本系列文章主要部分已技术,还有最后一篇可供选择阅读使用keytool模拟CA证书颁发过程。

本文系转载博文,作者信息如下:
作者:雪落孤村
链接:https://www.jianshu.com/p/ea07a32ec85d

HTTPS(三)之JAVA 不校验HTTPS服务器证书相关推荐

  1. ios自己搭建服务器证书,iOS一步一步实现Https自建证书校验

    oooO ↘┏━┓ ↙ Oooo ( 踩)→┃你┃ ←(死 ) \ ( →┃√┃ ← ) / _)↗┗━┛ ↖(_/ 我觉得https是iOS开发者要踩的最大的一个坑了,每每看他人写的博客都是只讲理论 ...

  2. Java https服务器证书认证问题解决方案

    Java https连接的"unable to find valid certification path to requested target","PKIX path ...

  3. [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  4. java在访问https资源时,忽略证书信任问题

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

  5. Java安全通信:HTTPS与SSL

    1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...

  6. Android客户端与Java tomcat之间HTTPS通讯

    文中涉及到https认证和post传参. 不使用SSL(Secure Sockets Layer)/TLS的HTTP通信就是不加密的通信,所有信息都已明文传播,容易被窃取.篡改或冒充.SSL/TLS协 ...

  7. GDC服务器主机与证书不匹配,调用web服务soap时,错误https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配...

    嘿,我想用SAAJ调用soap web服务 我用野蝇10 我试图将此系统属性添加到standalone.xml,但无法工作 20: 53:08208错误[stderr](默认任务-21),原因是:ja ...

  8. [svc]cfssl模拟https站点-探究浏览器如何校验证书

    准备cfssl环境 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg ...

  9. java webservice ssl_[转贴]Java客户端调用Https Webservice

    标题: Java客户端调用Https Webservice出处地址:http://hi.baidu.com/sunshibing/blog/item/08f873f0d41e67c37931aa84. ...

  10. 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...

    转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...

最新文章

  1. 打开网页时出现DA AddrBar icon的解决方法
  2. 利用目录服务器实现单点登录
  3. BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()
  4. Winform中怎样重写窗体关闭事件实现验证密码通过才能关闭窗体
  5. 我的设计模式之旅(4)——生成器(建造者)模式Builder
  6. 将指标标签与MicroProfile Metrics 2.0结合使用
  7. 【资源分享】ArcFace Demo [Android]
  8. Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
  9. Fiddler- 数据Mock(转)
  10. python爬取本地文本中的成语_Python爬取成语:从3字到12字
  11. 三星显示器 测试软件,3D+TV+APP!三星27英寸LED显示器全国首测
  12. arcgis 循环模型批量处理_科学网-ArcGIS模型构建器批处理操作-张凌的博文
  13. .net写加密的com组件给ASP,VB,VC等其他语言调用
  14. 刘严涛一枚天蝎座的在读大学生
  15. rss阅读器保存html文件,4款在线RSS阅读器使用体验
  16. 如何在区块链底层平台和应用场景中搭一个“桥梁”,他们推出了“中间件”
  17. NBD Network Block Device
  18. 电影投资普通小白参与能获得多少分红?分红有规则吗?
  19. linux设置网络唤醒
  20. 有限体积法及其网格简介

热门文章

  1. 多元回归f检验matlab,matlab进行F检验
  2. 为什么要统一 API 网关
  3. 个人博客如何选择图床
  4. Improved and Efficient Conversational Slot Labeling through Question Answering
  5. 银行家算法(C++实现)
  6. 筛选后系列填充_几个“特殊”的Excel筛选技巧
  7. Logo创作灵魂(下篇)
  8. 计算机黑屏时间,电脑开机黑屏时间长怎么办?Win10开机黑屏时间很久的解决方法...
  9. linux如何设置默认浏览器,如何从命令行设置默认浏览器?
  10. JDBC execute常用方法