我在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无法识别其身份并要求手动信任。我该如何解决这个问题?
谢谢,
答案 0 :(得分:62)
您的中间证书文件是否包含多个证书块?
如果是这种情况,您应该将它们分成不同的文件并逐个阅读。您可以将它们作为数组传递给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) {
// ...
});
答案 1 :(得分: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);