Android OKHttp源码解析

这篇具有很好参考价值的文章主要介绍了Android OKHttp源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Https是Http协议加上下一层的SSL/TSL协议组成的,TSL是SSL的后继版本,差别很小,可以理解为一个东西。进行Https连接时,会先进行TSL的握手,完成证书认证操作,产生对称加密的公钥、加密套件等参数。之后就可以使用这个公钥进行对称加密了。

Https的加密方式同时使用了非对称加密和对称加密:

使用反向的非对称加密对证书进行签名
在检查通过的证书公钥基础上,利用非对称加密产生对称加密的公钥
使用产生的公钥,利用对称加密交互传输的数据。
上面就是Https工作的大致流程,下面详细介绍下加密的知识和握手。

加密知识
对于加密这种技术,很早很早之前就有了。没有加密的数据,称为明文,经过加密的叫做密文。Http默认都是明文传输,这种方式很容易被监听或者修改。加密的最终目的,是保证机密性、完整性、可用性。

密码是一套加密算法,使用计算机之前都是使用机械式后者密码本进行操作。在使用计算机之后,加密的安全程度愈来越高,但是被解密也愈来愈容易。

秘钥
如果光有密码和原始数据,那么破解会简单很多,因为只要知道了密码的加密方式,反向操作即可拿到明文数据。所以为了增加难度,增加了秘钥。

现在密码就需要两个参数进行计算了,秘钥+明文+密码==密文。只拿到密码和密文,是不能获取原始明文,还需要秘钥。破解的难度就更大了。

用秘钥加密的技术,又因为加密和解密秘钥的情况分两种。

对称加密
加密和解密的秘钥是相同的,这种加密方式被称为对称加密,使用的秘钥被称为公钥。

对称加密的速度很快,但是服务器需要把自己的公钥传到客户端,客户端使用这个公钥对数据进行加密,服务器使用同样的公钥进行解密。

但是这种方式没有办法防止中间人攻击,如果中间人篡改了传输的公钥,使用自己的公钥代替他,那么接可以截取发送方的数据,使用自己的公钥进行解密。

非对称加密
加密和解密的秘钥是不同的,这种加密方式被称为非对称加密,进行加密的是公共的公钥,而进行解密的叫做私钥。这样只有私钥的拥有者才可以解密数据。

反向的非对称加密是数字签名,也就是使用私钥进行加密,使用公共的公钥的进行解密,这样就可以鉴定发送者的身份。也就是只有发送者才有私钥。

非对称加密的缺点是速度很慢,同样也没有办法防止中间人攻击,中间人截获了服务器的公钥。并用自己的公钥代替,这样也可以获取发送者的数据。

Https的方案
因为对称和非对称加密都有自己的问题,都是因为公钥的传递没法保证安全性,中间人可以通过替换成自己的公钥,完成截取的工作。

Https使用了混合的方式,同时使用了两种方式,使用非对称加密产生对称加密的公钥,再通过对称加密进行处理。首先对称加密比较快速相对于非对称加密。所以还是使用对称加密比较好,那么对称加密的缺点时怎么保证公钥能够安全的交换呢。

这里可以使用非对称加密传输这段公钥。这样这段公钥就可以被安全的传输。因为只有服务器的私钥才可以进行解密。非对称加密有什么问题呢,就是不能判断收到的公钥是否就是真正的公钥,是不是被篡改或者替换。怎么保证受到的公钥就是合法的公钥呢?

那就需要一个机构来给这个公钥背书,可以通过它保证这个公钥是合法的,而承载公钥的载体就是证书。客户端通过证书进行验证,完成公钥的获取。之后就可以通过这个公钥完成非对称加密传输。协商对称加密所用的公钥。

Https的方案大体就是这样。 以上就是Https的基础知识。下面分析下TSL的握手细节。

TSL握手
TSL的握手主要的目的要协商加密的算法、对称加密的公钥、TSL/SSL版本。

