51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" width="100%"></iframe>

 

说明

这节来说一下SSL是怎么一回事.

讲解SSL之前咱们先学习几个加密与解密的方式.

 

注意:我下面所说的各种加密算法都有现成的API函数可以使用.

如果用户想测试下面的加密算法可以看:Mbedtls

https://www.cnblogs.com/yangfengwu/p/13693511.html

咱们以后用单片机实现SSL的时候也是用这个库.

对称加密

所谓对称加密就是密码就一个,这个密码同时用作信息的加密和解密.

咱们生活中经常见到对称加密的例子,咱们的锁和钥匙看上去就是对称加密.

在网络通信中最常用的对称加密算法: AES ,DES

 

非对称加密

上面说的对称加密有个缺点,密码传递是一个问题,如果密码在传递过程中被别人知道就完蛋了!

然后呢非对称加密就应运而生.

非对称加密有两个密码,一个是私有的密码(私钥)一个是公开的密码(公钥)

 

信息用私钥进行加密,加密的信息用公钥可以解出来.

 

信息用公钥进行加密.加密的信息用私钥可以解出来

 

在网络通信中都是把公钥公开给别人,也不用担心传递过程中被其它人知道

自己保留私钥.只要私钥不泄露就可以保证通信安全.(具体接着往下看)

 

在网络通信中最常用的非对称加密算法: RSA

 

 

HASH加密

所谓hash加密是一种加密以后不能反向破译的加密算法.

在网络通信中最常用的非对称加密算法: MD5 ,SHA

 

SSL有什么用

首先用需要明白,访问网页上面显示的是http,但是大家应该知道http的实质其实是TCP

用TCP实现的http 链接 https://www.cnblogs.com/yangfengwu/p/13209277.html

以浏览器访问作为例子.

比如说:访问我的 http://47.92.31.46/

因为没有加上SSL,所以和服务器交互的信息可以用监控助手全部看到!

 

 51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

访问链接改为 https://mnif.cn/

咱们现在看不到里面的消息了,只看到通信显示的是TLSv1.2

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

加上SSL以后其实就是 https访问了.

SSL访问的时候需要域名,所以咱在前面的时候去购买了域名.

然后呢,为域名申请了SSL证书,最后把证书配置到服务器上.

以上的配置看前面章节的文章,这节着重说一下SSL通信过程.

 

读一下

咱们先前申请的时候有一个 .KEY  和一个.PEM格式的证书

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

.KEY是咱的非对称加密的私钥

.PEM里面主要包含三块信息

1.证书颁发者和使用者信息

2.非对称加密的公钥

3.(ca机构的)签名

用户可以把.pem文件用这个解析一下 https://www.trustauth.cn/SSLTool/tool/decode_cert.jsp

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

证书制作过程:

实际上阿里云为咱节省了步骤 ,在文章的后面有具体说明

咱向第三方机构(CA机构)申请证书的时候其实是自己先生成非对称加密的公钥和私钥

然后把咱的服务器的公钥,域名,公司,地址等信息一并交给CA机构,然后CA机构会把咱的服务器的公钥用hash算法

进行加密(这叫指纹),然后用他家的私钥(CA机构也有一对非对称加密的公钥和私钥)对数据再进行加密(这就叫签名)

然后再把数据组装一下发给咱.最后呢咱到手的就是 .pem文件

 

为啥有CA机构:

我连接某个服务器,我怎么知道这个服务器是安全的呢?

要是有一家我信任的机构能够证明他是安全的,我就相信.

比较知名的CA机构 GeoTrust、baiComodo、Symantec、RapidSSL等

前面说了CA机构也有一对公钥和私钥,而且咱的电脑上也存储着所信任的ca机构的公钥(最后会说怎么看)

当咱连接一个服务器的时候,假设这个服务器向GeoTrust机构申请了证书,

咱在通信的时候,服务器会把他在GeoTrust机构申请的证书(.pem文件)发给咱,

