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.

  1. Puerto HTTP: 8080
  2. Puerto HTTPS: 8081
  3. 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 &