简单记录下HTTPS中的SSL

Posted wangshen31

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单记录下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的主要内容,如果未能解决你的问题,请参考以下文章

为啥 keycloak 会删除重定向 uri 中的 SSL?

python龙卷风中的SSL(https)

你的MySQL服务器开启SSL了吗?SSL在https和MySQL中的原理思考

https证书较验不通过

SSL&HTTPS简单介绍

安全科普:理解SSL(https)中的对称加密与非对称加密