Ayer instalé mi primer certificado oficial. Se trata de un Positive SSL de Comodo, de unos 4 euros al año. Comprado en DonDominio para más detalles: Comodo Positive SSL

Llevaba unos cuantos días usando un certificado casero o «self-signed certificate» (Creating a Self-Signed SSL Certificate) porque aun no tenía comprado el dominio. Pero ayer ya me decidí así que voy a explicar cuáles fueron los pasos, ya que en realidad es mucho más sencillo de lo que pudiera parecer, claro que la primera vez es más complicado. Además para Node.js no es que haya muchos tutoriales, así que creo que merece la pena.

Bueno, primer paso, comprar el certificado. Para ello hay que rellenar un formulario, el CSR (Certificate Signing Request) con los siguientes datos:


  • Dominio/Subdominio
  • Empresa/Organización
  • Sección/Departamento
  • Email
  • País, provincia y localidad

Esto está muy bien, claro que cuando no eres una empresa pueden surgir dudas ¿verdad? Al menos ese fue mi caso, ¿qué pongo en «empresa»? ¿es importante o puedo poner cualquier cosa? Tras consultar con el soporte técnico de DonDominio (muy majos dicho sea de paso) me informan de que al tratarse de un certificado de validación de dominio (y no de validación de empresa) se puede poner el dominio. Y en la sección o departamento pues… otro tanto de lo mismo. Así que el CSR quedaría tal que:

  • Dominio: www.midominio.com (Sí, con el www. No pasa nada porque este certificado en concreto funcionará también para el dominio sin www)
  • Empresa: MiDominio.com
  • Sección: MiDominio

Vale, con esto se genera el CSR y DonDominio nos proporciona la que será nuestra clave privada. Debemos guardar esto en un archivo, que llamaremos midominio.com.key para más adelante, y tendrá un aspecto tal que así:

-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC3hD6pqd7yWwd4
PatD050n805m5WBs1YkCksMtC6kN7Dq7J0DO7V9y1HvOD0/evAYjhRPNFhPpK3R6
+ycq3di4/EXbLJgViyGzREwKdj7OFe4+kUeatA6V2V86BGJNKgyo4GscLPl+8Xa5
Yv69YX1KQLslwRvf9lm1J5aQOh1Xrl5HPLBwDn59GeXor4l4GyLjdpUPWv/I92av
66y53TJ2baNKAQKHjopsRM0c0Tt7i+OVIz5WHx++TWmIOqEQ4gWEWj/IslPciY6i
+sa9nNE0UkmDLpII5aqy3E20jFgF+OHopmCMN+qmkLTG7Pk7fL5+pht/ZmCZVyDc
hq0NYkHpAgMBAAECggEAeBP99IIEMUxCzPh9EbprQGhJKqa3uz7VkWt6bgUNLuD9
ZOxASaWkKMH/+EqoljMtSRyQYkcp7A3U/4tKi4/xeMkI5Gp/cMlC2cu8fbP1UF+l
LiddVOqwCHjdCFdKAveapP2C2ELNVbSlXJRb3orlsio8ym1a0eaduB0ZNXHxNSb0
EoiPJ3NrTlqvynMgYbeedUYCLNB125IiNlzK7SNIKXpDCuZmKdyClxsPgl47u4EG
GEy4TEYUC6I3IhRl8jVsU6a7dZtJGleo2xUxyZ2LkAFl01k5b5XGre2ulhZiugTJ
AP7zk67kXtv2W4YDgEiNSW3WwfEogMN1nI7QKWaxCQKBgQDtYmsGP3sHN8HcpIb/
9on94CB00kksBJnm4O/sctFvd1eVb9mbN+uDWpYrJtAFVXIFeA0X6SuD0YU56XT5
rgptAgRqgscBwQaEalxuYj7hDZe/CVZrDwBRAgjnbsXxDluIVsQM+BnHt7izhzva
iGHo4mdGC1nzUpEkhESh4iN3KwKBgQDF6Gi6cI7E4WuUp+vdyKHfAUeuoIMPSVaT
U7k0BZQ/wx9K2Gn/QTKZrfCMXYkoJSQvmzyqBP1yDdFTyK7xvkGwZ/Q+MpKIVwnz
rKwqig4opZLtBaoVg/KpXctuwEt6S5b62msUszrZ6TfZkG0a45qOcAmtTSAf8XbS
r9hrnevhOwKBgCAmcDBMcLEskAf+EHqiPVYxALRRtq9LgDyQwm3Xrx3Vn/sRRvuK
u07y+dumSg4u4F51P/C5F7emrNCHGdynAap513dFdwZ5yhQtA4+/ppx8ZszsytN9
GKHgEKyniA95zlPMzIilIXi3HUDTU/vo9LnB0BLgfrJBwH6dm14BbqQ5AoGAORw4
HJUenfHu+Zb7maSsEY5tAReQuniPYzRl3X0+qqfD//UzoVVPJMntAJR9X/hX2OUT
PHz0JlWWcncXBOvCSQW2lbxCGNXRKWBKznvIWmit3Xgk/NB21ika63rSTRhDGWCu
RerysK98Tmw/D+NeVnw+TqRTAOTNRT85VNTdnMECgYBSvHAqF6munuANKHjdzWDI
RRVEczDsdAooVIV2PSvM6JaOeL4kBU7ckDnarf+sM1dx5sBl9K0TeiRJGRZgfI9X
Ixd+YfQL9ENXBLMrWDqvZdVbduen3bVl5MUFKUJZJo0CkG2OKoReOiAeCcIDbpIq
BP3E82f9L/a3Bm5ACIefag==
-----END PRIVATE KEY-----

