HTTPS#

  OkHttp尝试平衡两个相互竞争的要素:

  1. 连通性(Connectivity):连接到尽可能多的服务器。这包括运行最新版本 boringssl 的服务器和不太过时的老版本 OpenSSL 的服务器。

  2. 连接的安全性(Security):这包括远程web服务器证书验证,和对私密数据交换的强加密。

  在与HTTPS服务器协商一个连接时,OkHttp需要知道提供哪种TLS版本(TLS versions)和密码套件(cipher suites)。一个希望最大化连通性的客户端会包含废弃的TLS版本和弱设计的密码套件。一个希望最大化安全性的严格的客户端将会限制只使用最新的TLS版本和最强的密码套件。

  具体的安全性 vs 连通性的决定是由ConnectionSpec实现的。OkHttp包含三种内置的连接策略:

  1. MODERN_TLS是连接到最新的HTTPS服务器的安全配置。
  2. COMPATIBEL_TLS是连接到过时的HTTPS服务器的安全配置。
  3. 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的更多相关文章

  1. Android Https相关完全解析 当OkHttp遇到Https

    一.概述 其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了.首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如https://www.baid ...

  2. 云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 (阿里云ECS服务器 )课堂

    云端搭建Linux学习环境 链接https://edu.aliyun.com/article/19 1. 开通云服务器 2 1.包年包月   按量付费(适合测试数据的时候) 2 2.地域   服务器数 ...

  3. OkHttp配置HTTPS访问+服务器部署

    1 概述 OkHttp配置HTTPS访问,核心为以下三个部分: sslSocketFactory() HostnameVerifier X509TrustManager 第一个是ssl套接字工厂,第二 ...

  4. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  5. 学习OkHttp wiki--Interceptors

    Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...

  6. 学习okhttp wiki--Connections.

    Connections 尽管你只提供了URL,OkHttp使用三种类型来创建它和你的web服务器的连接:URL,地址(Address)和路由(Route). URLs URLs (例如 https:/ ...

  7. HTTPS学习笔记一----HTTPS的基础理论知识

    首先推荐一本书,<HTTP权威指南>我就是看这本书入门的,对http协议有了更好的理解,学习https的理论知识我认为需要了解以下几点,需要一步步的深入学习: 1.HTTPS的基本概念? ...

  8. 解决okHttp使用https抛出stream was reset: PROTOCOL_ERROR的问题

    昨天在做Android接口调用的时候,api接口是https的,用okhttp抛出: okhttp3.internal.http2.StreamResetException: stream was r ...

  9. Nginx详解二十:Nginx深度学习篇之HTTPS的原理和作用、配置及优化

    一.HTTPS原理和作用: 1.为什么需要HTTPS?原因:HTTP不安全1.传输数据被中间人盗用.信息泄露2.数据内容劫持.篡改 2.HTTPS协议的实现对传输内容进行加密以及身份验证 对称加密:加 ...

随机推荐

  1. linux初识-01简介

    什么是linux: Linux是一个自由的,免费的,源码开发的操作系统Linux的特点: 开放性.多用户,多任务,具有丰富的网络功能 可靠的系统安全 良好的可移植性 良好的用户界面(命令界面和图形界面 ...

  2. 写一个MyORM--利用反射的方法

    本文的目的是为了更加深刻的理解反射. ORM:Object Relational Mapping对象关系映射,是解决了面向对象语言和关系型数据库不匹配的问题. ORM是一种思想,实现这种思想的技术有很 ...

  3. C#中启动外部应用程序

    C#中我们可以通过Process类直接启动外部应用程序 代码如下: Process p = new Process();                    p.StartInfo.FileName ...

  4. ecshop有关real_ip()你发现的问题

    我这边有一个ECSHOP后台,有一个功能,在客户下订单时自动获取客户IP,用的是ECSHOP本身的real_ip函数,但这个函数存在一个问题,十个订单得到的IP,可能会有几个与CNZZ统计得到的不一样 ...

  5. ubuntu 12.04 安装nginx

    nginx是一个强大的高性能反向代理服务器,其特点是占内存少,并发能力强,在高并发的情况下是apache 的一个不错的代替品,能够支持高达50000个并发连接数的响应,那么这么强大的武器,究竟如何在l ...

  6. 关于GestureDetector.OnGestureListener的onScroll参数distance问题

    关于GestureDetector.OnGestureListener类的onScroll方法参数distanceX和distanceY问题 看到有文章上说onScroll方法中distanceX和d ...

  7. windows 2003 远程桌面 连接输入账号密码后,只能看见蓝色屏幕和鼠标

    具体解决方案参考的 http://www.tomshardware.com/forum/171045-46-remote-desktop-connection-blank-desktop   to s ...

  8. <item.../>元素可指定如下常用属性

    android:id:为菜单项指定一个唯一表实.android:title:指定菜单项的标题.android:icon:指定菜单项的图标.android:alphabeticShortcut:为菜单项 ...

  9. 【笔试&面试】C#中的程序集

    1.      C#中的程序集(Assembly) 答:程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分离可重用类型的逻辑表示和物理表示. 程序集是一个可重用.可实施版本策略和安全策略 ...

  10. HDU_2058——等差数列,子集,集合长度判断

    Problem Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-se ...