理解网络编程-4

该文章阅读需要 5 分钟,更多文章请点击本人博客halu886

网络服务与安全

在网络传输都是明文传输,一旦在传输中被截获风险很高。所以希望提供一种保证传输安全的机制,但是在应用层进行数据的加密和解密成本又太高。最初网景设立一种加密规则 SSL(Secure Socket Layer)。作为传输层加密协议,在传输层传递到应用层被解析为明文,在 IETF 将其标准化,称为 TLS(Transport Layer Security)。

Node 提供了 cypto 和 tls 以及 https 模块,cypto 模块提供了一些加密算法,例如 SHA1,md5 等。tls 提供的功能和 net 类似,但是基于 SSL/TLS 的 TCP 连接之上。https 和 http 接口一致,但是是建立在安全的连接之上。

TSL/SSL

TSL/SSL 都是公钥/私钥的结构,它们是非对称的结构,服务器和客户端各自存在各自公钥和私钥。公钥负责加密数据,私钥负责解密数据,只有私钥能解密公钥加密的数据。在建立连接时,客户端和服务器分别将公钥发送给对方。

1

Node 底层是通过 OpenSSL 生成公钥和私钥。

非对称加密虽然好但是也会存在中间人攻击的风险。当客户端与服务端建立连接时,存在一个中间服务器,对客户端来说是服务器,对服务器来说是客户端。中间服务器分别发送自己公钥给客户端和服务端。为了避免这个问题,需要存在一种对得到的公钥进行一种认证的方案。

2

为了解决这个问题,引入了数字证书。数字签名包括服务器的主机名和名称以及公钥,签名颁发机构的名称,签名颁发机构的签名。客户端通过签名校验公钥是否是合法的。

数字证书

为了确保通信的数据安全,我们建立了一个第三方 CA(Certificate Authority,数字证书认证中心)。作用是为站点颁发证书,并且 CA 中是用了公钥/私钥实现了这个证书。

为了得到签名证书,首先需要将私钥生成 csr(Certification Signtaure Request),然后在 CA 通过 crs 获得证书服务器的签名证书。并且只能在 CA 校验签名的真伪。

通过 CA 机构来颁发签名证书,需要花费一定的经历精力和物力,所以大部分公司都采用自签名来构建安全网络,也就是自己作为 CA 机构。

1
2
3
$ openssl genrsa -out ca.key 1024
$ openssl req -new -key ca.key -out ca.csr
$ openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

3

以上就是实现建立一个 CA 的步骤。但是在服务器上,需要生成 csr 然后在 CA 上生成签名,同时 Common Name 需要对应域名,不然会申请失败。

然后通过 CSR 向 CA 申请证书,需要使用 CA 的证书和私钥,然后生成带 CA 签名的证书。

客户端在发起安全连接前会获取服务端证书,然后将服务端证书与 CA 证书验证真伪。同时还包括检验服务器名称和 IP 的过程。

4

以上知识点均来自<<深入浅出 Node.js>>,更多细节建议阅读书籍:)

谢谢老板,老板必发大财!💰💰💰💰💰💰