Node.js / Express.js链证书不起作用

我在Express中有一个SSL服务器,因为有些浏览器需要链式证书(我们有我们自己的中间证书),所以在所有的浏览器上都不行(除非用户手动信任网站)。 我把我们的中间和链式证书放在一个.crt文件中。 链+中级证书位于INT_CERT_FILEvariables中。 这似乎并不奏效。 我正在使用http://www.digicert.com/help ,以及运行openssl s_client -connect tasker.adnxs.net:443 -showcerts | grep "^ " 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不能识别其身份,并要求手动信任该身份。 我该如何解决这个问题?

谢谢,

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

如果是这样的话,你应该把它们分成不同的文件并逐一阅读。 你可以将它们作为一个数组传递给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) { // ... }); 

方便的小片段,如果你实际上不能修改服务器上的任何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);