Запуск сервера SSL node.js с godaddy gd_bundle.crt
У меня возникли проблемы с получением моего SSL-сервера, работающего с сертификатом godaddy
Использование Express: 3.1.0
Ниже это работает с ключом /crt, который был сгенерирован локально/не подписан с помощью go daddy (браузер жалуется, но если вы добавляете исключение, он работает.
var http = require('https');
var privateKey = fs.readFileSync('/var/www/dev/ssl/server.key').toString();
var certificate = fs.readFileSync('/var/www/dev/ssl/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var https = http.createServer(credentials, app);
С godaddy мне предоставлен дополнительный файл gd_bundle.crt, который, как я полагаю, вы реализуете, как это, однако я получаю сообщение об ошибке
var http = require('https');
var privateKey = fs.readFileSync('/var/www/prod/ssl/mysite.key').toString();
var certificate = fs.readFileSync('/var/www/prod/ssl/mysite.com.crt').toString();
var ca = fs.readFileSync('/var/www/prod/ssl/gd_bundle.crt').toString();
var credentials = {key: privateKey, cert: certificate, ca: ca};
var https = http.createServer(credentials, app);
В этой конфигурации я получаю: Ошибка 107 (net:: ERR_SSL_PROTOCOL_ERROR): ошибка протокола SSL.
По правде говоря, я не создаю их ключей/сертификатов, которые делает наш дефолтный парень... Я не уверен, как я могу устранить неполадки, если я неправильно использую godaddy или если у вас есть способ убедиться, что он настроил ключ /crt файлов правильно....
Кто-нибудь видит что-то явно явно неправильное?
Ответы
Ответ 1
Node требует, чтобы каждый сертификат в цепочке CA передавался отдельно в массиве. gd_bundle.crt
вероятно выглядит следующим образом:
-----BEGIN CERTIFICATE-----
MIIE3jCCA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEADCCA...
-----END CERTIFICATE-----
Каждый сертификат необходимо поместить в его собственный файл (т.е. gd1.crt
и gd2.crt
) и читать отдельно.
https.createServer({
key: fs.readFileSync('mysite.key'),
certificate: fs.readFileSync('mysite.crt'),
ca: [fs.readFileSync('gd1.crt'), fs.readFileSync('gd2.crt')]
});
Ответ 2
Попросите GoDaddy для вашего сертификата ssl в подпись SHA-1 и сломайте файл пакета в два файла, таким образом...
ОТ вашего gd_bundle.crt
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldX
RQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8
-----END CERTIFICATE-----
TO gd_bundle_01.crt
-----BEGIN CERTIFICATE-----
MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
-----END CERTIFICATE-----
И gd_bundle_02.crt
-----BEGIN CERTIFICATE-----
56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldX
RQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8
-----END CERTIFICATE-----
то на вашем сервере сделайте это
var fs = require('fs'),
https = require('https');
var ssl = {
key: fs.readFileSync('./ssl/server.key', 'utf8'),
cert: fs.readFileSync('./ssl/server.crt', 'utf8'),
ca: [fs.readFileSync('./ssl/bundle_01.crt', 'utf8'),
fs.readFileSync('./ssl/bundle_02.crt', 'utf8')]
};
https.createServer(ssl, function(req, res) {
//... your code here ...
}).listen(443);
Ответ 3
Недавно у меня была аналогичная проблема с сертификатами SSL Godaddy на одном из наших серверов node.js. В моем случае проблема заключалась в том, что один из наших серверов проверял SSL с помощью функций curl PHP.
Оказывается, мне пришлось выбрать алгоритм SHA-1 signature при отправке CSR в Godaddy. Я думаю, что он более совместим со старыми системами.
Ответ 4
Упрощенный
Почему так важно только для комплекта GoDaddy CA, когда вы можете поддерживать один и тот же подход для разных сред? Мне нужны только два файла для dev env например, но в производстве используются сертификаты GoDaddy и у многих есть что делать?
Для GoDaddy я беру их комплект и добавляю его в один файл и называю расширение как PEM, а также ключевой файл, который дает довольно стандартный подход для всех типов сертификатов.
Затем вы просто делаете это для всех сред:
server = https.createServer({
key: fs.readFileSync(config.sslKey),
cert: fs.readFileSync(config.sslCert),
},app).listen(config.sslPort);
В вашем файле сертификата GoDaddy cert.pem вы просто поместите свой сертификат и ваши файлы пакета с 1 на x (сверху вниз), и вы сделаете так:
-----BEGIN CERTIFICATE-----
site certificate goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 1 goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA 2 goes here
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
CA X goes here
-----END CERTIFICATE-----
Не обязательно лучше, но я предпочитаю это. Я не сталкивался с Express 3.x, что мне приходилось делать маршрут массива CA, но я мог ошибаться в конкретной версии.