NodeJs-通讯系统-https与openssl

https简介

http传输是明文数据,通常端口80或者8080,https是SSL安全加密后的密文数据,通常端口443        (www.ayjs.net杨洋 )

在实际场景中,私钥和公钥都保存在服务端,在服务器与客户端相互确定彼此身份之前,公钥会传送到客户端,客户端随机发送消息给服务器端,服务器端拿到收到的字符计算成Hash值后用私钥加密再发送给客户端;客户端收到数据后用之前收到的公钥解密,解密后,把之前随机发出的消息也计算成hash值,检查是否一致;如果一致,那么握手成功,客户端选择一个加密算法和相应秘匙并用公钥加密后,发送服务器端;服务器端接收到加密算法和密匙后,也就可以正式沟通数据了

创建HTTPS服务器

openssl环境

手工编译太难了,我表示失败了3个小时,最终放弃。

下载我上传的windows编译后的: 百度云

我拷贝到了c盘,并改了名字为openssl

如果使用openssl.exe使用方法,就只能

C:\openssl\bin\openssl.exe 其他命令

创建私钥

windows版本: C:\openssl\bin\openssl.exe genrsa -out c://privatekey.pem 1024非windows的终端应该自带openssl命令了

openssl genrsa -out c://privatekey.pem 1024

那么下面的我就直接用windows的来讲了。

创建证书签名请求

C:\openssl\bin\openssl.exe req -new -key c://privatekey.pem -out c://client.csr

然后输入信息,生成证书

获取证书

证书应该是一个经过证书授证中心签名的文件,该证书文件内包含了服务器端提供的公钥以及证书的办法机构等信息

C:\openssl\bin\openssl.exe x509 -req -in c://client.csr -signkey c://privatekey.pem -out  c://certificate.pem

创建pfx文件

C:\openssl\bin\openssl.exe pkcs12 -export -in c://certificate.pem -inkey c://privatekey.pem -out c://certificate.pfx

在这些文件,pfx文件为可选用文件,文件都有了后,可以使用https模块中的createServer方法创建一个https服务器

我两次密码都是123456

新建httpsDemo.js

/**
 * Created by aaronyang on 2015/10/30.
 */
var https=require(‘https‘);
var fs=require(‘fs‘);
var privatekey=fs.readFileSync(‘c:/privatekey.pem‘);
var pc=fs.readFileSync(‘c:/certificate.pem‘);
var options={
	key:privatekey,
	cert:pc
}
var server=https.createServer(options, function (req,res) {
	console.log(req.url);
	if(req.url!==‘favicon.ico‘){
		res.setHeader(‘Content-Type‘,‘text/html‘);
		res.write(‘<html><head><meta charset="utf-8"/> </head>‘);
		res.write(‘hello ay!https服务‘);
		res.end();
	}
})
server.listen(1443,‘localhost‘, function () {
	console.log(‘服务器开始监听‘);
})

效果图:这里注意1024以下的端口,需要管理员权限才能监听

这里的createServer方法相对于http多了个options参数,这个参数值太多了,我稍微列举几个

pfx指定pfx文件读取出来的公钥以及证书。使用该属性值后,不需要指定key、cert以及ca属性值

passphrase用于为私钥文件或pfx文件指定密码。

* key指定从后缀名为pem的私钥文件中读取出来的私钥。

cert:用于指定从后缀名为pem的文件中读取出来的公钥。必须指定,除非制定了pfx值

ca:为一个字符串数组或一个buffer对象数组,用于指定一组证书,默认属性值为几个注明的证书授证中心,例如VerlSign

ciphers:属性值为一个字符串,用于描述需要使用或取消使用的密码。为了阻止BEAST攻击,推荐将ciphers属性与honorCipherOrder属性结合使用,以指定非CBC(Cipher-block chaining密码分组链接)模式的密码的优先级,默认属性值为AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH

requestCert:布尔值,默认false,为true的时候,服务器在确认链接时要求客户端提供证书。

还有handshakeTimeout,rejectUnauthorized,NPNProtocols,sessionIdContext

跟HTTP一样,当然了也有close方法,error方法,这里不列举了,具体可以参考http的

HTTPS客户端

在https模块中,可以使用request方法向其他使用HTTPS协议的网站请求数据。

https.request(options,callback)

其中options参数,跟createServer的参数是一样的。

跟http的request差不过,都只不过多了个options参数

这里讲下options中的agent参数,用于指定用户代理。在Nodejs中,使用https.Agent类代表一个用户代理。在nodejs中,用户代理默认在请求数据时使用keep-alive连接,同时使用一个全局的https.Agent对象。可以为agent属性值显式指定一个https.Agent对象,也可以通过将agent属性值指定为false的方法从连接池中自动挑选一个当前连接状态为关闭的https.Agent对下网

例如.

var opt1={
	hostname:‘npmjs.org‘,
	port:443,
	path:‘/‘,
	method:‘GET‘,
	agent:false
}
var req=https.request(opt1, function (res) {
	console.log(‘状态码:‘ + res.statusCode);
	console.log(‘响应头:‘ + JSON.stringify(res.headers));
	res.setEncoding(‘utf8‘);
	res.on(‘data‘, function (data) {
		console.log(‘data:‘+data);
	})
})

