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:
- CA (en formato
.crt
), certificado de la entidad certificadora que da validez a tu certificado. - KEY (en formatos
.pem
o.key
), clave privada. - CRT (en formato
.crt
), el certificado.
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.
SSLCACertificateFile
, para definir la ubicación del certificado CA.SSLCertificateFile
, para definir la ubicación del certificado.SSLCertificateKeyFile
, para definir la ubicación de la clave privada.
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.
ssl_trusted_certificate
, para definir la ubicación del el certificado CA.ssl_certificate
, para definir la ubicación del certificado.ssl_certificate_key
, para definir la ubicación de la clave privada.
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:
ssl_ciphers
, para decifinir el algorimo de encriptación durante el handshake SSLssl_protocols
, para definir los protocolos SSL aceptados.ssl_prefer_server_ciphers
para definir la preferencia de cifrado cuando usamos protocoloSSLv3
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>