Gracias a un artículo del blog Un lugar en el mundo... descubrí que StartSSL se ha renovado para tratar de competir con Let's Encrypt (el cual tuvo gran aceptación en Internet gracias a su simplicidad y facilidad para obtener un certificado SSL). Así que decidí probarlo y generé un certificado para linuxito.com. Aquí el tutorial completo.



StartSSL fue el pionero en otorgar certificados SSL gratuitos pero, como habrán notado en mi (viejo) artículo Cómo obtener un certificado SSL gratis, el proceso es extremadamente burocrático.

Ahora han lanzado StartEncrypt, el cual promete certificados gratuitos de manera instantánea (hasta 5 dominios con 1 año de validez) sin necesidad de registrarse en StartSSL. Además provee herramientas para instalar el certificado de forma automática en servidores Windows y Linux.

Esta nueva plataforma ha dejado de lado bastante la burocracia que caracterizaba a StartSSL. Afortunadamente ya no es necesario generar el bendito certificado cliente (que tantos problemas trajo con diferentes navegadores), sino que ahora es posible validar la cuenta de correo simplemente enviando un código por e-mail.

Basta acceder al enlace "Sign-up":

Para validar una cuenta de correo y comenzar a emitir certificados:

Lógicamente es necesario validar el dominio sobre el cual generar el certificado para verificar la propiedad. El problema es que el único método disponible es a través de correo electrónico. Sin embargo ha mejorado un poco, pues no sólo permite recibir el correo en una cuenta fija del dominio (postmaster, hostmaster, webmaster, etcétera) sino que también permite recibirlo en la cuenta de correo asociada al dominio (whois). Esto en realidad es una gran mejora, porque no requiere contar con un servidor de correo electrónico asociado el dominio (como es el caso de mi VPS).

Acceder a la pestaña "Validations Wizard" y seleccionar "Domain Validation" para validar un dominio (por ejemplo "linuxito.com"):

En mi caso, la dirección de correo asociada a mi dominio (una de mis cuentas de correo personales) está protegida por WhoisGuard, un servicio muy útil para proteger y no divulgar las cuentas de correo de los dueños de los dominos en Internet.

Luego de recibir el correo con la clave de validación del dominio, es necesario copiarla y pegarla para finalizar (igual a la validación del correo electrónico del paso anterior):

Cómo generar un certificado SSL

Habiendo validado tanto una cuenta de correo como el dominio sobre el cual se desea implementar HTTPS, sólo resta generar el certificado. Acceder a "Certificates Wizard" y seleccionar "Web Server SSL/TLS Certificate":

En el cuadro superior se deben ingresar los dominios a certificar (separados por coma):

Luego se debe pegar el .csr (certificate signing request), el cual debe ser generado desde línea de comandos utilizando openssl:

openssl req -newkey rsa:2048 -keyout linuxito-startencrypt.key -out linuxito-startencrypt.csr

Por ejemplo:

root@linuxito:~# openssl req -newkey rsa:2048 -keyout linuxito-startencrypt.key -out linuxito-startencrypt.csr
Generating a 2048 bit RSA private key
....+++
.................................................................................................+++
writing new private key to 'linuxito-startencrypt.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:AR
State or Province Name (full name) [Some-State]:Buenos Aires
Locality Name (eg, city) []:Bahía Blanca
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linuxito
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:linuxito.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Una vez generada la solicitud, copiar el contenido del .csr:

root@linuxito:~# cat linuxito-startencrypt.csr 
-----BEGIN CERTIFICATE REQUEST-----
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl
abcdefghijklmnopqrstuvwxyzabcdefghijklmn
-----END CERTIFICATE REQUEST-----

Y pegarlo dentro del cuadro de texto:

Por último, presionar "submit" para que StartEncrypt firme la solicitud, generando así el certificado:

Sólo basta descargar el certificado, en este caso linuxito.com.pem, y guardarlo con el mismo nombre que la clave privada (recomendable para asociar el certificado con su clave previamente generada con openssl):

root@linuxito:~# ll linuxito-startencrypt.*
-rw-r--r-- 1 root root 1021 Aug 19 11:37 linuxito-startencrypt.csr
-rw-r--r-- 1 root root 1.8K Aug 19 11:37 linuxito-startencrypt.key
-rw-r--r-- 1 root root 2.1K Aug 19 12:13 linuxito-startencrypt.pem

Además, es necesario descargar el certificado intermedio y el certificado raíz, ambos accesibles desde el menú "StartCom CA Certificates":

