HTTPS(三)之JAVA 不校验HTTPS服务器证书
本篇主要描述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服务器证书相关推荐
- ios自己搭建服务器证书,iOS一步一步实现Https自建证书校验
oooO ↘┏━┓ ↙ Oooo ( 踩)→┃你┃ ←(死 ) \ ( →┃√┃ ← ) / _)↗┗━┛ ↖(_/ 我觉得https是iOS开发者要踩的最大的一个坑了,每每看他人写的博客都是只讲理论 ...
- Java https服务器证书认证问题解决方案
Java https连接的"unable to find valid certification path to requested target","PKIX path ...
- [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...
- java在访问https资源时,忽略证书信任问题
java程序在访问https资源时,出现报错 sun.security.validator.ValidatorException: PKIX path building failed: sun.sec ...
- Java安全通信:HTTPS与SSL
1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...
- Android客户端与Java tomcat之间HTTPS通讯
文中涉及到https认证和post传参. 不使用SSL(Secure Sockets Layer)/TLS的HTTP通信就是不加密的通信,所有信息都已明文传播,容易被窃取.篡改或冒充.SSL/TLS协 ...
- GDC服务器主机与证书不匹配,调用web服务soap时,错误https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配...
嘿,我想用SAAJ调用soap web服务 我用野蝇10 我试图将此系统属性添加到standalone.xml,但无法工作 20: 53:08208错误[stderr](默认任务-21),原因是:ja ...
- [svc]cfssl模拟https站点-探究浏览器如何校验证书
准备cfssl环境 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl wget https://pkg ...
- java webservice ssl_[转贴]Java客户端调用Https Webservice
标题: Java客户端调用Https Webservice出处地址:http://hi.baidu.com/sunshibing/blog/item/08f873f0d41e67c37931aa84. ...
- 转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名...
转载:Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 Openssl生成rsa和椭圆曲线加密公钥密钥创建根ca签名https服务器证书签名 July 20, 20 ...
最新文章
- 打开网页时出现DA AddrBar icon的解决方法
- 利用目录服务器实现单点登录
- BringWindowToTop(), SetForegroundWindow(), SetActiveWindow()
- Winform中怎样重写窗体关闭事件实现验证密码通过才能关闭窗体
- 我的设计模式之旅(4)——生成器(建造者)模式Builder
- 将指标标签与MicroProfile Metrics 2.0结合使用
- 【资源分享】ArcFace Demo [Android]
- Python+OpenCV:尺度不变特征变换 (SIFT, Scale-Invariant Feature Transform)
- Fiddler- 数据Mock(转)
- python爬取本地文本中的成语_Python爬取成语:从3字到12字
- 三星显示器 测试软件,3D+TV+APP!三星27英寸LED显示器全国首测
- arcgis 循环模型批量处理_科学网-ArcGIS模型构建器批处理操作-张凌的博文
- .net写加密的com组件给ASP,VB,VC等其他语言调用
- 刘严涛一枚天蝎座的在读大学生
- rss阅读器保存html文件,4款在线RSS阅读器使用体验
- 如何在区块链底层平台和应用场景中搭一个“桥梁”,他们推出了“中间件”
- NBD Network Block Device
- 电影投资普通小白参与能获得多少分红?分红有规则吗?
- linux设置网络唤醒
- 有限体积法及其网格简介
热门文章
- 多元回归f检验matlab,matlab进行F检验
- 为什么要统一 API 网关
- 个人博客如何选择图床
- Improved and Efficient Conversational Slot Labeling through Question Answering
- 银行家算法(C++实现)
- 筛选后系列填充_几个“特殊”的Excel筛选技巧
- Logo创作灵魂(下篇)
- 计算机黑屏时间,电脑开机黑屏时间长怎么办?Win10开机黑屏时间很久的解决方法...
- linux如何设置默认浏览器,如何从命令行设置默认浏览器?
- JDBC execute常用方法