【问题标题】:Node.js, Firefox error : no common encryption algorithm(s). (Error code: ssl_error_no_cypher_overlap)Node.js、Firefox 错误:没有通用的加密算法。 (错误代码:ssl_error_no_cypher_overlap)
【发布时间】:2015-10-25 10:00:55
【问题描述】:

我正在运行一个使用 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、node 0.12.4、express 4.13.1、openssl 0.9.81 并在 windows server 2008 R2 Enterprise 中工作。

这是我的代码。 server.js 是起点:node 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

我陷入了困境。请帮我解决一下。

【问题讨论】:

    标签: node.js security firefox https openssl


    【解决方案1】:

    这是我的错,因为我没有首先检查 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 根本没有使用关于密钥/证书的信息!

    【讨论】:

      【解决方案2】:

      我很尴尬。创建证书文件时这是我自己的错误。我忘记使用 openssl.cnf 路径设置 OPENSSL_CONF 变量,并且证书文件被创建为空白。这导致了整个问题。我们可以在当前会话的命令提示符或环境变量设置中的用户级别设置变量。

      set OPENSSL_CONF=c:/<your .cnf location>/openssl.cnf
      

      【讨论】:

      • 这是否也适用于Linux 服务器?我们在哪里可以在Linux 的用户杠杆中设置environment 变量?您是否也重新生成了证书文件?
      • 在这里发布了我的问题:stackoverflow.com/questions/50194109/…
      猜你喜欢
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 2016-06-14
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多