网络协议之https?
写在前面
https协议还是挺复杂的,本人也是经过了很多次的学习,依然感觉一知半解,无法将所有的知识点串起来,本次学习呢,也是有很多的疑惑点,但是还是尽量的输出内容,来帮助自己和在看文章的你来共同进步吧!
为了更加系统,行文采用线性的方式来进行,遇到一些点的话再单独展开说明。接下来我们就以https协议本身作为切入点开始吧!
1:https协议的流程
我们静下心来一步步的来看啊。首先客户端给服务端说:您好,我这边的加密套路是这样的,给你个随机数,后面有用
,随机数后续使用,这个在https协议里叫client hello
,接着服务端回复您好,我这边的加密套路是这样的,也给你个随机数
,随机数也是后续使用,这个在https协议里叫server hello
,如下方式抓包看下:
抓包看如下:
client hello可以看到加密套件信息:
接着是服务端给客户端发送这是我的证书,你也审核一下吧
,这个过程叫client certificate
,客户端收到服务端的证书后,通过自己内置的CA证书的公钥来解密信息,如果是能够解密则说明服务端的证书是找了合法的CA机构生成的(合法CA机构的公钥都是公开的,会内置在操作系统中,所以千万不要安装来路不明的操作系统,要不然你银行卡里的13块钱的余额怎么没的都不知道)
。其中加密生成签名和验证签名的过程如下图:
这样客户端在验证了服务端的证书后继续后续流程,客户端给服务端发送将随机数字使用公钥加密传输
,协议里叫Client Key Exchange
,注意这里的公钥是服务端在CA机构签过名的公钥,即和服务端自己维护的私钥是配对的(注意和CA的私钥公钥区分)
,服务端收到加密的随机数字后,就可以使用自己保密存储的私钥来解密,获取这个随机数字了。接着客户端和服务端会使用前面流程的随机数们计算出相同的密钥,作为后续数据交换对称加密使用的密钥。
获取密钥之后,为了确保各自的密钥好使,会进行一些testing看下,就是下面的交互过程:
最后就是正常加密通信过程了:
关于证书是如何生成的我们在第二部分来看下。
2:证书
在https协议中有一个很重要的角色就是证书,什么是证书呢?证书的作用就是来证明服务的身份,以及服务端公钥的合法性,如果是CA签发的证书的话(背书)
,就是合法的证书,是能够使用操作系统内置的CA公钥解密的,浏览器会认为是其实安全的,如下:
反之不安全的会提示:
我们来看下这个过程,比如你创建了一个网站现在要使用https的安全传输协议,首先要做的就是生成网站使用的私钥:
[root@host-10-150-27-148 x]# openssl
OpenSSL> genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.....++++++
....................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
OpenSSL>
这样网站的私钥就有了(千万要保密保存不要泄露)
,接着通过私钥生成网站的证书请求文件(里面有网站公钥信息【通过私钥生成】,域名,邮箱等信息【提示我们录入的】)
,后续需要发送给CA生成签名证书,生成请求文件过程如下:
OpenSSL> req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dnogdashuaige
Email Address []:3454@qq.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:111111
An optional company name []:dahuyou
接着我们就可以将server.csr交给CA机构生成签名证书了,但是真的生成是要钱的,所以我们这里来模拟。
我们知道CA生成签名也是通过自己的私钥来进行的,所以先来模拟生成私钥等信息:
OpenSSL> genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
.......++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
此时还不能签名,还需要通过私钥导出用来给其他公钥生成签名的根证书,如下:
OpenSSL> req -new -x509 -key ca.key -out ca.crt -days 365
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:hc
Organizational Unit Name (eg, section) []:bj
Common Name (eg, your name or your server's hostname) []:dahuyou
Email Address []:222@ff.com
这样,一个冒牌
的CA就有了,可以使用ca.crt
来签名生成证书了。
好,接着来生成证书啦:
OpenSSL> x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
Signature ok
subject=/C=CN/ST=BJ/L=beijing/O=hc/OU=bj/CN=dnogdashuaige/emailAddress=3454@qq.com
Getting CA Private Key
Enter pass phrase for ca.key:
这里生成的server.crt
就是在https协议交互过程中服务端给客户端的证书了。
写在后面
参考文章列表
openssl生成自签名证书(完整版)。
分布式之拜占庭问题。
图文详解HTTPS协议通信全过程,结合抓包实战分析,带你一次看透HTTPS!零基础入门到精通,收藏这一篇就够了。