HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即便用加密通信以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:算法
HTTPS连接的创建过程当中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通讯过程当中使用的对称秘钥几个内容。安全
下图简要的说明了这个流程的实现。服务器
一开始我也心存疑问:为何要单独使用另一组对称秘钥来实现对信息的加密而不直接使用服务器和客户端双方的非对称秘钥呢?我自身很是认同下面这个回答的解释:网络
传输过程使用对称密钥是由于对称加密比非对称加密的运算量低一个数量级以上,因此这样的方式能够提升双方会话的运算速度。ui
对于加密算法不是很是了解,但愿大牛指点一二。加密
HTTPS中一个关键就是证书文件。固然咱们能够找专业的第三方机构签发。本身玩玩的话就用自签名的证书就能够了,用户在访问的时候则须要确认安全性问题。
一、生成传输pre-master secret的时候所须要的Server端的私钥,运行时提示须要输入密码,用于对key的加密。之后每次读取此文件的时候,都须要输入指令。spa
# 生成服务器端的非对称秘钥 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连接中使用的文件是code
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方法会阻塞其余进程直到文件的读取完毕,在读取关键的配置文件的时候这样的方法是比较适宜的。server