宝哥软件园

详细说明HTTPS原理和NodeJS的实现

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

基本原理

HTTP协议使用明文传输数据。当敏感信息被传输时,可能会受到窃听或中间人的攻击。HTTPS是HTTP和SSL/TLS的结合,即利用网络服务器的加密通信和认证来安全传输信息。它的核心有两个:

用证书认证服务器和请求者,并用一组对称密钥加密包括请求报头在内的信息传输的所有握手过程

HTTPS链路的建立涉及服务器端证书、客户端证书(可选)、服务器端非对称密钥和后续通信中使用的对称密钥。

客户端向HTTPS的地址发送请求,并向服务器发送自己的SSL版本号和其他信息。客户端收到请求后,向客户端返回服务器证书和公钥等信息。收到证书后,客户端向证书颁发机构验证证书的有效性。如果证书不合法(如自发证书),系统会警告用户并确认是否继续,此时用户可以选择离开终止HTTPS的链接。如果证书是合法的,或者客户端确认在不安全的条件下继续,则客户端会生成一个预主密钥,用在2中接收的服务器公钥对其进行加密,并将其发送给服务器。如果TLS使用交互策略,需要同时向服务器发送客户端的证书。服务器检查客户端的证书颁发机构是否在信任列表中,以及证书内容是否合法。如果这是非法的,请结束此会话。服务器用私钥解密预主秘密,然后双方通过商定的加密算法生成在该通信中使用的主秘密。双方通知对方SSL握手成功,然后双方使用主秘密对传输内容进行加密。下图简要说明了这个过程的实现。

刚开始的时候我也在想:为什么要用另外一套对称密钥来加密信息,而不是直接用服务器和客户端的非对称密钥呢?我非常同意以下答案的解释:

由于对称加密的计算量比非对称加密低一个数量级以上,所以在传输过程中使用对称密钥,这样可以提高双方会话的计算速度。

我对加密算法不太了解,希望大牛能给我一些建议。

Openssl自签名证书的生成

HTTPS的一个关键是证书文件。当然可以找专业的第三方来发行。如果自己玩,可以使用自签名证书,用户访问时需要确认安全问题。1.生成传输预主密钥所需的服务器端私钥,并提示您需要在运行时输入密码来加密密钥。以后每次读这个文件,都需要输入说明。

#生成非对称密钥OpenSSL gen RSA-des3-outserver . key 1024 #生成签名请求的CSR文件OpenSSL req-new-key server . key-outserver . CSR #自行对证书进行签名。签名的有效期为365天OpenSSL x509-req-days 365-in server . CSR-sign key server . key-outserver . CRT # Password cpserver . key server . key . orig OpenSSL RSA-in server . key . orig-outserver .证书文件的密钥被删除。用于建立HTTPS链接的文件是

创建一个HTTPS服务器

var Https module=require(' https ');var fs=require(' fs ');var https=httpsModule。server({ key : fs . readfilesync('/path/to/server . key '),cert : fs . readfilesync('/path/to/server . CRT ')},function(req,RES){ RES . write head(200);RES . end(' hello world n ');});//监听端口时https默认为443,1000以下的端口启动时需要sudo authority https.listen (443,function(err){ console . log(' https监听端口: 443 ');});这里使用的fs.readFileSync方法会阻止其他进程,直到文件被读取,所以这个方法更适合读取关键配置文件。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+