Подтвердить что ты не робот

Node.js/Express.js Chain Certificate Не работает

У меня есть сервер SSL в Express, который не работает во всех браузерах (если только пользователь не доверяет веб-сайту), поскольку некоторые браузеры требуют сертификат цепи (у нас есть собственный промежуточный сертификат). Я поместил наш промежуточный и цепной сертификат в один .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 не распознает его идентификатор и требует, чтобы его вручную доверяли. Как я могу исправить эту проблему?

Спасибо,

4b9b3361

Ответ 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) {
    // ...
});

Ответ 2

Удобный небольшой фрагмент, если на самом деле вы не можете изменять файлы, связанные с SSL, на сервере - вы можете разделить файл "ssl chain" самостоятельно. Потратил немного времени, когда попытался получить 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);