首先安装openssl 64位,找到目录,在bin下面有openssl可执行程序
当前目录下生成private.pem openssl genrsa 1024 > private.pem //注意环境变量的设置,否则会出现错误,这里请改成自己的目录 set OPENSSL_CONF=I:\OpenSSL-Win64\bin\cnf\openssl.cnf // #私钥文件再生成CSR证书签名 openssl req -new -key ./private.pem -out csr.pem #通过私钥文件和CSR证书签名生成 509 openssl x509 -req -days 365 -in csr.pem -signkey private.pem -out server.crt
用根证书再生成证书也是可以的
当然也可以用以下全步骤生成 //生成CA私钥 openssl genrsa -out ca.key 1024 //生成csr文件 openssl req -new -key ca.key -out ca.csr //生成自签名证书 openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt //生成server.csr文件 openssl req -new -key server.key -out server.csr //生成带有ca签名的证书 openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
nodejs 代码var https=require('https');
var ws=require('ws');
var fs=require('fs');
var keypath=process.cwd()+'/server.key';//我把秘钥文件放在运行命令的目录下测试
var certpath=process.cwd()+'/server.crt';//console.log(keypath);
console.log(certpath);
var options = {
key: fs.readFileSync(keypath),
cert: fs.readFileSync(certpath),
//passphrase:'1234'//如果秘钥文件有密码的话,用这个属性设置密码
};
var server=https.createServer(options, function (req, res) {//要是单纯的https连接的话就会返回这个东西
res.writeHead(403);//403即可
res.end("This is a WebSockets server!\n");
}).listen(8544);
//https服务器创建websocket 的wss服务
var wss = new ws.Server( { server: server } );
wss.on( 'connection', function ( socket ) {
socket.on( 'message', function ( message ) {
//console.log( message );
if(message === "bye"){
console.log("client out");
socket.close();
}
socket.send(message);
});
});
//利用nodejs再建立一个https文件,为什么呢,因为wss 不能直接由文件来链接,跨域了,wss只能由https来链接,但是在http下ws代码是可以直接访问wsserver的,因为html文件默认是在http协议下,这个一定要搞清楚
//命名位testserver.js
var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
//同步读取密钥和签名证书
var options = {
key:fs.readFileSync('./server.key'),
cert:fs.readFileSync('./server.crt')
}
var app = express();
var httpsServer = https.createServer(options,app);
var httpServer = http.createServer(app);
app.use(express.static(__dirname));
app.get('/',function(req,res,next){
res.send('Hello Express+https');
});
app.get("/so",function(req,res,next){
res.render("socket.html");
});
//https监听3000端口
httpsServer.listen(3000);
//http监听3001端口
httpServer.listen(3001);
写一个html文件,放在根目录下,命名为socket.html
wss connect
function WssConnect()
{
if ("WebSocket" in window)
{
// 打开一个 web socket
var wss = new WebSocket("wss://127.0.0.1:8554");
//,{protocolVersion: 8,
//origin: 'https://localhost:8554',
// rejectUnauthorized: false});
wss.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
wss.send("this is a test");
};
wss.onmessage = function (evt)
{
var received_msg = evt.data;
alert(received_msg);
};
wss.onclose = function()
{
alert("连接已关闭...");
};
}
else
{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
connect wss
分别执行node testserver , node test ,在浏览器里执行https://127.0.0.1:3000/socket.html, 发现返回了数据 ok,实验成功。