详解HTTPS 的原理和 NodeJS 的实现


Posted in NodeJs onJuly 04, 2017

基本原理

HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即使用加密通讯以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:

  1. 使用证书对服务器及请求端的身份验证
  2. 使用一组对称秘钥加密包括请求头在内的所有信息传输

握手流程

HTTPS链接的建立过程中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通信过程中使用的对称秘钥几个内容。

  1. 客户端对HTTPS的地址发出请求,并且将自己的SSL版本号等信息发送给服务器
  2. 服务器接收到请求,将服务器证书和公钥等信息返回给客户端
  3. 客户端接收到证书后向证书颁发机构验证证书的合法性。如果证书不合法(比如自行签发的证书),则向用户发出警告并确认是否继续,用户可以选择在此时离开终止HTTPS的链接。
  4. 证书合法或客户端确认在不安全的情况下继续,客户端生成pre-master secret并且使用2中收到的服务器公钥加密后发送给服务器。如果是使用交互策略的TLS,则同时需要将客户端的证书发送给服务器。服务器检查客户端的证书颁发机构是否在信任列表中,以及证书内容是否合法。若不合法,结束本次会话。
  5. 服务器使用私钥解密pre-master secret,然后双方通过一种实现商定好的加密算法生成本次通讯使用的master secret。
  6. 双方互相通知对方本次SSL握手成功,其后均使用master secret对传输内容进行加密。

下图简要的说明了这个流程的实现。

详解HTTPS 的原理和 NodeJS 的实现

一开始我也心存疑问:为什么要单独使用另外一组对称秘钥来实现对信息的加密而不直接使用服务器和客户端双方的非对称秘钥呢?我自身非常认同下面这个回答的解释:

传输过程使用对称密钥是因为对称加密比非对称加密的运算量低一个数量级以上,所以这样的方式可以提高双方会话的运算速度。

对于加密算法不是非常了解,希望大牛指点一二。

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链接中使用的文件是

  1. server.crt
  2. server.key

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方法会阻塞其他进程直到文件的读取完毕,在读取关键的配置文件的时候这样的方法是比较适宜的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs 子进程正确的打开方式
Jul 03 #NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 #NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 #NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 #NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 #NodeJs
NodeJS自定义模块写法(详解)
Jun 27 #NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 #NodeJs
You might like
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
PHP中each与list用法分析
2016/01/08 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
详解jenkins自动化部署vue
2019/05/14 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
《春天来了》教学反思
2014/04/07 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
防灾减灾标语
2014/10/07 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle