我正在运行使用express开发的node.js服务器,它运行正常。我正在尝试使用https模块来保护它。我使用openssl生成了自签名证书和密钥,但在尝试连接时从firefox获取以下错误。 IE也没有加载安全页面。
安全连接失败
连接到localhost期间发生错误:3001。不能 与对等方安全通信:没有通用的加密算法。 (错误代码:ssl_error_no_cypher_overlap)
您要查看的页面无法显示,因为 无法验证收到数据的真实性。请 联系网站所有者告知他们这个问题。
我使用以下命令创建了密钥和证书:
>> openssl genrsa 1024 > key.pem
>> openssl req -x509 -new -key key.pem > key-cert.pem
我使用的是firefox 39.0,节点0.12.4,表示4.13.1,openssl 0.9.81,并在Windows Server 2008 R2 Enterprise中使用。
这是我的代码。 server.js是起点:节点server.js
server.js:
var http = require('http');
var https = require('https');
var fs = require('fs');
var app = require('./app');
var credentials = {
key: fs.readFileSync('./certificate/key.pem'),
cert: fs.readFileSync('./certificate/key-cert.pem')
};
http.createServer(app).listen(3000);
https.createServer(credentials, app).listen(3001);
app.js:
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var register = require('./routes/register');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//app.get("/", login.form);
app.get("/register", register.form);
app.post("/register", register.submit);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
我正在尝试使用以下方法访问该应用程序: https://localhost:3001/register
我被困在这里。请帮我解决一下。
答案 0 :(得分:1)
我很尴尬。创建证书文件时,这是我自己的错误。我忘了用openssl.cnf路径设置OPENSSL_CONF变量,证书文件创建为空白。这导致了整个问题。我们可以在命令提示符中为当前会话或在环境变量设置中的用户级别设置变量。
set OPENSSL_CONF=c:/<your .cnf location>/openssl.cnf
答案 1 :(得分:0)
这是我的错,因为没有首先检查Express.js是否通过了正确的options
字典。
我从另一个建议我测试它的开发人员那里获得了配置为可与HTTPS一起使用的Express.js代码的草图。我开始测试,并在Firefox中收到SSL_ERROR_NO_CYPHER_OVERLAP
错误。我正在尝试各种技巧:选择不同的密码,仔细检查证书等等,但是SSL_ERROR_NO_CYPHER_OVERLAP
仍然相同。
原来,options
变量具有以下键:
const options = {
key: fs.readFileSync("somekey.key"),
cert: fs.readFileSync("somekey.crt"),
ciphers: "DEFAULT:!SSLv2:!RC4:!EXPORT:!LOW:!MEDIUM:!SHA1"
};
未正确传递到以下行:
https.createServer(options, app).listen(...
所以Express.js根本没有使用有关密钥/证书的信息!