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. C++面试题:++i和i++哪个效率高?

    1.当变量i的数据类型是c++语言默认提供的类型的话,他们的效率是一样的. 从其汇编执行的条数是一样的,所以其执行效率是一样的(有兴趣可以用gdb查看汇编代码)  2.我们自定的数据类型,++i效率高 ...

  2. 《Linux内核分析》 week6作业-Linux内核fork()系统调用的创建过程

    一.进程控制块PCB-stack_struct 进程在操作系统中都有一个结构,用于表示这个进程.这就是进程控制块(PCB),在Linux中具体实现是task_struct数据结构,它主要记录了以下信息 ...

  3. UVa12304

    基础题,注意精度和旋转方向. #include <iostream> #include <math.h> #include <vector> #include &l ...

  4. WDCP安装memcached

    memcached安装 我们打开Web控制面板的时候其实memcached是没有安装的,所以我们要手动安装这个组件. 首先是要下载安装源代码并执行. 1 2 wget -c http://down.w ...

  5. ECSTORE 关于前台页面DIALOG的调用

    在需调用dialog的html页面中插入本段代码. link='<{link app=test ctl=site_test act=abc}>'; var dialog = new Dia ...

  6. PHP自动添加http://头 转换网址为链接

    有时候,当我们需要用户输入网址的时候,一般我们会让用户省略掉"http://",当提交完成后用代码自动再加上http://,若有需要,我们 还可将网址转换成链接的形式,类似于众多网 ...

  7. Python一路走来 - python基础 数据类型

    对于Python,一切事物都是对象,对象基于类创建 Python数据类型 python主要的数据类型主要包括以下几种类型: (1) 数字型 (2) 字符串 (3) 列表 (4) 元组 (5) 字典 ( ...

  8. java-map-IdentityHashMap

    1.背景 今天翻开IdentityHashMap的时候,就傻眼了,这个到底是个逻辑啊,我的程序代码如下: IdentityHashMap<String,String> identityHa ...

  9. 编译的时候 c:\windows\assembly\ 卸载不掉

    easyhook 开始还可以调试,几次过后 其自己去找c:\windows\assembly\ 下的包,编译多少次都不行. c:\windows\assembly\  卸载不掉 cmd cd \win ...

  10. 发布项目到 Linux 上运行 Core 项目

    发布项目到 Linux 上运行 Core 项目 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win ...