29

我在 Express 中有一个 SSL 服务器,它不适用于所有浏览器(除非用户手动信任该网站),因为某些浏览器需要链证书(我们有自己的中间证书)。我已将我们的中间证书和链证书放在一个 .crt 文件中。链+中间证书在INT_CERT_FILE变量中。它似乎不起作用。我正在使用http://www.digicert.com/help以及运行openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ "检查,但它似乎没有返回中间+链证书。

这是我的设置方式:

var fs = require("fs");
var https = require("https");
var express = require("express");

var KEY_FILE = fs.readFileSync("path/to/key/file.key");
var CERT_FILE = fs.readFileSync("path/to/crt/file.crt");
var INT_CERT_FILE = fs.readFileSync("path/to/intermediate and chain crt.crt");

var _app_https = express();
var _server_https = null;

_server_https = https.createServer({
    key: KEY_FILE,
    cert: CERT_FILE,
    ca: INT_CERT_FILE
}, _app_https).listen(443);

在 Firefox 上访问它时,Firefox 无法识别其身份并要求手动信任它。我该如何解决这个问题?

谢谢,

4

2 回答 2

68

您的中间证书文件是否包含多个证书块?

如果是这种情况,您应该将它们拆分为不同的文件并一一阅读。您可以将它们作为数组传递给ca参数。

我已经让它与下面的代码一起工作:

var https = require('https'),
    read = require('fs').readFileSync,
    httpsOptions = {
        key: read('ssl/mycertificate.key', 'utf8'),
        cert: read('ssl/mycertificate.crt', 'utf8'),
        ca: [
            read('ssl/rapidssl_1.pem', 'utf8'),
            read('ssl/rapidssl_2.pem', 'utf8')
        ]
    };

https.createServer(httpsOptions, function (req, res) {
    // ...
});
于 2013-12-07T18:17:13.233 回答
8

如果您实际上无法修改服务器上任何与 SSL 相关的文件,那么方便的小片段 - 您可以自己拆分“ssl 链”文件。尝试让 Node 和 socket.io 与 SSL 一起工作时花了一点时间(在客户端上出现 net::ERR_INSECURE_RESPONSE 错误),所以想分享一下:

var read = require('fs').readFileSync;
var privateKey = read(MY_KEY_LOCATION, 'utf8');
var certificate = read(MY_CERT_LOCATION, 'utf8');
var chainLines = read(MY_CHAIN_LOCATION, 'utf8').split("\n");
var cert = [];
var ca = [];
chainLines.forEach(function(line) {
  cert.push(line);
  if (line.match(/-END CERTIFICATE-/)) {
    ca.push(cert.join("\n"));
    cert = [];
  }
});
var credentials = {
  "key": privateKey,
  "cert": certificate,
  "ca": ca
};
var httpsServer = https.createServer(credentials, app);
var io = require('socket.io').listen(httpsServer);

于 2015-07-25T17:29:31.730 回答