简单记录下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://www.cnblogs.com/wangshen31/p/10544763.html

时间: 2024-08-30 12:57:48

简单记录下HTTPS中的SSL的相关文章

记录下工作中使用的pdf.js

在工作中遇到一个通过网页的形式浏览pdf文件以及图片的需求,图片简单,直接通过网页的形式打开这个图片的URL即可.而pdf这边,通过查询发现有一个名为pdf.js的神器. 简单介绍下,它可以在html中直接浏览pdf文件,pdf的每一页数据,通过H5的canvas进行解析,以及显示.其中还可以操作页数.滚动.打印.下载等功能.git上的地址为:http://mozilla.github.io/pdf.js/ 网上的文档资料很多,就不记录了,直接留存通用代码. <!DOCTYPE html> &

简单记录下安卓环境的搭建和第一个安卓程序的破解

来自<Android软件安全与逆向分析> 一.配置安卓环境 1.安装JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html DwonLoads->下载JDK 我下载的版本是  jdk-8u91-windows-x64.exe 一路安装好了之后,添加用户变量 JAVA_HOME 值为安装目录 I:\Android\jdk 并将I:\Android\jdk\bin添加到PATH中 CMD-> 输入ja

记录下erlang中 用http下载文件

问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能.庆亮回答了这个问题的解决方案. ibrowse:start().ibrowse:send_req("http://img1.gtimg.com/12/1293/129340/12934049_980x1200_0.jpg", [], get, [], [{save_response_to_file, true}]).如正常返回: 也可以自行指定目标文件保存路径:ibrowse:send_req(&q

简单记录下springboot+jms+activemq

1. 安装ActiveMQ 到Apache官方网站下载最新的ActiveMQ的安装包,并解压到本地目录下后运行 2. pom.xml引入  springboot配置文件中填写相关配置 3.创建生产者 @Component public class JmsProducer { private static final Logger LOG = LoggerFactory.getLogger(JmsProducer.class); @Autowired private JmsMessagingTem

简单介绍下python中函数的基础语法

python 函数 定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 特性 减少代码重复 使程序变得可扩展 使程序变得易于维护 函数的创建 python中创建函数,需要使用__def__关键字,后面写函数的名字,然后是形参列表,大体如下: def 函数名(形参列表): 函数体...... return 返回值 其中形参列表和 return返回值并不是必须的. 函数的使用 想要调用函数程序,需要以函数名加括号的形式进行调用,而括号内可以传入参数

简单记录下spark环境搭建时的几个小问题

折腾了好几天,终于可以在CenOS下用eclipse写spark程序了 当前环境是CentOS6.5,jdk7,scala2.10.4,spark0.9.1 前期因为对linux不熟悉的原因花了不少时间查阅命令.折腾了不少时间,终于把jdk8,scala2.11.0环境变量配置好了.在此环境下可以正常编译scala程序,但是在spark下运行sbt/sbt assembly时报了错误:rt.jar is broken.上google查了不少资料,大概是因为jdk8和jdk7之间的差异造成的,所以

简单介绍下微信中如何查看对方是否将你拉黑删除?

现如今微信使用的人越来越多,朋友圈中的好友也有成百个了,有很多人长时间不联系了,想知道对方是否将你拉黑删除了吗?那在微信上如何查看清理那些把你删除的好友呢?我们一起来学习下. 微信上如何查看清理那些把你删除的好友? 第一种:单个发送信息 向好友发送一条消息,验证好友是否将你删除,如果删除,系统会提示你还不是他(她)的好友,请发送好友验证请求,验证请求通过后,才能聊天.经过确认后可以果断删除该好友了,因为他已经将你删除. 第二种:查看好友相册 点击好友信息,查看好友个人相册,如果个人相册为空,一种

简单阐述下OC中UIImage三种创建方式~~~

一. 直接使用imageNamed进行创建 1 UIImage * image = [UIImage imageNamed:@"1.jpg"]; 简单说一下这种方式的优缺点: 优点:代码量少,一行代码就可以搞定.当程序中多次加载这张图片时,系统会指向同一块内存,这样可以提升效率. 缺点:系统每次会将图片缓存到计算机的内存中去,如果图片非常大,非常多,会消耗很大的计算机内存,会出现卡顿的现象. 二.将本地图片转换成NSData类型存储 1 NSString *filePath = [[N

简单记录下@RequestBody

内容参考自博客:https://blog.csdn.net/ff906317011/article/details/78552426 这个标注是用来注释controller中的请求方法中的参数的,那么什么时候要用这个注解呢? 主要看请求的方式和请求header的编码方式: 1.请求方式为get/post时,根据request header Content-Type的值来判断: 如果Content-Type是application/x-www-form-urlencoded的话,可以选择用这个注解