关于SSL

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/单片机知识点总结/directory.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

 

说明

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

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

 

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

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

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

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

对称加密

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

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

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

 

非对称加密

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

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

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

 

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

 

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

 

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

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

 

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

 

 

HASH加密

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

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

 

SSL有什么用

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

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

以浏览器访问作为例子.

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

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

 

 

 

 

 

 

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

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

 

 

 

 

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

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

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

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

 

读一下

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

 

 

 

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

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

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

2.非对称加密的公钥

3.(ca机构的)签名

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

 

 

 

 

 

注意上面的签名算法写的是  SHA256 with RSA

指纹算法使用的是 SHA256 最后一个签名再用 RSA  (具体看下面的解释)

 

证书制作过程:

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

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

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

进行加密(得到的这叫指纹),然后用RSA加密算法(CA机构也有一对非对称加密的公钥和私钥,加密的时候使用的是CA机构的私钥)

对指纹再进行加密(得到的数据这就叫签名)

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

 

为啥有CA机构:

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

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

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

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

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

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

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

解析之后的数据就是先前的指纹,因为指纹是靠SHA256得到的,SHA256加密算法不能解密.

 

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

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

进行加密(得到的这叫指纹),然后用RSA加密算法(CA机构也有一对非对称加密的公钥和私钥,加密的时候使用的是CA机构的私钥)

对指纹再进行加密(得到的数据这就叫签名)

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

 

服务器传来的.pem文件里面有服务器的公钥,咱也对服务器的公钥也进行SHA256运算得到指纹

如果指纹一致说明证书是正确的.

 

 

关于自签证书:

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

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

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

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

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

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

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

 

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

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

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

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

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

为了让你的客户端可以解析你的xxxx.pem证书,你需要把 ca.crt(根证书,含有公钥)

放到客户端里面.然后就可以了

 

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

 

查看电脑上的ca证书

Windows + R

certmgr.msc

 

 

 

 

 

 

咱们的浏览器在使用https访问的时候,解开签名就是使用的这里面的ca机构的根证书

里面的公钥解开的.如果解不开就会报 该证书不合法等等

 

SSL通信过程(https)

提醒:

1.整个通信最终还是使用的对称加密算法

2.所以前期工作就两件事情:验证证书是否合法 和 协商对称加密的秘钥

 

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

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

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

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

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

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

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

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

如果解开了说明服务器真实,然后再用SHA256算法对比指纹

如果一切都OK

 

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

 

 

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

 

 

 

 

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 (证书签名算法使用的是 SHA256)

 

 

 

 

 

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

1.SSL通信版本

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

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

 

 

 

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

 

 

 

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

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

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

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

 

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

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

 

 

 

 

 

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

 

 

 

 

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

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

 

 

 

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

 

 

关于SSL证书

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

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

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

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

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

 

 

 

 

 

 

 

 

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

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

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

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

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

 

 

 

 

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

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

其实这是证书链问题!

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

 

 

 

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

常用的hash算法有MD5,SHA

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

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

 

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

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

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

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

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

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

 

 

如何自签证书

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

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

 

关于单向认证中忽略认证

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

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

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

主动权在客户端手里!

 

关于双向认证

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

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

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

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

 

 

但是呢如果是自己签发的

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

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

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

 

posted on 2020-10-05 15:30  广源时代  阅读(1562)  评论(0编辑  收藏  举报

导航

支付宝 QQ群