博客搬家: https原理总结

最近在公司项目的服务器上做一些内部接口,要求使用https,于是花时间研究了一波。我们熟知的http在传输时未对数据进行加密,在传输一些敏感信息时存在着不小的安全隐患。因此,https在http的基础上加上了SSL(Secure Sockets Layer)加密,以保障数据的安全传输。如今使用的TLS实际上是SSL的升级版本。具体有关https的概念可参考百科
https介绍

1.https原理探究

https的保障信息安全的机制,其实用一句话就能概括:client与server通过非对称加密来协商一个对称秘钥,然后CS两端使用该对称秘钥来进行数据的加密解密,完成数据交互。所以数据传输时,实际上走的是对称加密。当然理解这句话前提,需要明白对称和非对称加密的原理,本文不做讨论。

原理概况

SSL加密机制的大致过程:

  • client发送请求
  • server返回证书
  • client验证并取出证书中的公钥
  • client生成随机数,并使用服务器公钥将其加密,把得到的密文发送给server
  • server使用私钥解密,得到随机数
  • 两端各自通过随机数生成对称秘钥,协商完成

数字证书与数字签名

在详细介绍握手环节之前,我想先说说数字数字证书的起因及原理,数字证书是整个SSL加密的核心与纽带。首先,在使用非对称加密传输之前,客户端需要获取服务器公钥,这里存在一种攻击方式,即中间方使用自己的公钥替换服务器的公钥发送给客户端,再通过自己的私钥获取客户端传来的非对称加密内容,从而实现篡改以及窃听。为了方便理解,网上有一张图我直接拿来用了,如下所示。

为了防止获取公钥过程遭到第三方的掉包等之类的破坏,于是便有了证书机制,下图为服务器证书的签署以及验证的大致流程。

证书包含三部分内容

  • 证书内容(服务器公钥、服务器信息等)
  • 加密算法(加密算法、哈希算法)
  • 密文(使用哈希算法计算证书内容得到哈希摘要,再使用CA私钥加密该摘要即得到密文,该过程称为数字签名)

验证数字证书

  • 客户端验证服务器证书时,需要获取到你的上一级CA证书,从而得到取CA公钥,使用CA公钥对证书中的密文解密得到哈希摘要,同时客户端使用同样的哈希算法对服务器证书内容计算得到另一个哈希摘要,若这两个摘要相等,则证明证书合法。

上述的哈希签名也称为数字指纹法,该方法的精髓在于,相同的明文通过哈希计算得到的摘要,一定是相同的,而只要两份明文只要有一丝丝区别,其对应的哈希值也是不同的。因此,若第三方替换了证书中的公钥,根据证书内容计算出的新的摘要一定与密文中的摘要有所差异的,故可以轻松地判断证书不合法。

疑问

(1)既然是使用上级CA证书来验证服务器证书,那如何证明上级CA证书的合法性?

  • 这涉及到一个证书信任链的问题。上级证书通过更高一级的CA根证书来确定其合法性,这是一个递归向上的过程,直到最顶层根证书。顶层CA根证书是整个安全体系的根本。

(2)前文提到的攻击方式,只替换公钥显然是不行,那如果第三方把整个证书都替换成自己的证书(因为CA机构可以给任何人签名,黑客也可以),这样的话客户端的验证是不是可以通过?

  • 答案当然是否定的,很简单,因为证书内容里的服务器信息是唯一的、不可复制的,例如域名,若替换整个证书,域名也会变成黑客自己的域名,浏览器不会接受域名和请求内容不匹配的证书。比如说,浏览器请求了 baidu.com,结果返回了个google.com的证书,毫无疑问会立即排除掉。

保证了服务器公钥安全抵达客户端手中,后续的对话秘钥的协商便也能顺理成章地进行。因此https所采用的SSL机制是绝对安全的,几乎没有人能够破解。当然,有得必有失,https花费的开销也远高于http。

SSL握手过程

https握手原理图


理解了上文所讲的证书机制,其实SSL加密机制也基本容易理解了,下面细究一下SSL握手过程,此处结合上方交互原理图进行分析
(1) Client Helllo。客户端发送初次请求,请求内容包含版本信息,加密套件候选列表,压缩算法候选列表,随机数random_1,扩展字段等信息,以明文传输;

(2)服务器选择客户端支持的加密套件、压缩算法、协议版本等,生成随机数random_2;

(3)服务器将上述算法以及随机数等发送给客户端;

(4)服务器发送服务器数字证书;

(5)客户端接收服务器选择的算法以及随机数等,验证数字证书。若证书验证通过,或者用户接受了不可信证书,客户端获取服务器公钥,同时会生成随机数random_3,并使用服务器公钥加密该随机数得到密文;

