详解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实现HTTPS发起POST请求
Apr 23 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
python 全局变量的import机制介绍
2017/09/07 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
Python深度优先算法生成迷宫
2018/01/22 Python
python如何修改装饰器中参数
2018/03/20 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
python 读取、写入txt文件的示例
2020/09/27 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL