非对称加密产生的背景:
在网络中,数据在客户端和服务器之间由于是明文传递,一旦网络被人监控,数据就可能一览无余地展现在窃听者面前,为此我们需要将数据加密后再进行网络传输,这样即使数据被窃听,窃听着也无法知道数据的真实内容是什么,但是对于我们的应用层协议而言,如HTTP,FTP等,我们仍然希望能够透明的处理数据,而无需操心网络传输过程中的安全问题。所以提出了SSL,SSL做为一种安全协议,它在传输层提供对网络连接加密的功能。对于应用层而言,它是透明的,数据在传递到应用层之前就已经完成了加密和解密的过程。
OSI七层模型
OSI七层网络模型 |
TCP/IP四层概念模型 |
对应网络协议 |
应用层(Application) |
应用层 |
HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) |
Telnet, Rlogin, SNMP, Gopher |
|
会话层(Session) |
SMTP, DNS |
|
传输层(Transport) |
传输层 |
TCP, UDP |
网络层(Network) |
网络层 |
IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) |
数据链路层 |
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) |
IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
1.密钥
TSL/SSL是一个公钥/私钥的结构,它是一个非对称的结构,每个服务器和客户端都有自己的公私钥,公钥用来加密要传输的数据,私钥用来解密接受到的数据。公钥和私钥是配对的,通过公钥加密的数据,只有私钥才能解密,所以在建立安全传输之前,客户端和服务器端之前需要互换公钥,客户端发送的数据需要通过服务器端的公钥进行加密,服务器哦端发送数据时则需要客户端的公钥进行加密。
node在底层采用openssl实现TLS/SSL的,为此要生成公钥和私钥通过openssl完成。
//生成服务器端私钥
$ openssl genrsa -out server.key 1024
//生成客户端私钥
$ openssl genrsa -out client.key 1024
//继续生成公钥
$. openssl rsa -in server.key -pubout -out server.pem
$. openssl rsa -in server.key -pubout -out client.pem
公钥和私钥的非对称加密虽然好,但网络中依然可能存在窃听的情况,客户端和服务器哦在交换公钥的过程中,中间人对客户端扮演服务器的角色,对服务器扮演客户端的角色,因此,数据传输过程中还需要对得到的公钥进行认证,以确认得到的公钥是出自目标服务器。
为了解决这个问题,SSL/TLS引入了数字证书来进行认证。与直接用公钥不同,数字证书中包含了服务器的名称和主机名,服务器的公钥,签名颁发机构的名称,来自签名颁发机构的签名。在通过证书中的签名确认收到的公钥是来自目标服务器的,从而产生信任关系
2.数字证书
为了确保我们的数据安全,现在我们引入了一个第三方:CA,CA作用是为了给站点颁发证书,这个证书具有CA通过自己的公钥和私钥实现的签名
为了得到签名证书,服务器端通过自己的私钥生成CSR(证书签名请求),CA机构通过这个文件颁发给属于服务器的签名证书。
- 客户端向服务端打个招呼,并告诉服务端,自己要访问哪个域名(SNI),这一步是不加密的
- 服务端向客户端打招呼,出示自己的证书,同时证书中包含了服务端的公钥,这一步也是不加密的
- 客户端验证服务端的证书是否合法,如果不合法就中止请求并报错
- 客户端生成一个后续使用密钥(用于对称加密),使用服务端的公钥对这个密钥进行加密,发送到服务端
- 服务端对上一步客户端发来的加密消息进行解密并验证