Como configurar SSL para Apache o Nginx

Como configurar SSL para Apache o Nginx


Aprovechándo el reciente cambio de HTTP a HTTPS en la conexión a mi blog, he escrito este post que además complementa bastante bien la configuración que os dí en mi post proxy HTTP con Apache 2.

Pues bien, una vez teneis vuestros certificados (yo los cree con mi proveedor de DNS) solo necesitamos tres ficheros:

Solo queda aplicar la configuración dependiendo de tu servidor. Aquí abajo os describo algunas de las que yo uso.

Apache 2

Editamos nuestro fichero httpd.conf y empezamos por la redirección del puerto 80 al 443

<VirtualHost *:80>
    ServerName rauldelahoz.com
    ServerAlias *.rauldelahoz.com 
    Redirect permanent / https://rauldelahoz.com/
</VirtualHost>

Con esto conseguimos que las conexiones HTTP a rauldelahoz.com sean redireccionadas a HTTPS. Seguidamente creamos nuestro VirtualHost para HTTPS:

<VirtualHost *:443>
    ServerName rauldelahoz.com
    ServerAlias *.rauldelahoz.com 

    ProxyPass / http://localhost:2368
    ProxyPassReverse / http://localhost:2368
</VirtualHost>

Como podéis ver, en mi caso agrego el proxy a mi blog en Ghost usando las directivas ProxyPass y ProxyPassReverse.

Activamos SSL con SSLEngine on y agregamos los certificados con las directivas apropiadas.

Y finalmente el resultado queda así:

<VirtualHost *:443>
    ServerName rauldelahoz.com
    ServerAlias *.rauldelahoz.com  

    ProxyPass / http://localhost:2368
    ProxyPassReverse / http://localhost:2368

    SSLEngine on
    # configuración por defecto de ciphers
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SSLCACertificateFile /certs/ca.crt
    SSLCertificateFile /certs/crt.crt
    SSLCertificateKeyFile /certs/key.key
</VirtualHost>

Sobre la directiva SSLCipherSuite encargada de definir el algoritmo de encriptación durante el handshake SSL, yo he usado los valores aconsejados por Apache.

NGINX

Los pasos a seguir en este caso son exactamente los mismos que en Apache. Editamos nuestro fichero default.conf y empezamos por la redirección del puerto 80 al 443:

server {
        listen          80      default_server;
        server_name             rauldelahoz.com;
        rewrite         ^       https://$server_name$request_uri? permanent;
}

Pasamos a configurar nuestro server para HTTPS y hacia mi Ghost usando proxy_pass (más sencillo que en Apache por que solo hace falta esta directiva para configurarlo):

server {
    listen                  443 ssl;
    server_name             rauldelahoz.com;
    location / {
        proxy_pass      http://localhost:2368;
    }
}

Activamos el SSL con ssl on y agregamos los certificados con las directivas apropiadas.

Y este es el resultado:

server {
    listen                  443 ssl;
    server_name             rauldelahoz.com;

    ssl                     on;
    ssl_certificate         /etc/nginx/certs/rauldelahoz-ssl-crt.crt;
    ssl_certificate_key     /etc/nginx/certs/rauldelahoz-ssl-key.key;
    ssl_trusted_certificate /etc/nginx/certs/rauldelahoz-ssl-ca.crt;

    ssl_session_timeout 5m;

    # configuración por defecto de ciphers
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass      http://localhost:2368;
    }
}

Y para el resto de directivas he usado los valores aconsejados por Nginix, aunque también podéis usar las aconsejadas por vuestro proveedor que en mi caso real es COMODO:

Consideraciones SSL

Es importante recordar que no podemos configurar más de una conexión HTTPS por interface de red. Esta limitación de la directiva VirtualHost viene dada por que el handshake entre cliente y servidor es realizada antes de la resolución del VirtualHost.

# esto no funcionará
<VirtualHost *:443>
    ServerName domaina
# ...
</VirutalHost>
<VirtualHost *:443>
    ServerName domainb
# ...
</VirutalHost>

Por lo tanto solo puede haber un VirtualHost vinculado a una única interface de red. Un ejemplo seria:

<VirtualHost 192.168.1.2:443>
    ServerName domaina
# ...
</VirutalHost>
<VirtualHost 192.168.1.3:443>
    ServerName domainb
# ...
</VirutalHost>