我正在尝试让HTTPS在express.js上运行节点,我无法弄明白.
这是我的app.js代码.
var express = require('express');
var fs = require('fs');
var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');
var credentials = {key: privateKey, cert: certificate};
var app = express.createServer(credentials);
app.get('/', function(req,res) {
res.send('hello');
});
app.listen(8000);
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它似乎只响应HTTP请求.
我写了简单的node.js基于香草的HTTPS应用程序:
var fs = require("fs"),
http = require("https");
var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var server = http.createServer(credentials,function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
server.listen(8000);
Run Code Online (Sandbox Code Playgroud)
当我运行这个应用程序时,它会响应HTTPS请求.请注意,我不认为fs上的toString()结果很重要,因为我已经使用了两者的组合而仍然没有es …
我正在尝试创建一个安全的node.js服务器,以便与使用ssl(https)的网站一起使用.
const crypto = require('crypto'),
fs = require("fs"),
http = require("http");
var privateKey = fs.readFileSync('/home/privatekey.pem');
var certificate = fs.readFileSync('/home/certificate.pem');
var credentials = crypto.createCredentials({key: privateKey.toString(), cert: certificate.toString()});
var handler = function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
};
var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8084);
Run Code Online (Sandbox Code Playgroud)
但是,当我启动我的服务器时,我收到以下错误:
node.js:116
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Object #<Server> has no method 'setSecure'
at Object.<anonymous> (/home/meshdev/public_html/js/node/server/test.js:16:8)
at Module._compile (module.js:380:26)
at Object..js (module.js:386:10)
at Module.load (module.js:312:31) …Run Code Online (Sandbox Code Playgroud) 我正在尝试启动https node.js服务器.
我首先按照本指南创建证书和密钥:
http://gaboesquivel.com/blog/2014/nodejs-https-and-ssl-certificate-for-development/
我把它们放在我的/app_name/security/keys目录中.
要启动我的https服务器,我有以下内容:
const https = require('https'),
fs = require('fs');
if(app.get('env') === 'development') {
console.log('dev env!!'); //prints correctly
console.log('port: ' + port); //prints correctly
const options = {
key: fs.readFileSync('./security/keys/key.pem'),
cert: fs.readFileSync('./security/keys/cert.pem')
};
https.createServer(options, (req, res) => {
console.log('https good to go'); //this does not print out anything
}).listen(port);
}
Run Code Online (Sandbox Code Playgroud)
当我去https://localhost:3000,页面抛出一个错误
This site can’t be reached
localhost unexpectedly closed the connection.
ERR_CONNECTION_CLOSED
Run Code Online (Sandbox Code Playgroud)
但是服务器端控制台上没有错误.此外,如果我去常规localhost:3000,我得到:
The localhost page isn’t working
localhost didn’t send …Run Code Online (Sandbox Code Playgroud) 我一直在互联网上寻找直接的答案,但大多数解决方案都涉及使用Express并提供HTTP内容以实现安全连接.我对Node.js和socket.io 的安全Web套接字连接(wss)更感兴趣
我没有将Node.js用于HTTP请求.我使用与Node.js一起使用的socket.io模块将消息实时传递给我的应用程序.我只使用节点进行Web套接字连接.
我会简单解释一下我的设置是什么.我使用Django作为我的HTTP后端.用户向Django发出请求,Django将该请求的内容转发给Redis,Node.js在Redis的一个频道上侦听,它处理内容并将消息发送给适当的收件人.
非常简单直接.一切正常.但我担心与Node.js的websocket连接是不安全的.当Node.js向收件人发送消息时,我不希望任何人在其间窥探并拦截该消息.我想确保我的用户感到安全并相信我为他们建立的服务.
我查看了CA的自签名证书和证书.两者都提供相同级别的安全性.由于我只使用Node.js作为socket.io并且不提供HTTP内容,因此自签名证书可以正常工作(我构建的服务是针对移动设备的,而不是针对浏览器的!)
下面是我对socket.io的实现:
var io = require('socket.io').listen(8000);
var redis = require('socket.io/node_modules/redis')
var redisChannelConnection = redis.createClient(6000, "12.345.678.9");
var redisServer = redis.createClient(6000, "23.456.789.1");
// Subscribe to Redis Channel
redisChannelConnection.subscribe('messages');
io.sockets.on('connection', function (socket) {
socket.emit('message', 'Hello World');
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我刚刚编写了一个简单的连接函数.它可以作为普通的websocket连接.但我想使它成为一个安全的websocket连接.我有多少这样做?
谢谢您的帮助.
此代码在node v7.9.0(Electron当前使用的版本)中创建一个https服务器,并监听端口8000:
require('https').createServer(
{},
(req, res) => {
res.writeHead(200);
res.end('hello world/n');
}
).listen(8000);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我在服务器运行的情况下在 Chrome 中访问https://localhost:8000时,我收到 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。我该如何克服这个错误?如何查明服务器正在提供哪些密码以及它正在使用哪种协议(希望是最新版本的 TLS)?
编辑此错误也发生在节点 v8.5.0 上,这是撰写本文时最新的 Node 稳定版本
我有以下非常基本的 Node.js 服务器:
"use strict";
const http = require("http");
const https = require("https");
const fs = require("fs");
http.createServer((req, res) => {
console.log("regular works");
res.end("Regular response");
}).listen(3000);
https.createServer({
key: fs.readFileSync("/etc/letsencrypt/live/domain.com/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/live/domain.com/cert.pem")
}, (req, res) => {
console.log("secure works");
res.end("Secure response");
}).listen(3001);
Run Code Online (Sandbox Code Playgroud)
我将其运行为sudo node filename.js,只是因为其中的文件/etc/letsencrypt/live仅限根目录。我稍后会正确执行此操作,这仅用于测试。
运行时,我可以很好地访问端口 3000。服务器控制台打印regular works,浏览器显示Regular response。但是,端口 3001 返回空响应,并且没有消息打印到服务器。
LetsEncrypt 文件是用它生成的./letsencrypt-auto certonly --standalone -d domain.com --email email@gmail.com --agree-tos并且看起来有效。
为了达到预期的结果,我缺少什么?
我最近从 Positive ssl 购买了个人 ssl 证书。在我通过激活和验证解决了所有问题后,我终于能够下载证书文件了。
我得到的文件是:
www.niknet.ddns.net.ca-bundle
www.niknet.ddns.net.crt
www.niknet.ddns.net.p7b
Run Code Online (Sandbox Code Playgroud)
在我只使用.keyand之前.crt
,它工作得很好,但现在我正在使用.ca-bundleand 该.crt文件,这是我用来将这些文件包含到 Node js 中的 ssl 库中的代码
var httpPort = process.env.PORT || 80;
var httpsPort = process.env.PORT || 443;
var server = http.createServer(app).listen(httpPort);
var server = https.createServer({
secureProtocol : 'TLSv1_2_server_method',
ciphers : "AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH",
honorCipherOrder : true,
ca: fs.readFileSync(__dirname + '/niknet_ddns_net.ca-bundle'),
cert: fs.readFileSync(__dirname + '/niknet_ddns_net.crt')
},app).listen(httpsPort);
var io = require('socket.io').listen(server);
Run Code Online (Sandbox Code Playgroud)
但我一生都无法获得正常工作的证书。我刚刚收到这个错误
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Run Code Online (Sandbox Code Playgroud)
我一直在阅读其他帖子并尝试添加他们的代码但没有任何效果。我还在某处读到,node.js 的 ssl 或 tls 库已过时,并且我的证书可能太新。如果这是真的,我还可以使用其他第三方 ssl 库吗?