(6)客户端将第五步得到的密文传给服务器,由于公钥加密的内容只能使用私钥解开,所以random_3无法被窃听;

(7)Change cipher Spec。客户端通知服务器协商完成;

  • 此时客户端已存有三个随机数random_1、random_2和random_3,前两个是可以被截获的,第三个是私密的,根据这三者可计算得出对话秘钥,即enc_key=Fuc(random_1, random_2, random_3)

(8)客户端结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,并使用对话秘钥enc_key和算法将其加密,得到密文encrypted_handshake_message,将其发送给服务器进行验证;

(9)服务器使用私钥解密第六步得到的密文,得到随机数random_3,此时服务器也拥有了三个随机数random_1、random_2和random_3,同样可计算出对话秘钥enc_key,至此双方共享对称加密秘钥的目的已达成;计算之前所有接收信息的 hash 值,然后解密客户端发送的 encrypted_handshake_message,验证数据和密钥正确性;

(10)类似7和8,服务器通知客户端协商完成,同时计算发送encrypted_handshake_message。客户端以同样的方式验证encrypted_handshake_message,握手完成。

完成握手之后,服务器和客户端都使用相同的对话秘钥enc_key,对消息内容进行加密,实现安全通信。

https原理总结的更多相关文章

  1. HTTPS 原理解析

    一 前言 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证 ...

  2. [转]HTTPS那些事(一)HTTPS原理

    [转]HTTPS那些事(一)HTTPS原理 http://www.guokr.com/post/114121/ 楔子谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>, ...

  3. HTTPS 原理浅析及其在 Android 中的使用

    作者:曹丰斌   本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...

  4. https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名

    声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...

  5. Tengine HTTPS原理解析、实践与调试【转】

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  6. [转帖]HTTPS系列干货(一):HTTPS 原理详解

    HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...

  7. HTTPS原理解析-转

    这篇文章关于Https的讲解真的是太透彻了,转过来备忘. 来源:腾讯bugly 另附两个SSL/TLS的交互详解:一.二 基于此文章的学习总结:下一篇文章 1.HTTPS 基础 HTTPS(Secur ...

  8. OpenSSL和https原理

    https原理: 浏览器请求服务端的公钥证书,server将注冊的证书发送给client. client向办法机构验证证书的合法性,证书 包含公钥,server网址及一些信息. 验证完成,client ...

  9. https原理与实践

    HTTPS 原理与证书实践   分类: Web应用   1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了 ...

  10. 【转】HTTPS系列干货(一):HTTPS 原理详解

    HTTPS系列干货(一):HTTPS 原理详解 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并 ...

随机推荐

  1. 1043 输出PATest (20 分)C语言

    给定一个长度不超过 10^​4的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest- 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...

  2. 06_URL参数截取

    1:如何获取URL传给子页面的参数: //获得参数(只对字母数字等有效,参数值为中文则不能传) function getQueryString(name) { var reg = new RegExp ...

  3. 51nod 1086背包问题V2 (完全背包模板题)

    1086 背包问题 V2 1 秒 131,072 KB 20 分 3 级题 题目描述 有N种物品,每种物品的数量为C1,C2......Cn.从中任选若干件放在容量为W的背包里,每种物品的体积为W1, ...

  4. 【转】【e周美文】优秀博客上榜推荐

    Everybody,本周的博客推荐开始啦,记住,有好的博客可要给小活推荐一下哦. 7.19日 博客推荐 Android权限列表作者:@大漠落日 链接:http://my.eoe.cn/1103623/ ...

  5. JS怎样做四舍五入

    1 .tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的规则 ...

  6. 重拾c++第二天(4):复合类型

    1.定义:种类 数组名[元素个数] = {元素1,...,元素n} ,或者直接赋值:数组名[元素位置] = 值; 2.部分初始化,其他全为0,可以就定义一个0,这样得到0数组(或者就一个{},别的啥也 ...

  7. codeforces 上的找两人的幸运天

    Bob and Alice are often participating in various programming competitions. Like many competitive pro ...

  8. vue+jest+vue-test-utils 单元测试

           jest是Facebook的一套开源的JavaScript测试框架,它集成了快照测试.断言.mock以及覆盖率报告等功能,很全面而且基本不需要太多的配置便可使用Vue-Test-Util ...

  9. 一道简单到爆 Java面试题,居然挂了一票人

    很多时候bug往往都是出在,我们觉得非常简单,不起眼的基础知识上 年前公司最后一波招人,为年后项目做技术储备,主要招聘对象初中级Java开发,要求也并没有多苛刻,唯一一点基础稍好,快速上手做项目就行. ...

  10. python 找到项目使用的所有组件和版本

    1.下载模块 pip3 install -i https://pypi.douban.com/simple pipreqs 2.生成文件 pipreqs ./ --encoding=utf-8