Completado el proceso de compra ya solo falta esperar a que nos llegue el email de verificación, que es básicamente un link que debemos pulsar. En pocos minutos (muy pocos de hecho) Comodo nos enviará un email con un archivo .zip adjunto. Dentro de ese zip vienen tres ficheros:

  • AddTrustExternalCARoot.crt (Root CA Certificate)
  • PositiveSSLCA2.crt (Intermediate CA Certificate)
  • www_midominio_com.crt (Your PositiveSSL Certificate)

Bien, DonDominio nos enviará también un email con estos mismos datos, pero más preparaditos. Concretamente nos adjunta dos archivos:

  • certificate.crt: El certificado SSL
  • certificate.ca-crt: Los certificados SSL intermediarios

ACTUALIZADO 20/06/14: he descubierto que lo que nos manda DonDominio no nos sirve tal cual. Resulta que en el navegador del ordenador sí que estaba funcionando, pero en el móvil daba una advertencia de seguridad diciendo que el certificado no era de confianza (tanto chrome como firefox). Así que vamos a utilizar los archivos que nos envía Comodo. Vamos a crear dos archivos:

  • ca
  • cert

Son los dos archivos que debemos pasarle a la configuración de Express.
El primero es justo el AddTrustExternalCARoot.crt. Listo.
El segundo es un poco más elaborado, hay que añadirle a www_midominio_com.crt el contenido de PositiveSSLCA2.crt. Tampoco era tan complicado. Resumiendo:

  • ca = AddTrustExternalCARoot.crt
  • cert = www_midominio_com.crt + PositiveSSLCA2.crt

El aspecto del ‘cert’ sería tal que así:

-----BEGIN CERTIFICATE-----
MIIENjCCAz6gAwIBAgIBATANBgkqhkuG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
[ etc etc etc ]
Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
mnkPIAou1Z5jJh5VkpTLghdae7C8x49OhgQ=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEPDCCAySgBwIBAgIQSEus7arH1xND0aJ0NUmXJTANBgkqhkiG9w0BAQUFADBv
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
[ etc etc etc ]
NREU768A/l7qX46w2ZJZuvwTlqAYAVbO2vYoC7Gv3VxPXLLzj1pxz+0YrWOIHY6V
9+qV5x+tkLiECEeFfyIvGh1IMNZMCNg3GWcyK+tc0LL8blefBDVekAB+EcfeEyrN
pG1FJseIVqDwavfY5/wnfmcI0L35tsNhAgFlubgvz1u=
-----END CERTIFICATE-----

Y con esto ya lo tenemos todo, ahora vamos a montarlos en el servidor:

var express  = require('express');
var app      = express();
var fs		 = require('fs');
var https	 = require('https');

var credentials = {
	ca: fs.readFileSync(__dirname+"/ssl/certificate.ca", 'utf8'), //la certification authority o CA
	key: fs.readFileSync(__dirname+"/ssl/midominio.com.key", 'utf8'), //la clave SSL, que es el primer archivo que generamos ;)
	cert: fs.readFileSync(__dirname+"/ssl/certificate.crt", 'utf8') //el certificado
};

app.configure(function() {

	// set up your express application

});

var httpsServer = https.createServer(credentials, app);
httpsServer.listen(443);

Lógicamente deberás cambiar el:

__dirname + "/ssl/certificate.ca"

Por la ruta donde hayas metido los archivos. Pero hemos terminado, así de sencillo, todo en menos de 10 minutos.