Lo primero es comprar un dominio y hacer que apunte al servidor (no indicados los pasos aquí).
Crear el certificado con Certbot.
1 2 3 4 |
$ wget https://dl.eff.org/certbot-auto $ sudo ./certbot-auto certonly --standalone -d dominio.com $ sudo service tomcat7 stop # Importante tener el servidor apagado $ sudo openssl pkcs12 -export -out /etc/letsencrypt/live/dominio.com/dominio.com.pfx -inkey /etc/letsencrypt/live/dominio.com/privkey.pem -in /etc/letsencrypt/live/dominio.com/cert.pem -certfile /etc/letsencrypt/live/dominio.com/chain.pem -password pass:contraseña |
Puede que certbot de el error ImportError: No module named cryptography.hazmat.bindings.openssl.binding.
Copiamos el .pfx generado a la carpeta de Tomcat y le damos permisos para que Tomcat lo pueda leer:
1 2 |
cp /etc/letsencrypt/live/dominio.com/dominio.com.pfx /usr/share/tomcat7 chown tomcat:tomcat /usr/share/tomcat7/dominio.com.pfx |
Configuramos Tomcat para que use el certificado SSL, en /etc/tomcat7/server.xml
1 2 3 4 5 6 |
# Descomentar la configuración del puerto 8443 y configurar con lo siguiente <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreType="PKCS12" keystoreFile="/usr/share/tomcat7/dominio.com.pfx" keystorePass="contraseña" clientAuth="false" sslProtocol="TLS" /> |
Configuramos el sistema para que las peticiones a los puertos 80 y 443 los sirva el servidor escuchando en los puertos 8080 y8443. Yo lo pongo en /etc/init.d/tomcat7 en los comandos ‘start’ y ‘stop’:
1 2 3 4 5 6 7 |
# Start iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 # Stop iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 |
Configurar Tomcat para que sólo acepte conexiones HTTPS en /etc/tomcat7/web.xml . Añadir dentro del contenido del tag <web-app> :
1 2 3 4 5 6 7 8 9 |
<security-constraint> <web-resource-collection> <web-resource-name>HTTPSOnly</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> |
Configurar el conector HTTP en /etc/tomcat7/server.xml para que redireccione al puerto 443 (no al 8443), de manera que todas las peticiones HTTP serán redireccionadas a HTTPS:
1 2 |
# Sustituir la configuración existente del puerto 8080 por esta <Connector port="8080" enableLookups="false" redirectPort="443" /> |
Resumen de la creación del certificado
Este es el script para crear el certificado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/bash service tomcat7 stop # Stop IPtables iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 /home/ec2-user/certbot-auto certonly --standalone -d www.dominio.com openssl pkcs12 -export -out /etc/letsencrypt/live/www.dominio.com/dominio-bundle-https.pfx -inkey /etc/letsencrypt/live/www.dominio.com/privkey.pem -in /etc/letsencrypt/live/www.dominio.com/cert.pem -certfile /etc/letsencrypt/live/www.dominio.com/chain.pem -password pass:contraseña /bin/cp /etc/letsencrypt/live/www.dominio.com/dominio-bundle-https.pfx /usr/share/tomcat7 chown tomcat:tomcat /usr/share/tomcat7/dominio-bundle-https.pfx # Start IPtables iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 service tomcat7 start |
Configurar la renovación automática del certificado
Añadimos la siguiente línea a /etc/crontab para que se ejecute cada 2 meses (dado que el certificado dura 3):
1 |
0 5 1 */2 * root /root/renew-certificate.sh |
O también se puede ejecutar a mano como root cuando nos llegue el correo recordatorio de que el certificado va a expirar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash service tomcat7 stop date >> /var/log/certbot-cron.log # Stop IPtables iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 /home/ec2-user/certbot-auto renew --text >> /var/log/certbot-cron.log openssl pkcs12 -export -out /etc/letsencrypt/live/www.dominio.com/dominio-bundle-https.pfx -inkey /etc/letsencrypt/live/www.dominio.com/privkey.pem -in /etc/letsencrypt/live/www.dominio.com/cert.pem -certfile /etc/letsencrypt/live/www.dominio.com/chain.pem -password pass:contraseña /bin/cp /etc/letsencrypt/live/www.dominio.com/dominio-bundle-https.pfx /usr/share/tomcat7 # Start IPtables iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443 service tomcat7 start |