咱电脑呢读取.pem文件,然后用GeoTrust机构的公钥解析.pem文件中的签名(如果可以解析说明确实是CA机构颁发的证书),

解析之后的数据叫做指纹

 

注意前面说了证书制作流程:

CA机构会把咱的服务器的公钥用hash算法进行加密(这叫指纹),

然后用他家的私钥(CA机构也有一对非对称加密的公钥和私钥)对数据再进行加密(这就叫签名)

然后再把数据组装一下发给咱.最后呢咱到手的就是 .pem文件

 

.pem里面有服务器的公钥,然后呢咱也对服务器的公钥也进行hash运算得到指纹

如果指纹一致说明信息也没有被篡改过. 具体解释看后面

 

 

关于自签证书:

证书也是可以自签的,其实流程和咱上知名的CA机构一个道理.

但是咱呢需要自己用 OpenSSL 软件捣鼓.(详细的操作看最后)

不过呢!问题在于,你自己虽然生成了证书,但是由于别人的电脑上没有你的公钥

所以别人的电脑解不开你的签名部分,也就没法验证.

所以呢你需要把你的根证书安装到别人的电脑上才可以.

电脑软件如果能用根证书里面的公钥解开签名部分得到指纹(呀,你是真实的)

然后对比指纹如果一致(呀,信息没有被篡改过)具体解释看后面

 

为啥又叫根证书了呢?你自己制作证书的时候首先需要生成 ca.key(私钥)  ca.crt(根证书,含有公钥)

然后你还需要再生成一个 xxxx.key 私钥 (这个就作为你的服务器上的私钥了)

然后呢.你需要用 xxxx.key 生成 xxxx.csr (证书请求文件)

最后你再用  ca.key  ca.crt   加上  xxxx.csr  生成带有签名的证书 xxxx.pem

然后服务器上就有了 xxxx.key私钥 和 签名的证书 xxxx.pem

 

其实ca机构也是这样子做的,不过人家是权威机构.

 

 

SSL通信过程(https)

提醒:

整个流程概括下就是:客户端向服务器发送一个"Client Hello"消息,

这个消息里面有自己希望采用的TLS版本,随机数,自己这边支持的加密套件等

然后服务器告诉客户端最终咱两个用哪个加密套件

所谓加密套件,就是里面有好几种算法.这几种算法在不同的阶段使用!

假设验证证书用RSA,SHA256  ;协商最后通信的秘钥用ECDHE  ;最后通信用AES

然后服务器把自己的证书发给客户端,当然还包括协商秘钥部分

客户端得到证书以后可以先看一下证书的各种信息(时间,颁发机构,证书里面的域名)

然后用自己电脑里面的CA机构的根证书尝试解开签名部分(RSA)

如果解开了说明服务器真实,然后再对比指纹.(SHA256)

如果一切都OK

 

后期通信直接用AES对称加密通信.AES对称加密的秘钥就是先前协商好的秘钥.

 

 

1.首先用客户端TCP连接上服务器(就是常说的TCP三次握手)

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

2.客户端发送消息给服务器(专业术语 "Client Hello" 消息)

消息里面包含:(只说主要的)

 

1.客户端支持的SSL版本

2.随机数1 (用作后面生成对称加密秘钥)

3.客户端支持的加密套件(一般会选择一个非对称加密算法, 一个对称加密 ,一个hash算法)

假设选择的是: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 

TLS(TLS通信)

ECDHE_RSA(采用ECDHE作为秘钥协商算法,验证证书用RSA非对称加密算法)

WITH(作用是...不知道哈)

AES_128_GCM (有了秘钥之后用AES_128_GCM对称加密算法做后期的数据加密解密操作)

SHA256 (证书的里面的CA签名是用hash算法得到的)

 51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

3.服务器返回消息给客户端(专业术语 "ServerHello" 消息)

1.SSL通信版本

2.随机数2 (用作后面生成对称加密秘钥)

3.服务器选择的加密套件为: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

4.服务器把自己的证书返回给客户端

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

5.服务器发送(专业术语 "Server Hello Done" 消息)  给客户端

