node.js - nodejs - tls express
Ejecutando SSL node.js server con godaddy gd_bundle.crt (4)
Tengo problemas para que mi servidor SSL funcione con los certificados de GoDaddy
Utilizando Express: 3.1.0
A continuación, esto funciona con una clave / crt que se generó localmente / no firmada por go daddy (el navegador se queja, pero si agrega una excepción, funciona.
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);
Con GoDaddy, recibo un archivo extra gd_bundle.crt que creo que implementas así, sin embargo, recibo un error.
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);
Con esta configuración me sale: Error 107 (net :: ERR_SS__PROTOCOL_ERROR): error de protocolo SSL.
A decir verdad, no estoy creando las claves / certificaciones que nuestro devops guy ... No estoy seguro de cómo puedo solucionar los problemas si estoy implementando los GoDaddy de forma incorrecta o si hay una manera de asegurar que configure los archivos key / crt correctamente. ....
¿Alguien ve algo descaradamente obviamente mal?
El nodo requiere que cada certificado en la cadena de CA se pase por separado en una matriz. gd_bundle.crt
probablemente tiene este aspecto:
-----BEGIN CERTIFICATE-----
MIIE3jCCA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEADCCA...
-----END CERTIFICATE-----
Cada certificado debe colocarse en su propio archivo (es decir, gd1.crt
y gd2.crt
) y leerse por separado.
https.createServer({
key: fs.readFileSync(''mysite.key''),
certificate: fs.readFileSync(''mysite.crt''),
ca: [fs.readFileSync(''gd1.crt''), fs.readFileSync(''gd2.crt'')]
});
Recientemente tuve un problema similar con los certificados SSL de Godaddy en uno de nuestros servidores node.js. En mi caso, el problema fue que uno de nuestros servidores validaba SSL utilizando las funciones de enrollamiento de PHP.
Resulta que tuve que elegir el algoritmo de firma SHA-1 al enviar el CSR a Godaddy. Supongo que es más compatible con sistemas más antiguos.
Solicite a GoDaddy su certificado ssl con la firma SHA-1 y divida el archivo del paquete en dos archivos, de esta manera ...
DESDE tu 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-----
Y gd_bundle_02.crt
-----BEGIN CERTIFICATE-----
56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VILs9RaRegAhJhldX
RQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/bvZ8
-----END CERTIFICATE-----
entonces en tu servidor haz esto
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);
Mas simple
¿Por qué ser tan específico solo para el paquete de CA de GoDaddy cuando puede mantener el mismo enfoque para diferentes entornos? Solo necesito dos archivos para dev env, por ejemplo, pero la producción está usando certificados de GoDaddy y tiene muchos más, ¿qué hacer?
Para GoDaddy, tomo su paquete y lo agrego en un solo archivo y nombro la extensión como PEM, así como el archivo de claves, que proporciona un enfoque bastante estándar para todos los tipos de certificados.
Entonces terminas haciendo esto para todos los entornos:
server = https.createServer({
key: fs.readFileSync(config.sslKey),
cert: fs.readFileSync(config.sslCert),
},app).listen(config.sslPort);
En su archivo cert.pem de GoDaddy, simplemente coloque su certificado y sus archivos de paquete de 1 a x (de arriba a abajo) y listo:
-----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-----
No necesariamente mejor, pero lo prefiero. No encontré en Express 3.x que tenía que hacer la ruta de la matriz de CA, pero podría estar equivocado para la versión específica.