Ir al contenido

Configurando Apache HTTP Reverse-Proxy ( Windows )

Exponer OpenKM directamente desde Tomcat puede ser peligroso si necesita que la aplicación sea accesible desde Internet (por ejemplo https://issues.jboss.org/browse/JBAS-3861). Como resultado, podría infectarse con PerlBot. Además, el puerto 8080 puede estar bloqueado por un cortafuegos. Por estos motivos, es una buena práctica exponer su instalación de OpenKM a través del puerto web estándar 80. En los siguientes pasos explicamos cómo configurar Apache para gestionar estas peticiones y reenviarlas al servidor de aplicaciones Tomcat usando el protocolo AJP13.

De la documentación de Apache: el protocolo AJP13 está orientado a paquetes. Presumiblemente se eligió un formato binario en vez del texto plano, más legible, por motivos de rendimiento. El servidor web se comunica con el contenedor de servlets a través de conexiones TCP. Para reducir el coste de la creación de sockets, el servidor web intentará mantener conexiones TCP persistentes con el contenedor de servlets, y reutilizar una conexión para varios ciclos de petición/respuesta.

Se puede acceder a su OpenKM desde dos zonas distintas: Internet y LAN. Esto significa que para acceder a este servidor necesita usar dos direcciones IP: la IP externa (Internet) y la IP interna (LAN).

La dirección IP interna (también conocida como “dirección IP local”) es la dirección asignada por su router de red local y suele empezar por 192.168.x.x. Estas direcciones IP solo pueden verse desde otros equipos de su red local (LAN), y no desde ningún equipo conectado en una red externa como Internet.

Para llegar a Internet o a un equipo en otra red, a su equipo suele asignársele una dirección IP externa, que después se puede usar para referirse al equipo dentro de su red local.

En la imagen anterior, hay tres equipos en la red local, cada uno con su propia dirección IP interna asignada por el router. El ISP está conectado al router y le proporciona una dirección IP externa que le permite comunicarse con Internet. En Internet, todos ven su dirección IP externa, pero cualquier información procedente del router se “convierte” de la dirección IP externa a la dirección IP interna.

Así que si quiere que su instalación de OpenKM sea accesible tanto desde la LAN como desde Internet, el truco consiste en configurar los equipos cliente para que resuelvan su IP interna (192.168.0.50) si están dentro de la LAN, o la IP externa si están en Internet. Para resolver la IP de Internet (67.166.214.148), su equipo usa el DNS público. Por tanto, necesita configurar un servidor DNS local dentro de la LAN o modificar el fichero hosts de cada cliente para que resuelva a la IP interna.

Apache no distribuye binarios oficiales para Windows. Descargue una compilación Win64, junto con el Visual C++ Redistributable correspondiente, desde Apache Lounge.

Extraiga el fichero ZIP descargado, que contiene una carpeta Apache24, directamente en la raíz de C:\, de forma que quede como C:\Apache24. Evite cualquier ruta que contenga espacios, como Program Files.

Registre Apache como servicio de Windows desde una consola CMD con permisos elevados:

Ventana de terminal
C:\> cd C:\Apache24\bin
C:\Apache24\bin> httpd.exe -k install

Compruebe que la configuración es válida; debería devolver Syntax OK:

Ventana de terminal
C:\Apache24\bin> httpd.exe -t

Inicie el servicio:

Ventana de terminal
C:\Apache24\bin> httpd.exe -k start

El servicio también puede iniciarse, detenerse o reiniciarse desde el panel de Servicios de Windows, buscando Apache2.4.

Al navegar a http://localhost/ debería mostrarse la página “It works!” de Apache.

Configurando OpenKM en el puerto 80 (reverse proxy HTTP)

Sección titulada «Configurando OpenKM en el puerto 80 (reverse proxy HTTP)»

Habilite el conector AJP en el servidor OpenKM/Tomcat, editando tomcat\conf\server.xml y descomentando:

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3" secretRequired="false"
address="127.0.0.1"
port="8009"
redirectPort="8443" />

Guarde el fichero y reinicie el servicio OpenKM/Tomcat para que el conector AJP empiece a escuchar en el puerto 8009.

A diferencia de Linux, donde los módulos se habilitan con a2enmod, la compilación de Apache Lounge para Windows ya incluye todos los módulos estándar compilados como fichero .so bajo C:\Apache24\modules\. Solo necesita descomentar las líneas LoadModule correspondientes en C:\Apache24\conf\httpd.conf:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so

Incluya el fichero de configuración de OpenKM en httpd.conf, junto a las demás directivas Include:

# OpenKM
Include conf/extra/openkm.conf

Cree C:\Apache24\conf\extra\openkm.conf con este contenido:

<VirtualHost *:80>
ServerName openkm.your-domain.com
ServerAlias 192.168.10.230
RedirectMatch ^/$ /openkm
# WebSocket support - needs mod_proxy_wstunnel
ProxyPass /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket
ProxyPassReverse /openkm/frontend/webSocket ws://127.0.0.1:8080/openkm/frontend/webSocket
ProxyPass /openkm ajp://127.0.0.1:8009/openkm keepalive=On
ProxyPassReverse /openkm http://openkm.your-domain.com/openkm
ErrorLog logs/openkm-error.log
CustomLog logs/openkm-access.log combined
</VirtualHost>

Compruebe la configuración y reinicie Apache:

Ventana de terminal
C:\> cd C:\Apache24\bin
C:\Apache24\bin> httpd.exe -t
C:\Apache24\bin> httpd.exe -k restart

Compruebe el acceso a su instalación de OpenKM en http://openkm.your-domain.com/; debería redirigir a /openkm y cargar la aplicación.

Para servir OpenKM sobre HTTPS necesita un certificado emitido por una autoridad de certificación (CA). Este ejemplo usa GoDaddy, pero el mismo procedimiento se aplica a cualquier otra CA.

Cree la carpeta de certificados:

Ventana de terminal
C:\> mkdir C:\Apache24\conf\certs

Establezca la ubicación de la configuración de OpenSSL:

Ventana de terminal
C:\> set OPENSSL_CONF=C:\Apache24\conf\openssl.cnf

Genere el CSR y la clave privada, ejecutando desde C:\Apache24\bin, apuntando las rutas de salida a certs:

Ventana de terminal
C:\> cd C:\Apache24\bin
C:\Apache24\bin> openssl.exe req -new -newkey rsa:2048 -nodes -keyout ..\conf\certs\openkm.your-domain.com.key -out ..\conf\certs\openkm.your-domain.com.csr

OpenSSL solicitará los siguientes datos:

Campo Valor
Common Name openkm.your-domain.com (debe coincidir exactamente con el dominio)
Organization Nombre legal de la empresa
Organizational Unit Opcional, puede dejarse en blanco
City/Locality Nombre completo, sin abreviar
State/Province Nombre completo, sin abreviar
Country Código ISO de 2 letras (p. ej. ES)
Passphrase Déjelo vacío; de lo contrario, Apache pedirá una contraseña cada vez que arranque el servicio

Abra el fichero openkm.your-domain.com.csr generado con el Bloc de notas, copie el contenido completo (incluidas las líneas -––BEGIN CERTIFICATE REQUEST—– y -––END CERTIFICATE REQUEST—–) y péguelo en el formulario de solicitud de certificado de su CA.

Tras validar el dominio, la CA le proporcionará, entre otros:

  • El propio certificado del dominio, en formato texto/Base64 (.pem o .crt).
  • El mismo certificado en formato binario/DER - no usado por Apache.
  • Un paquete de certificado intermedio (p. ej. gd_bundle-g2.crt.pem para GoDaddy).

Copie el certificado y el paquete intermedio en C:\Apache24\conf\certs\, junto a la clave privada generada anteriormente.

Configurando OpenKM en el puerto 443 (HTTPS)

Sección titulada «Configurando OpenKM en el puerto 443 (HTTPS)»

Habilite los módulos SSL en httpd.conf:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

Incluya la configuración SSL al final de httpd.conf:

Include conf/extra/httpd-ssl.conf

Edite C:\Apache24\conf\extra\httpd-ssl.conf. Mantenga los ajustes SSL globales incluidos por defecto (Listen 443, SSLCipherSuite, SSLProtocol, SSLSessionCache, etc., ubicados antes del bloque VirtualHost), y sustituya únicamente el bloque <VirtualHost _default_:443> por:

<VirtualHost *:443>
ServerName openkm.your-domain.com
ServerAlias 192.168.10.230
RedirectMatch ^/$ /openkm
SSLEngine on
SSLCertificateFile "C:/Apache24/conf/certs/openkm.your-domain.com.crt"
SSLCertificateKeyFile "C:/Apache24/conf/certs/openkm.your-domain.com.key"
SSLCertificateChainFile "C:/Apache24/conf/certs/gd_bundle-g2.crt.pem"
ErrorLog "logs/openkm-ssl-error.log"
TransferLog "logs/openkm-ssl-access.log"
ProxyPass /openkm/frontend/webSocket wss://127.0.0.1:8080/openkm/frontend/webSocket
ProxyPassReverse /openkm/frontend/webSocket wss://127.0.0.1:8080/openkm/frontend/webSocket
ProxyPass /openkm ajp://127.0.0.1:8009/openkm
ProxyPassReverse /openkm https://openkm.your-domain.com/openkm
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "${SRVROOT}/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

Compruebe la configuración y reinicie Apache:

Ventana de terminal
C:\> cd C:\Apache24\bin
C:\Apache24\bin> httpd.exe -t
C:\Apache24\bin> httpd.exe -k restart

Compruebe el acceso a su instalación de OpenKM en https://openkm.your-domain.com/. Con un certificado válido emitido por una CA, el navegador debería cargar OpenKM sin ningún aviso de certificado.

Una vez confirmado que el puerto 443 funciona correctamente, simplifique C:\Apache24\conf\extra\openkm.conf (que hasta ahora hacía el proxy directamente sobre HTTP) para que solo redirija a HTTPS:

<VirtualHost *:80>
ServerName openkm.your-domain.com
ServerAlias 192.168.10.230
Redirect permanent / https://openkm.your-domain.com/
</VirtualHost>

Las directivas ProxyPass/ProxyPassReverse se eliminan de este bloque, ya que el bloque VirtualHost *:443 es ahora el único que habla con el Tomcat de OpenKM.

Compruebe la configuración y reinicie Apache:

Ventana de terminal
C:\> cd C:\Apache24\bin
C:\Apache24\bin> httpd.exe -t
C:\Apache24\bin> httpd.exe -k restart

Al navegar a http://openkm.your-domain.com/ ahora debería redirigir automáticamente a https://openkm.your-domain.com/, desde donde OpenKM carga correctamente.

Resumen de los ficheros de configuración finales

Sección titulada «Resumen de los ficheros de configuración finales»
Fichero Contenido
C:\Apache24\conf\httpd.conf Módulos (proxy, proxy_ajp, proxy_http, proxy_wstunnel, rewrite, headers, ssl, socache_shmcb), Include conf/extra/openkm.conf, Include conf/extra/httpd-ssl.conf
C:\Apache24\conf\extra\openkm.conf VirtualHost *:80 – redirección permanente a HTTPS
C:\Apache24\conf\extra\httpd-ssl.conf VirtualHost *:443 – reverse proxy AJP/WebSocket hacia 127.0.0.1, certificado emitido por CA
C:\Apache24\conf\certs\ openkm.your-domain.com.key, openkm.your-domain.com.csr, openkm.your-domain.com.crt, paquete intermedio

Si, por seguridad en profundidad, además quiere evitar que las peticiones fuera de /openkm sirvan la página por defecto “It works!” de Apache o el listado del directorio htdocs por defecto:

Apunte DocumentRoot a una carpeta vacía y con acceso denegado dentro del VirtualHost:

DocumentRoot "C:/Apache24/htdocs-empty"
<Directory "C:/Apache24/htdocs-empty">
Require all denied
</Directory>
Ventana de terminal
C:\> mkdir C:\Apache24\htdocs-empty

Y deshabilite el listado de directorios en la sección global de httpd.conf (el bloque <Directory “${SRVROOT}/htdocs”>):

DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>