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 не распознает его идентификатор и требует, чтобы его вручную доверяли. Как я могу исправить эту проблему?
Спасибо,
Ответы
Ответ 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);