root@linuxito:~# wget https://www.startssl.com/certs/ca.crt
root@linuxito:~# wget https://www.startssl.com/certs/sca.server1.crt

Y luego armar la cadena:

root@linuxito:~# cat linuxito-startencrypt.pem sca.server1.crt ca.crt > linuxito-startencrypt-full.pem

Es recomendable, antes de instalarlo, verificar el contenido del certificado:

root@linuxito:~# openssl x509 -subject -issuer -enddate -noout -in linuxito-startencrypt-full.pem
subject= /C=AR/CN=linuxito.com
issuer= /C=IL/O=StartCom Ltd./OU=StartCom Certification Authority/CN=StartCom Class 1 DV Server CA
notAfter=Aug 19 14:40:00 2017 GMT

También es posible descargar la cadena ya armada accediendo desde el menú "Tool Box > Certificate List", y luego presionar "Retrieve" en el certificado correspondiente:

Esto descarga un archivo ZIP (por ejemplo linuxito.com.zip) el cual contiene la cadena armada según las necesidades de cada tipo de servidor Web:

root@linuxito:~# unzip -l linuxito.com.zip
Archive:  linuxito.com.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     3234  2016-08-20 19:48   IISServer.zip
     3232  2016-08-20 19:48   ApacheServer.zip
     2892  2016-08-20 19:48   NginxServer.zip
     5238  2016-08-20 19:48   OtherServer.zip
---------                     -------
    14596                     4 files

Por ejemplo, para Nginx incluye un único CRT con la cadena armada (lo mismo que hice anteriormente de forma manual):

root@linuxito:~# unzip linuxito.com.zip NginxServer.zip
Archive:  linuxito.com.zip
  inflating: NginxServer.zip
root@linuxito:~# unzip -l NginxServer.zip
Archive:  NginxServer.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     4241  2016-08-20 19:48   1_linuxito.com_bundle.crt
---------                     -------
     4241                     1 file

Lógicamente la clave privada es la que se generó durante el proceso de creación del CSR (es importante no perderla).

Configuración del servidor Nginx

Copiar el certificado y su clave a un directorio donde Nginx tenga acceso de lectura (por ejemplo /usr/local/nginx/conf/:

root@linuxito:~# cp /root/linuxito-startencrypt* /usr/local/nginx/conf/

Luego, editar la configuración del servidor HTTPS para que lea los nuevos certificados:

root@linuxito:~# nano /usr/local/nginx/conf/nginx.conf

        ssl_certificate linuxito-startencrypt-full.pem;
        ssl_certificate_key linuxito-startencrypt.key;

Antes de reiniciar el servidor es necesario remover la clave (pass phrase) que protege a la clave privada. De lo contrario cada vez que Nginx inicie será necesario ingresarla manualmente (algo indeseado pues el servidor no iniciará hasta que el usuario no la especifique):

root@linuxito:~# cd /usr/local/nginx/conf/
root@linuxito:/usr/local/nginx/conf# mv linuxito-startencrypt.key linuxito-startencrypt.key.org
root@linuxito:/usr/local/nginx/conf# openssl rsa -in linuxito-startencrypt.key.org -out linuxito-startencrypt.key
Enter pass phrase for linuxito-startencrypt.key.org:
writing RSA key

Y reiniciar el servidor para que tome los cambios en la configuración SSL/TLS:

Verificación

Es importante verificar que todo haya quedado configurado correctamente, especialmente la cadena. Al momento de generar el certificado para linuxito.com me faltó el certificado raíz en la cadena (pensé que con el intermedio bastaba), por ello falló al verificar la cadena de confianza.

Para ello es posible utilizar cualquier herramienta online como la conocida SSL Server Test que provee el sitio de Qualys:

También es posible recurrir a SSL Checker del sitio SSL Shopper:

Conclusión

StartSSL ha mejorado muchísimo con este nuevo servicio gratuito, aunque todavía requiere ciertos conocimientos de administración de sistemas y seguridad, pues se debe generar el CSR manualmente (cosa que por ejemplo Let's Encrypt hace de manera automática). Aunque la ventaja es que expide los certificados con una validez de 1 año (Let's Encrypt los expide con 3 meses de validez).

Otra gran ventaja que tiene StartEncrypt respecto a Let's Encrypt, es que a diferencia del último (cuyo script de generación de certificados requiere instalar una gran cantidad de dependencias), StartEncrypt no requiere instalar ningún paquete/dependencia/aplicación en el servidor donde se instalará el certificado. Esto es de suma importancia para aquellos que nos preocupamos por la estabilidad, eficiencia y privacidad.


Tal vez pueda interesarte


Compartí este artículo