web-dev-qa-db-ja.com

Node.js / Express.jsチェーン証明書が機能しない

ExpressにはSSLサーバーがありますが、一部のブラウザーはチェーン証明書(独自の中間証明書を持っている)を必要とするため、すべてのブラウザーで動作しません(ユーザーがWebサイトを手動で信頼しない限り)。中間証明書とチェーン証明書を1つの.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にアクセスすると、FirefoxはそのIDを認識せず、手動で信頼する必要があります。この問題を修正するにはどうすればよいですか?

ありがとう、

27
darksky

中間証明書ファイルに複数の証明書ブロックが含まれていますか?

その場合は、それらを異なるファイルに分割し、1つずつ読む必要があります。 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) {
    // ...
});
64
Jeroen Moors

サーバー上のSSL関連ファイルを実際に変更できない場合に便利な小さなスニペット-「ssl chain」ファイルを自分で分割できます。 SSLで動作するためにNodeおよびsocket.io(クライアントで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);
8
alchemication