时间:2022-03-30 11:50:30 | 栏目:NodeJS | 点击:次
基本原理
HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即使用加密通讯以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:
握手流程
HTTPS链接的建立过程中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通信过程中使用的对称秘钥几个内容。
下图简要的说明了这个流程的实现。
一开始我也心存疑问:为什么要单独使用另外一组对称秘钥来实现对信息的加密而不直接使用服务器和客户端双方的非对称秘钥呢?我自身非常认同下面这个回答的解释:
传输过程使用对称密钥是因为对称加密比非对称加密的运算量低一个数量级以上,所以这样的方式可以提高双方会话的运算速度。
对于加密算法不是非常了解,希望大牛指点一二。
Openssl自签名证书的生成
HTTPS中一个关键就是证书文件。当然我们可以找专业的第三方机构签发。自己玩玩的话就用自签名的证书就可以了,用户在访问的时候则需要确认安全性问题。 1、生成传输pre-master secret的时候所需要的Server端的私钥,运行时提示需要输入密码,用于对key的加密。以后每次读取此文件的时候,都需要输入指令。
# 生成服务器端的非对称秘钥 openssl genrsa -des3 -out server.key 1024 # 生成签名请求的CSR文件 openssl req -new -key server.key -out server.csr # 自己对证书进行签名,签名的有效期是365天 openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt # 去除证书文件的password cp server.key server.key.orig openssl rsa -in server.key.orig -out server.key
最终在建立HTTPS链接中使用的文件是
NodeJS建立一个HTTPS的Server
var httpsModule = 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.writeHead(200); res.end("hello world\n"); }); //https默认de监听端口时443,启动1000以下的端口时需要sudo权限 https.listen(443, function(err){ console.log("https listening on port: 443"); });
这里使用的fs.readFileSync方法会阻塞其他进程直到文件的读取完毕,在读取关键的配置文件的时候这样的方法是比较适宜的。