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

Запуск сервера 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 файлов правильно....

Кто-нибудь видит что-то явно явно неправильное?

4b9b3361

Ответ 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, но я мог ошибаться в конкретной версии.