HTTP y HTTPS en servicios Atlassian (Tomcat) con Nginx como proxy HTTPS reverso
Guía básica sobre como implementar HTTP y HTTPS de forma simultanea en sistemas Atlassian, extensible a cualquier aplicación que utilice Tomcat como servidor web.
Sistemas Atlassian: https://www.atlassian.com/
Para el ejemplo de configuración se utilizarán dos puertos.
- Puerto HTTP: 8080
- Puerto HTTPS: 8081
- Dominio: DOMINIO.COM
La configuración de Nginx se encargará de redirigir los puertos.
Configuración del servidor Tomcat, se debe activar un puerto extra para HTTPS: /opt/atlassian/jira/conf/server.xml
<Service name="Catalina"> <!-- HTTP (Por defecto)--> <Connector port="8080" maxThreads="150" minSpareThreads="25" connectionTimeout="20000" enableLookups="false" maxHttpHeaderSize="8192" protocol="HTTP/1.1" useBodyEncodingForURI="true" redirectPort="8443" acceptCount="100" disableUploadTimeout="true"/> <!-- HTTPS (Agregado por nosotros) --> <Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" port="8081" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" scheme="https" proxyName="DOMINIO.COM" proxyPort="443" secure="true"/>
Crear el certificado SSL (autofirmado) para las conexiones HTTPS.
openssl req -x509 -sha512 -nodes -days 9999 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt
Configuración de Nginx como proxy reverso HTTP y HTTPS.
####################### HTTP (80 ---> 8080) server { listen 80; server_name DOMINIO.COM; location / { proxy_pass http://localhost:8080; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 20M; } } ####################### HTTPS (80 ---> 8081) server { listen 443; server_name DOMINIO.COM; # SSL ssl_certificate /etc/nginx/cert.crt; ssl_certificate_key /etc/nginx/cert.key; ssl on; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; # REVERSE HTTP + SSL PROXY location / { proxy_pass http://localhost:8081; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 20M; } }
Al reiniciar NGinx y el servicio Atlassian que se esté utilizando (Jira, Confluence, Bamboo, etc.), se podrá acceder a la conexión HTTPS por medio de https://DOMINIO.COM y a HTTP con http://DOMINIO.COM.
Si para el puerto 80 no se quiere configurar Nginx como proxy reverso, se puede utilizar por ejemplo la herramienta socat de la siguiente manera para crear la redirección.
socat TCP-LISTEN:80,fork TCP:127.0.0.1:8081 &> /dev/null &