学习okhttp wiki--HTTPS
HTTPS#
OkHttp尝试平衡两个相互竞争的要素:
连通性(Connectivity):连接到尽可能多的服务器。这包括运行最新版本 boringssl 的服务器和不太过时的老版本 OpenSSL 的服务器。
连接的安全性(Security):这包括远程web服务器证书验证,和对私密数据交换的强加密。
在与HTTPS服务器协商一个连接时,OkHttp需要知道提供哪种TLS版本(TLS versions)和密码套件(cipher suites)。一个希望最大化连通性的客户端会包含废弃的TLS版本和弱设计的密码套件。一个希望最大化安全性的严格的客户端将会限制只使用最新的TLS版本和最强的密码套件。
具体的安全性 vs 连通性的决定是由ConnectionSpec实现的。OkHttp包含三种内置的连接策略:
MODERN_TLS
是连接到最新的HTTPS服务器的安全配置。COMPATIBEL_TLS
是连接到过时的HTTPS服务器的安全配置。CLEARTEXT
是用于http://开头的URL的非安全配置。
默认情况下,OkHttp将会尝试MODERN_TLS
连接,如果当前配置失败,会退回到COMPATIBLE_TLS
连接。
每种连接策略中,具体的TLS版本和密码套件在每个版本中都可能会变。例如,在OkHttp 2.2中,我们禁用了SSL 3.0,以应对POODLE攻击;在Ok Http2.3中我们禁用了RC4。同你的桌面web浏览器一样,使用最新的OkHttp版本是保证安全的最好方法。
你可以建立自己的连接策略,使用自定义的TLS版本和密码套件。例如,下面的配置限制在三种被高度重视的密码套件。它的缺陷是需要Android 5.0以上,和相应的新web服务器。
ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
.tlsVersions(TlsVersion.TLS_1_2)
.cipherSuites(
CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
.build();
OkHttpClient client = ...
client.setConnectionSpecs(Collections.singletonList(spec));
证书锁定(Certificate Pinning)##
默认情况下,OkHttp信任运行平台支持的证书颁发机构。这种策略最大化了连通性,但它受到对认证机构的攻击的制约,例如2011年的DigiNotar攻击。它也假定了你的HTTPS服务器的证书是由证书颁发机构签名的。
使用CertificatePinner来约束哪些认证机构被信任。证书锁定增加了安全性,但限制了你的服务器团队升级TLS证书的能力。没有来自服务器TLS管理员的祝福,不要使用证书锁定!
public CertificatePinning() {
client = new OkHttpClient();
client.setCertificatePinner(
new CertificatePinner.Builder()
.add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
.add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
.add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
.add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
.build());
}
public void run() throws Exception {
Request request = new Request.Builder()
.url("https://publicobject.com/robots.txt")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
for (Certificate certificate : response.handshake().peerCertificates()) {
System.out.println(CertificatePinner.pin(certificate));
}
}
自定义受信任的证书##
完整的代码展示了如何用你自己的设置替换运行平台支持的认证机构。同上,没有来自服务器TLS管理员的祝福,不要使用证书锁定!
private final OkHttpClient client;
public CustomTrust() {
client = new OkHttpClient();
SSLContext sslContext = sslContextForTrustedCertificates(trustedCertificatesInputStream());
client.setSslSocketFactory(sslContext.getSocketFactory());
}
public void run() throws Exception {
Request request = new Request.Builder()
.url("https://publicobject.com/helloworld.txt")
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
private InputStream trustedCertificatesInputStream() {
... // Full source omitted. See sample.
}
public SSLContext sslContextForTrustedCertificates(InputStream in) {
... // Full source omitted. See sample.
}
学习okhttp wiki--HTTPS的更多相关文章
- Android Https相关完全解析 当OkHttp遇到Https
一.概述 其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了.首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如https://www.baid ...
- 云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 (阿里云ECS服务器 )课堂
云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 1. 开通云服务器 2 1.包年包月 按量付费(适合测试数据的时候) 2 2.地域 服务器数 ...
- OkHttp配置HTTPS访问+服务器部署
1 概述 OkHttp配置HTTPS访问,核心为以下三个部分: sslSocketFactory() HostnameVerifier X509TrustManager 第一个是ssl套接字工厂,第二 ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- 学习OkHttp wiki--Interceptors
Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...
- 学习okhttp wiki--Connections.
Connections 尽管你只提供了URL,OkHttp使用三种类型来创建它和你的web服务器的连接:URL,地址(Address)和路由(Route). URLs URLs (例如 https:/ ...
- HTTPS学习笔记一----HTTPS的基础理论知识
首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...
- 解决okHttp使用https抛出stream was reset: PROTOCOL_ERROR的问题
昨天在做Android接口调用的时候,api接口是https的,用okhttp抛出: okhttp3.internal.http2.StreamResetException: stream was r ...
- Nginx详解二十:Nginx深度学习篇之HTTPS的原理和作用、配置及优化
一.HTTPS原理和作用: 1.为什么需要HTTPS?原因:HTTP不安全1.传输数据被中间人盗用.信息泄露2.数据内容劫持.篡改 2.HTTPS协议的实现对传输内容进行加密以及身份验证 对称加密:加 ...
随机推荐
- css3动画和jquery动画使用中要注意的问题
前一阵子写demo的时候遇到这样一个问题,就是给元素添加css3或者jquery动画时,在动画结束前不能准确取到元素的css属性. 1. css3动画讨论 先看代码: html: <div id ...
- Nginx源码研究一:NGINX模块启动
Nginx 是一个轻量级,但是高性能的 HTTP 和 代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器. 它的第一个版本0.1.0是由俄罗斯的工程师Igor Sysoev与2004年10 ...
- CSS强制图片大小
相信大家做网页时经常会碰到大分辨率的图片会把表格涨破以致漂亮的网页面目全非,但只要使用以下的CSS语句即可解决. 该CSS的功能是:大于600的图片自动调整为600显示. <style type ...
- Python自动化运维之8、正则表达式re模块
re模块 正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串,在文本处理方面功能非常强大,也经常用作爬虫,来爬取特定内容,Python本身不支持正则,但是通过导入re模块,Python ...
- Google地图
Google地图开发总结 我们经常使用地图查位置.看公交.看街景,同时地图还开放第三方的API给开发者.利用这些API进行地图的个性化的展示和控制,例如北京被水淹了,开发一个网页显示北京被淹的地图,地 ...
- Sicily 1931. 卡片游戏
题目地址:1931. 卡片游戏 思路: 纯属数据结构中队列的应用,可以练练手. 具体代码如下: #include <iostream> #include <queue> usi ...
- shell脚本实例一,移动文件夹中大于2000B的文件到另一个文件夹
shell脚本能帮我们简化linux下的一些工作,现在有个需求,把TMPA文件夹下大于2000B的文件都移动到TMPB下 #! /bin/bash function movefiles() { ` d ...
- java调优随记-java对象大小
在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new ...
- 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错
原文网址:http://www.cnblogs.com/skywang12345/p/3311252.html 概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学 ...
- [LeetCode] 56. Merge Intervals 解题思路
Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...