简单记录下HTTPS中的SSL
大概思路
大概思路是混合加密的方式,即对称加密方式混合非对称加密方式。
非对称加密会更加安全,功能也更强大,但他复杂而且速度慢。
对称加密速度快,但要保证这个公共密钥的正确性和真实性。
所以两者结合,在确定公共密钥的时候,采用非对称加密的方式来传递这个公共密钥,然后后面的交流的信息都用这个公共密钥来进行加密。
那又要怎么确定服务器的身份呢?如果是一个假的服务器,直接给了你一个假的公钥,那么一开始就错了啊。
这就要用到证书了,证书是这样的原理的,大概描述下:
1. 服务器把自己的公钥登陆到数字证书认证机构。
2. 数字认证机构呢,用自己的私钥向服务器的公开密码署数字签名并颁发公钥证书。
3. 要知道,数字认证机构早已经将自己的公钥植入到浏览器里面了,也就是浏览器有着可以解开数字证书的公钥。
3. 服务器发证书给客户端,然后客户端就可以通过自己内嵌的证书公钥解开这个证书,确定服务器的真实性并拿到服务器公钥。
三个特性
HTTPS是为了解决HTTP的三个缺点:
明文传输;
不验证加密方式;
无法确定报文的准确性。
对此HTTPS的三个特点是:
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
三个原理
握手协议(Handshake protocol)——emm可以理解成一起商量出一个迟点用来加密信息的公共密钥
记录协议(Record protocol)——客户机和服务机握手后就进入了这个记录协议,提供两个功能:
(1)保密性:使用握手协议定义的秘密密钥实现
(2)完整性:握手协议定义了MAC,用于保证消息完整性
警报协议(Alert protocol)——客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。
握手协议大致思路:
1.Client打招呼,叫做Client Hello,包含如下内容:
(1)客户端可以支持的SSL最高版本号
(2)一个用于生成主秘密的32字节的随机数。(等会介绍主秘密是什么)
(3)一个确定会话的会话ID。
(4)一个客户端可以支持的密码套件列表。
然后Sever也一个Server Hello来回应:
(1)一个SSL版本号。取客户端支持的最高版本号和服务端支持的最高版本号中的较低者。
(2)一个用于生成主秘密的32字节的随机数。(客户端一个、服务端一个)
(3)会话ID
(4)从客户端的密码套件列表中选择的一个密码套件
(5)从客户端的压缩方法的列表中选择的压缩方法
注意,这里已经生成了两个随机数了,然后现在Client知道了这些信息:
(1)SSL版本
(2)密钥交换、信息验证和加密算法
(3)压缩方法
(4)有关密钥生成的两个随机数。
这里是第一阶段结束
然后Server继续发东西,这里具体来讲就发这些:(注意这里都指的是Server发)
(a)证书:服务器将数字证书和到根CA整个链发给客户端,使客户端能用服务器证书中的服务器公钥认证服务器。
(b)服务器密钥交换(可选):这里视密钥交换算法而定
(c)证书请求:服务端可能会要求客户自身进行验证。
(d)服务器握手完成:第二阶段的结束,第三阶段开始的信号——Server Hello Done
简单的情况的话,其实就是上面Hello玩后,Server给客户端发了个证书,里面有服务器的公钥,然后客户端也可以根据这个证书证明服务器的身份,然后再发给Server Hello Done证明结束这里的交流。
这是第二阶段结束
然后客户端启动SSL握手第三阶段,下面是客户端可能发的:
(a)证书(可选):为了对服务器证明自身,客户要发送一个证书信息,这是可选的,在IIS中可以配置强制客户端证书认证。
(b)客户机密钥交换(Pre-master-secret):这里客户端将预备主密钥发送给服务端,注意这里会使用服务端的公钥进行加密。
(c)证书验证(可选),对预备秘密和随机数进行签名,证明拥有(a)证书的公钥。
简单的情况,其实就是又有一个随机数,叫做Pre-master-secret,这个东西会用上面从证书中拿到的服务器的公钥来加密后再发送。
然后第三阶段结束,下面是最后一个阶段。
然后握手成功之后,就用一起商量产生的公共密钥来“聊天”了,而公共密钥的算法就不细说了,大概就:
我们不是有三个随机数嘛,Client random,Server random还有个pre master secret,用这三个生成出一个公共密钥的样子。
参考文章:
《图解HTTP》,书没有的话可以看这篇文章——https://www.jianshu.com/p/4764825fb916——《HTTPS详解(读《图解HTTP》笔记)》
https://blog.csdn.net/shipfsh_sh/article/details/80419994——《SSL详解》
简单记录下HTTPS中的SSL的更多相关文章
- 简单记录下RestTemplate 中postForObject调用例子
学无止境! 今天无意中做了下RestTemplate调用demo,简单的尝试了下一个项目调用另一个项目接口示例 在A项目中创建可访问controller 然后在B项目中进行调用 调用成功
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- 简单记录下SpringCloud的微服务架构和一些概念
一.微服务的注册与发现——Eureka 和许多分布式设计一样,分布式的应用一般都会有一个服务中心,用于记录各个机器的信息.微服务架构也一样,我们把一个大的应用解耦成这么多个那么多个服务,那么在想要调用 ...
- 记录下工作中使用的pdf.js
在工作中遇到一个通过网页的形式浏览pdf文件以及图片的需求,图片简单,直接通过网页的形式打开这个图片的URL即可.而pdf这边,通过查询发现有一个名为pdf.js的神器. 简单介绍下,它可以在html ...
- 记录下项目中常用到的JavaScript/JQuery代码一(大量实例)
一直没有系统学习Javascript和Jquery,每次都是用到的时候去搜索引擎查,感觉效率挺低的.这边把我项目中用的的记录下,想到哪写哪,有时间再仔细整理. 当然,由于我主要是写后端java开发,而 ...
- 简单了解下java中的堆、栈和方法区。
堆.栈.方法区 1,首先了解下java中的数据类型. ①java中的八大基本数据类型:boolean, char , byte, short, int, long , float , double. ...
- 记录下mybatis中#{}和${}传参的区别
最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...
- 简单记录一下虚拟机中安装Linux的流程以及部分软件的安装命令
一,虚拟机使用的是VMware9 ,linux使用的是服务器中用的比较多的CentOS6.4.稍后我会把这两个版本放到网盘中,需要的朋友可以去下载: 网盘地址: 二,VM的安装比较简单,基本上按照网上 ...
- 简单阐述下OC中UIImage三种创建方式~~~
一. 直接使用imageNamed进行创建 UIImage * image = [UIImage imageNamed:@"1.jpg"]; 简单说一下这种方式的优缺点: 优点:代 ...
随机推荐
- [原创]java向word模板中填充数据(总结)
使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...
- 第六章-jQuery
jQuery的理念是: 写更少的代码, 完成更多的工作 jQuery有两个版本1.x和2.x, 版本2.x不再支持IE678 jQuery最明显的标志就是$, jQuery把所有的功能都封装在了jQu ...
- 【Lintcode】137.Clone Graph
题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. ...
- HDU4348:To the moon
浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227. ...
- 转:JDBC Request使用方法
1. 下载mysql jar包 下载mysql jar包 http://dev.mysql.com/downloads/connector/j/ 网盘下载地址:mysql-connector-ja ...
- MySQL 之 导出导入数据
导出数据库(sql脚本) mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u root -p --databases db_name > test ...
- day1 java基础回顾-多线程
启动线程方式 方式一:继承Thread. 1. 自定义一个类继承Thread类. 2. 重写Thread的run方法,把自定义线程的任务代码定义在run方法上. 3. 创建Thread子类的对象,并且 ...
- javascript 函数属性prototype(转)
在JavaScript中并没有类的概念,但javascript中的确可以实现重载,多态,继承.这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释. 1.pro ...
- Gym - 101142J Java2016 (构造)
题意:给定一个数字,让你构造成一些表达式,最后结果是该数字的概率要大于50%. 析:我们可以把一个数分解是2的多少次幂,然后加起来就好. 代码如下: #pragma comment(linker, & ...
- 一次偶然的点开一盏灯引发的SEO初识
事情是这样,不小心点开了dev tools的审计(audits)面板,点开了灯之后,画风如下 emmm, SEO 跑了满分也,好奇宝宝就往下滚到SEO区域,发现了如下新大陆 嗯,原来是应用满足了打钩的 ...