首先通过连接到服务器的443端口,通过TCP连接,这段是明文传输,用于沟通上面所说的参数。建立完成连接后就可以开始进行握手操作了。
客户端发送 client hello的报文,发送了客户端支持的协议版本、密码套件、随机数、压缩算法等,服务器要在这之中选中一个自己支持的,如果自己都不支持,那么就会断开连接。
服务器返回 server hello报文,内含选中的版本、密码套件、随机数、压缩算法等。并会返回自己的证书。
客户端收到证书后,检验这个证书,检验分四步:时间有效性检查、签发的颁发者可信度检测、签名检测、站点名称检测。如果四项检测都通过了,那么就会取出证书中的公钥。
通过上面产生的随机数,产生了Pre-master secret,该报文使用从证书中解密获得的公钥进行加密(其实就是服务器的公钥),并通过公钥加密传输到服务端。通过这个数通过DH算法计算出MAC报文摘要和对称加密的公钥。 上面的方式就产生了可以进行对称加密的公钥。下面发送的数据就可以通过这个公钥开始对称加密了。
没有用到数字证书? 传输的证书使用了数字证书也就是反向的对称加密,当收到证书,检验通过后,会使用CA的公钥进行检测,也就是CA使用了自己的私钥进行了加密,只有CA知道私钥。
随机数怎么计算的?可以参考这里

随机数计算
传输过程中,会涉及3个随机数,客户端产生的/服务端产生的/Pre-master secret。 在传输Pre-master secret时,会使用从证书获取的公开秘钥,只有服务器才可以解密
对于服务端:
当其解密获得了Pre-master secret之后,会结合原来的A、B随机数,用DH算法计算出一个master secret,紧接着根据这个master secret推导出hash secret和session secret。

在客户端和服务端的master secret是依据三个随机数推导出来的,它是不会在网络上传输的,只有双方知道,不会有第三者知道。同时,客户端推导出来的session secret和hash secret与服务端也是完全一样的。

那么现在双方如果开始使用对称算法加密来进行通讯,使用哪个作为共享的密钥呢?过程是这样子的:

双方使用对称加密算法进行加密,用hash secret对HTTP报文 做一次运算生成一个MAC,附在HTTP报文的后面,然后用session-secret加密所有数据(HTTP+MAC),然后发送。

接收方则先用session-secret解密数据,然后得到HTTP+MAC,再用相同的算法计算出自己的MAC,如果两个MAC相等,证明数据没有被篡改。

OkHttp的设计
OkHttp是支持自动的Https连接的,也就是我们默认访问一个Https的网站,会自动的完成TSL的握手和加密。但是对于自签名的证书还是需要我们进行配置的。

涉及的类
ConnectionSpec :连接的参数配置,包括SSL/TLS的版本、密码套件等,这个在OkHttpClient#connectionSpecs进行配置,默认是具有SNI和ALPN等扩展功能的现代TLS和clear text即明文传输。SSL握手的前两部就是沟通这部分参数的。Android OKHttp源码解析

CertificateChainCleaner:证书链清理工具,用于省略无用的证书,过滤出一个列表,最后一个链结是受信任的证书。
X509TrustManager:此接口的实例管理哪些 X509 证书可用于验证安全套接字的远程端。 决策可能基于受信任的证书颁发机构、证书撤销列表、在线状态检查或其他方式。这个类对应上面证书检测的签发的颁发者可信度检测、签名检测、时间有效性检查。
HostnameVerifier:验证主机名是否与服务器的身份验证方案匹配。可以基于证书,也可以基于其他方式。这个用于上面说的验证证书的站点名称检测。
X509Certificate:X.509 证书的抽象类。 这提供了一种访问 X.509 证书所有属性的标准方法。现有的证书都是X509类型的,这时一个标准。
SSLSocketFactory:这个是jdk提供的工具,负责SSLSocket,SSLSocket可以调用handShake进行ssl的握手。
CertificatePinner:固定证书配置,用于对握手通过的证书做固定验证,也就是证书必须满足固定证书的配置。 上面的类不但有jdk还有OkHttp的工具,共同完成了Https的工作。OkHttp大部分利用了jdk关注Https的支持。文章来源地址https://www.toymoban.com/news/detail-409168.html