当然也有https.get方法

在建立连接的过程中,当为连接分配端口时候,触发https.ClientRequest对象的socket事件。

下面是客户端发送请求,1秒后服务器没反应,客户就断开请求abort

req.on(‘socket‘, function (socket) {
    socket.setTimeout(1000);
    socket.on(‘timeout‘, function () {
        req.abort();
    });
})

req.on(‘error‘,function(err){})

具体的用法可以参考HTTP去编写。

时间: 2024-12-27 12:07:57

NodeJs-通讯系统-https与openssl的相关文章

Nodejs+Express创建HTTPS服务器

为了使我的Nodejs服务器提供HTTPS服务,学习了一下如何利用express创建https服务器,现记录如下.(一点一点的积累与掌握吧) 1. Http与Https 介绍 HTTP: 超文本传输协议 (Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议. HTTPS:(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的

NodeJS爬虫系统初探

NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文件,robots.txt是一个协议,不是一个命令.robots.txt是爬虫要查看的第一个文件.robots.txt文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围. 一般网站的robots.txt查找方法: 例如www.qq.com http://ww

转:移动端即时通讯系统实践

移动端即时通讯系统实践 2016-04-19 廖锦幸 iOS开发探索 在信息高度发达的今天,IM基本上已经成为了一个社交应用的标配.本文将以一个移动开发者的视角,探讨移动端即时通讯系统的技术选型和关键要点. 1 即时通讯系统的需求 任何技术系统都来源于真实业务的需求,做架构设计之前应该先设定好目标.作为一个即时通讯应用,可以参考微信的使用体验,你需要保证以下特性: 1,实时.消息的接收端应该能够及时收到并处理消息. 2,不丢.需要保证所有的消息都顺利送达. 3,不重.重复的消息对用户来说是一种糟

【实战】如何亲手搭建一个分布式 IM(即时通讯) 系统

前言 老读者应该还记得我之前分享过一篇<设计一个百万级的消息推送系统>:虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码:这么久了是时候把坑填上了. 目录结构: 本文较长,高能预警:带好瓜子板凳. 于是在之前的基础上我完善了一些内容,先来看看这个项目的介绍吧: CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统:同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM . 借助 CIM 你可以实现以下需求: IM 即时通讯系统. 适用于 APP 的

easy-im:一款基于netty的即时通讯系统

介绍 easy-im是面向开发者的一款轻量级.开箱即用的即时通讯系统,帮助开发者快速搭建消息推送等功能. 基于easy-im,你可以快速实现以下功能: + 聊天软件 + IoT消息推送 基本用法 项目分为easy-im-client.easy-im-server.easy-im-common三个模块. 服务端: 执行mvn package后生成easy-im-server.tar.gz,解压后至./lib目录执行命令: java -jar -Dport=8888 easy-im-server-1

GGTalk ——C#开源即时通讯系统

http://www.cnblogs.com/justnow/ GGTalk ——C#开源即时通讯系统 下载中心 GGTalk(简称GG)是可在广域网部署运行的QQ高仿版,2013.8.7发布GG V1.0版本,至今最新是5.5版本,关于GG更详细的介绍,可以查看 可在广域网部署运行的QQ高仿版 -- GGTalk总览. GGMeeting是可在广域网部署运行的视频会议系统Demo,2015.05.11发布V1.0版本,关于GGMeeting更详细的介绍,可以查看 打造自己的视频会议系统 GGM

视酷即时通讯系统应用源码 V1.0

视酷即时通讯系统(原创),成熟稳定,拥有和微信一样强大的功能不再是梦,节省几个月研发时间迅速融合进项目中: 1.首家支持聊天室群聊 2.支持和微信一样的语音聊天,可以显示时长.未读状态,自动轮播未读语音:     3.支持发送图片.表情.GIF动画表情等:     4.数据库分库分表,速度极快,界面细节处理优美,bug极少.     5.另有注册用户.用户列表.加好友.好友列表等功能.     6.实现了发消息后,如接收方不在线,除了离线消息外,会自动推送通知,留了推送接口    7.安卓端和苹

win7在64位系统下编译openssl

以前在笔记本上配置过openssl-0.9.8g版本,今天在公司的台式机上配置死活没配置成功,机器的系统是win7,64位,编译openssl-1.0.1e出现各种莫名的错误,最后无意中编译了1.0.0.a版本编译成功了. 如果出现ml找不到的时候,直接在vc10.0/bin下拷贝就好. 参考文章:http://blog.chinaunix.net/uid-20479991-id-216269.html win7在64位系统下编译openssl,布布扣,bubuko.com

我的即时通讯系统发布前,先小秀一下

一.开发概要: 开发人员:本人 联系电话:18667102122 开发人数:1人 版权所有:杭州云寻觅网络科技有限公司 开发周期:2014-05-27 至今 备注:就一个人开发的,不要总是拿这个做了2,3个月的东西,跟几千人做了10多年的产品去比较,没有可比性.   所以比较的时候希望大家别失去理智! 二.架构及概述 1.总体架构图 2.服务端功能模块图 3.客户端功能模块图 4.客户端浏览器组件功能模块图 三.组成文件: 服务端:ImServer_5_0_0.exe 大小 88.6MB(含jd