详解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、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 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编程每天必学之表单验证
2016/03/01 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
javascript常用的方法整理
2015/08/20 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
WebPack基础知识详解
2017/01/16 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
numpy排序与集合运算用法示例
2017/12/15 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
商务英语毕业生自荐信范文
2013/11/08 职场文书
毕业生就业自荐书
2013/12/15 职场文书
高中自我鉴定
2013/12/20 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技