到了这里,关于Android OKHttp源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Okhttp 源码浅析三

    添加网络事件拦截器 Interceptor val chain = RealInterceptorChain(         call = this,         interceptors = interceptors,         index = 0,         exchange = null,         request = originalRequest,         connectTimeoutMillis = client.connectTimeoutMillis,         readTimeoutMillis = client.readTimeoutMillis,      

    2024年02月11日
    浏览(38)
  • Android OkHttp 源码浅析二

    OkHttp 配置参数: dispatcher 用于线程调度 connectionPool 连接池  64 个or 5 host 可以提升复用性 方便管理和提升性能 interceptors  networkInterceptors eventListenerFactory 事件监听器 连接建立 发送head body 等 retryOnConnectionFailure 连接 / 请求 失败是否重置 authenticator 自动认证修正 比如

    2024年02月11日
    浏览(34)
  • Android OkHttp 源码浅析一

    演进之路:原生Android框架不好用 ---- HttpUrlConnect   和 Apache HTTPClient   第一版  底层使用HTTPURLConnect   第二版 Square构建 从Android4.4开始 基本使用: 同步方法,Deque 双向队列 executableCalls 添加到calls 然后取出遍历 执行 executeOn runningAsyncCalls 正在执行的Call    for (i in 0 until e

    2024年02月11日
    浏览(39)
  • 深入浅出 OkHttp 源码解析及应用实践

    作者:vivo 互联网服务器团队- Tie Qinrui OkHttp 在 Java 和 Android 世界中被广泛使用,深入学习源代码有助于掌握软件特性和提高编程水平。 本文首先从源代码入手简要分析了一个请求发起过程中的核心代码,接着通过流程图和架构图概括地介绍了OkHttp的整体结构,重点分析了拦

    2024年02月05日
    浏览(57)
  • Android OkHttp源码阅读详解一

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 前言:源码阅读基于okhttp:3.10.0 Android中OkHttp源码阅读二(责任链模式) 1、首先回顾OkHttp的使用 2、OkHttp源码阅读之线程池详解 3、守护线程详解 4、根据OkHttp中构

    2024年02月10日
    浏览(38)
  • Android OkHttp源码分析--分发器

    OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。 OKHttp优点: 1、支持Http1、Http2、Quic以及WebSocket; 2、连接池复用底层TCP(Socket),减少请求

    2024年02月13日
    浏览(40)
  • Android Okhttp3添加https自签名证书以及Glide4,Android高级工程师进阶学习—Android热修复原理

    二、自签名证书 什么是自签名证书(self-signed certicates)? 自签名证书就是没有通过受信任的证书颁发机构, 自己给自己颁发的证书. SSL 证书大致分三类: 由安卓认可的证书颁发机构CA(Certificate Authority)(如: VeriSign、DigiCert), 或这些机构的下属机构颁发的证书. 没有得到安卓认可的

    2024年04月17日
    浏览(41)
  • Android中OkHttp源码阅读二(责任链模式)

    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 Android OkHttp源码阅读详解一 一、首先写一个案例熟悉责任链模式 1、定义一个抽象类BaseTask 2、定义四个Task类,都继承自BaseTask,这里只写一个其它三个同理

    2024年02月10日
    浏览(34)
  • OSI参考模型以及每一层的传输单位、任务、功能和协议

    OSI参考模型分为七层:自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 物理层的传输单位是比特,任务是透明的传输比特流,功能是在物理媒体上为数据端设备透明地传输原始比特流。 物理层的接口标准有很多,如EIA-232C、EIA/TIA RS-449以及

    2024年02月06日
    浏览(37)
  • Java okHttp 忽略Https证书验证

    我们在和第三方系统交互时,Https url会出现找不到证书的问题。unable to find valid certification path to requested target. 我尝试过很多方法比如添加证书等,但是最后都以失败告终。只能退而求其次忽略指定url的证书验证,亲测好用! 创建OkHttpUtil类,代码如下: 然后我们之前有提到,

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包