Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1|回复: 1
打印 上一主题 下一主题

修改simpleWebRTC为不使用nginx的反向代理形式

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
跳转到指定楼层
楼主
发表于 2016-7-18 12:44:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考文章:
HTTPS 的原理和 NodeJS 的实现
基本原理
HTTP协议采用明文传输数据,当涉及敏感信息的传送时,极有可能会受到窃听或者中间人的攻击。HTTPS是HTTP与SSL/TLS的组合,即使用加密通讯以及网络服务器的身份鉴定来进行信息的安全传输。其核心有二:
  • 使用证书对服务器及请求端的身份验证
  • 使用一组对称秘钥加密包括请求头在内的所有信息传输
握手流程
HTTPS链接的建立过程中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通信过程中使用的对称秘钥几个内容。
  • 客户端对HTTPS的地址发出请求,并且将自己的SSL版本号等信息发送给服务器
  • 服务器接收到请求,将服务器证书和公钥等信息返回给客户端
  • 客户端接收到证书后向证书颁发机构验证证书的合法性。如果证书不合法(比如自行签发的证书),则向用户发出警告并确认是否继续,用户可以选择在此时离开终止HTTPS的链接。
  • 证书合法或客户端确认在不安全的情况下继续,客户端生成pre-master secret并且使用2中收到的服务器公钥加密后发送给服务器。如果是使用交互策略的TLS,则同时需要将客户端的证书发送给服务器。服务器检查客户端的证书颁发机构是否在信任列表中,以及证书内容是否合法。若不合法,结束本次会话。
  • 服务器使用私钥解密pre-master secret,然后双方通过一种实现商定好的加密算法生成本次通讯使用的master secret。
  • 双方互相通知对方本次SSL握手成功,其后均使用master secret对传输内容进行加密。
下图简要的说明了这个流程的实现。
一开始我也心存疑问:为什么要单独使用另外一组对称秘钥来实现对信息的加密而不直接使用服务器和客户端双方的非对称秘钥呢?我自身非常认同下面这个回答的解释:
传输过程使用对称密钥是因为对称加密比非对称加密的运算量低一个数量级以上,所以这样的方式可以提高双方会话的运算速度。
对于加密算法不是非常了解,希望大牛指点一二。
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# 去除证书文件的passwordcp server.key server.key.origopenssl rsa -in server.key.orig -out server.key
最终在建立HTTPS链接中使用的文件是
  • server.crt
  • server.key
NodeJS建立一个HTTPS的Servervar 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方法会阻塞其他进程直到文件的读取完毕,在读取关键的配置文件的时候这样的方法是比较适宜的。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
沙发
 楼主| 发表于 2016-7-18 13:02:38 | 只看该作者
修改server.js文件:
===================================================
var static = require('node-static');
var httpsModule = require('https');
var file = new(static.Server)();
var fs = require('fs');
var https = httpsModule.Server({
     key: fs.readFileSync('key/key.pem'),
     cert: fs.readFileSync('key/cert.pem')
}, function(req, res){
    //res.writeHead(200);
    //res.end("hello world\n");
        file.serve(req, res);
});

//https默认de监听端口时2016,注意启动1000以下的端口时需要sudo权限
https.listen(2016, function(err){  
     console.log("https listening on port: 2016");
});
/*
var app = http.createServer(function (req, res) {
  file.serve(req, res);
}).listen(2013);
*/
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2025-12-15 02:05 , Processed in 0.012823 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表