服务器还发送了 "Server Key Exchange" 原因是先前选择了秘钥协商算法为 ECDHE

注意:最终的最终是使用AES对称加密做数据通信 , 既然是对称加密就要有秘钥,这个秘钥最终是啥呢?

他们两个要协商一下. 关于ECDHE的内容会在后面详细说明.

 

提醒:因为当前是单向认证,所以只有服务器发给客户端他的证书

如果是双向认证,服务器还会发送一个 "Cerficate Request" 消息,让客户端把他的证书也发给服务器.

 51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

6.客户端发给服务器;还是协商对称加密秘钥部分

 51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

7. 客户端发送数据给服务器

数据经过AES对称加密以后发给的服务器

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

8.以后就是采用AES对称加密通信把数据加密以后通信

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

关于SSL证书

1.咱的教程是在网页上购买的证书.其实省去了一些流程;

http://www.easyssl.cn/guide/index.aspx

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

2.真实的流程是先制作 .csr文件

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

3.点击生成以后,会生成 SSL.KEY (这是咱的对称加密的私钥,不要泄露)

还有一个 SSL.CSR (这个文件里面包含了咱的对应的公钥,还有咱填写的企业单位地址信息)

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

4.然后需要把 SSL.CSR证书请求文件信息提交给那些CA机构

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

5.我只是做演示哈,就选择SSL专业版证书

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

 

 51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

6.申请以后呢,ca机构给咱的证书和咱在阿里上给咱的是一样的

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

7.不过他里面没有 .key 因为咱制作csr的已经有了

阿里云其实也是先制作 .csr获得.key ,然后用.csr得到前面的证书 .pem

只不过是最后一块给咱的.

51-STM32+ESP8266+AIR202基本控制篇-重点详解-SSL

 

 

 

8.但是呢!阿里不一定是向CA机构申请的证书

应该是用阿里的私钥和根证书给咱生成的带有他家签名的证书

其实这是证书链问题!

道理很简单,CA机构信任阿里,那么咱也信任阿里!

 

 

 

hash算法为啥能防止数据篡改

常用的hash算法有MD5,SHA

这些算法是不可逆的,就是不能根据最后的密文往前推算.

而且每条密文都会得到唯一的密码.

 

假设我把信息发给小蜜蜂,有个人窃听了消息把消息里面的1改为了2,

然后发给了小蜜蜂,小蜜蜂根本不知道哈,咋办呢?

我在后期发送数据的时候,把信息用MD5加密一下生成一个秘密(专业术语 "摘要")

然后我把信息附加摘要一起发给了小蜜蜂

小蜜蜂收到信息以后,不忙着看信息,他把接收的信息也用MD5加密一下

然后和附加的摘要做对比,如果一致,说明信息是没有被篡改过的.

 

 

如何自签证书

大家百度 OpenSSL 自签证书就可以.

没有百度一下解决不了的问题,如果有,那就是百度两下!

 

关于单向认证中忽略认证

注意哈上面说到服务器会发送他的证书给咱!

如果是自己做程序,验不验证的咱自己说了算.

咱可以不验证,然后写上完对称加密秘钥之后,就可以通信了.

主动权在客户端手里!

 

关于双向认证

其实很简单,用ca.key 和 根证书再生成弄一套证书给客户端使用.

客户端里面保留他的 .key 和 证书.

注意哈:如果是使用的证书机构颁发的(假设用手机或者电脑)

本身电脑里面就有CA根证书,所以服务器也不需要做什么配置!

 

但是呢如果是自己签发的

你需要把根证书放到服务器上 和 客户端里面

客户端收到服务器发来服务器证书,你客户端用根证书解开

客户端发给服务器他的客户端证书,服务器也用根证书解开

 

上一篇:21-STM32+ESP8266+AIR202/302远程升级方案-扩展应用-移植远程升级包实现STM32F407VET6+串口网络模组远程升级单片机程序(ESP8266/Air202/Air302)


下一篇:ESP8266引脚的说明