Configurar SSL/TLS en un servidor Tomcat, JBoss, WildFly, Lighttpd, Nginx o Apache

Escrito por el , actualizado el .
seguridad software software-libre planeta-codigo web
Enlace permanente Comentarios

Tanto en un servidor web como de aplicaciones podemos hacer que la comunicación entre el cliente y el servidor esté cifrada usando un protocolo seguro. La configuración para usar un protocolo seguro en cada servidor es diferente pero todos se basan en lo mismo, usar un certificado y un clave. En este artículo muestro la configuración necesaria en los servidores web y de aplicaciones más populares.

OpenSSL

En entradas anteriores he explicado en que consiste la criptografía y GPG y como podemos usarlo a nivel personal para firmar y cifrar archivos y firmar correos electrónicos con el cliente de correo Evolution. También he comentado cómo crear un certificado con OpenSSL y como convertirlo a diferentes formatos. En esta entrada explicaré como usar un certificado SSL creado con OpenSSL después de conocer los Certificados SSL, de empresa, «wildcard» y de validación extendida para proporcionar acceso cifrado al servidor web o servidor de aplicaciones, explicaré cual es la configuración necesaria para los servidores Tomcat, Lighttpd, JBoss/WildFly, Nginx y Apache.

Usar una conexión SSL o TLS y un certificado de servidor evita que los datos entre el navegador del usuario y el servidor sean legibles para una tercera parte siendo mayor la seguridad en nuestras aplicaciones o dando mayor confianza al usuario y usando algunos certificados al aparecer en la barra de navegación del navegador en verde el nombre de la entidad detrás de la página evitando problemas de suplantación de identidad.

Los principales navegadores han anunciado que una conexión cifrada SSL/TLS es condición necesaria para usar el ya presente protocolo HTTP/2 que es más eficiente tanto para el cliente como para el servidor y con menores latencias. Configurar HTTP/2 en Nginx, Apache HTTPD, WildFly o Jetty es sencillo y mejorará el rendimiento de nuestros sitios web o aplicaciones. Utilizar el protocolo seguro HTTPS es también una condición necesaria por seguridad al utilizar autenticación básica.

Configurar SSL/TLS en Tomcat

Tomcat es uno de los servidores de aplicaciones más usado para desplegar aplicaciones web desarrolladas con el lenguaje Java. La forma que explicaré a continuación sobre como obtener cifrado SSL con este servidor será usando APR (Apache Portable Runtime). Previamente deberemos haber generado un certificado SSL con OpenSSL, una vez dispongamos del nuestro aunque sea autofirmado debemos añadir la siguiente configuración al archivo server.xml:

1
2
3
4
5
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
    maxThreads="150" scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    SSLCertificateFile="${catalina.home}/conf/localhost.crt"
    SSLCertificateKeyFile="${catalina.home}/conf/localhost.key"/>
server.xml

Hay que activar el conector SSL (el anterior xml) y disponer del certificado y su clave privada, ambos archivos se indican en los atributos SSLCertificateFile y SSLCertificateKeyFile. Si queremos usar el puerto estándar del protocolo HTTPS cambiaremos el valor del puerto de 8443 a 443 en el atributo port. La configuración es la misma tanto para Tomcat 7 como para Tomcat 8.

Configurar SSL/TLS en JBoss

JBoss es otro de los servidores que es ampliamente usado para desplegar aplicaciones Java y que proporciona un perfil completo de las especificaciones EE al contrario que Tomcat que solo proporciona un perfil web. La configuración que hay que indicar en JBoss 7.1 es la siguiente:

1
2
3
4
5
6
7
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="true">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" redirect-port="8443"/>
    <connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
        <ssl name="jboss" certificate-key-file="${jboss.server.config.dir}/localhost.key" certificate-file="${jboss.server.config.dir}/localhost.crt"/>
    </connector>
    ...
</subsystem>
standalone-jboss.xml

Configurar SSL/TLS en WildFly

JBoss cambió recientemente el nombre de la versión community de JBoss, esta ha pasado a llamarse WildFly y la comercial con soporte sigue llamándose JBoss. WildFly soporta las especificaciones de Java EE 7. En WildFly el contenedor web es undertow en vez de Tomcat y cambia la configuración de SSL. Se necesita crear un keystore JKS que contenga tanto la clave como el certificado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<security-realms>
    ...
    <security-realm name="SecureRealm">
        <server-identities>
            <ssl>
                <keystore path="localhost.keystore" relative-to="jboss.server.config.dir" keystore-password="wildfly"/>
            </ssl>
        </server-identities>
    </security-realm>
</security-realms>
...
<subsystem xmlns="urn:jboss:domain:undertow:1.0">
    ...
    <server name="default-server">
        <http-listener name="default" socket-binding="http"/>
        <https-listener name="https" socket-binding="https" security-realm="SecureRealm"/>
        <host name="default-host" alias="localhost">
            <location name="/" handler="welcome-content"/>
            <filter-ref name="server-header"/>
            <filter-ref name="x-powered-by-header"/>
        </host>
    </server>
    ...
</subsystem>
standalone-wildfly.xml

Configurar SSL/TLS en Lighttpd

Lighttpd es un servidor web de los denominados ligeros que aunque posiblemente no tiene toda la versatilidad de Apache ofrece un mayor rendimiento. Para activar SSL en lighttpd debemos modificar el archivo de configuración y añadir lo siguiente:

1
2
3
4
$SERVER["socket"] == ":443" {
    ssl.engine = "enable" 
    ssl.pemfile = "localhost.pem" 
}
lighttpd.conf

Quizá debamos cambiar el propietario y permisos con:

1
2
$ chown root:root /etc/lighttpd/ssl/localhost.pem
$ chmod 400 /etc/lighttpd/ssl/localhost.pem
script-1.sh

El archivo localhost.pem contiene la clave y el certificado.

Configurar SSL/TLS en Nginx

El proceso es similar para el servidor web Nginx aunque lógicamente se usan las directivas propias de configuración de Nginx.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
http {
     server {
          listen       443 ssl;
          server_name  localhost;
 
          ssl_certificate      localhost.pem;
          ssl_certificate_key  localhost.key;
 
          ssl_session_timeout  5m;
 
          ssl_protocols  SSLv2 SSLv3 TLSv1;
          ssl_ciphers  HIGH:!aNULL:!MD5;
          ssl_prefer_server_ciphers   on;
 
          location / {
              root   /usr/share/nginx/html;
              index  index.html index.htm;
          }
     }
}
nginx.conf

Configurar SSL/TLS en Apache

Apache es uno de los servidores web más utilizados para servir sitios web en internet. Para activar SSL en Apache debemos modificar el archivo de configuración, añadiendo la siguiente configuración que activa el soporte de SSL y especifica el archivo de clave y certificado, nada distinto de lo necesario en los servidores anteriores:

1
2
3
4
5
6
7
8
9
LoadModule ssl_module modules/mod_ssl.so

Listen 443
<VirtualHost *:443>
    ServerName localhost
    SSLEngine on
    SSLCertificateFile localhost.crt
    SSLCertificateKeyFile localhost.key
</VirtualHost>
httpd.conf


Comparte el artículo: