Configuración de Apache como proxy inverso HTTPS
Exponer OpenKM directamente desde Tomcat puede ser peligroso si necesita que se acceda a la aplicación desde Internet (por ejemplo https://issues.jboss.org/browse/JBAS-3861). Como consecuencia, podría resultar infectado por 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 se explica cómo configurar Apache para que gestione estas peticiones y las reenvíe al servidor de aplicaciones Tomcat mediante el protocolo AJP13.
De la documentación de Apache: el protocolo AJP13 está orientado a paquetes. Se eligió un formato binario en lugar del texto plano, más legible, presumiblemente por motivos de rendimiento. El servidor web se comunica con el contenedor de servlets mediante conexiones TCP. Para reducir el costoso proceso de creación de sockets, el servidor web intentará mantener conexiones TCP persistentes con el contenedor de servlets y reutilizar una conexión para múltiples ciclos de petición/respuesta.
IP interna frente a IP externa
Sección titulada «IP interna frente a IP externa»Se puede acceder a su OpenKM desde dos zonas distintas: Internet y la LAN. Esto significa que, para acceder a este servidor, necesita utilizar dos direcciones IP: una IP externa (Internet) y una IP interna (LAN).
La dirección IP interna (también conocida como “dirección IP local”) es la dirección que asigna el router de su red local y que suele comenzar por 192.168.x.x. Estas direcciones IP solo pueden ser vistas por los demás equipos de su red local (LAN) y no por ningún equipo conectado a una red externa como Internet.
Para llegar a Internet o a un equipo de otra red, a su equipo suele asignársele una dirección IP externa, que después puede utilizarse para referirse al equipo de su red local.

En la imagen anterior, hay tres equipos en la red local a los que el router ha asignado su propia dirección IP interna. 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.
Por tanto, si desea 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 utiliza el DNS público. Por tanto, debe configurar un servidor DNS dentro de la LAN o modificar el fichero hosts de cada cliente para que resuelva a la IP interna.
Debian y Ubuntu
Sección titulada «Debian y Ubuntu»Lo primero es instalar el software de Apache necesario. En Debian/Ubuntu puede instalar Apache con un solo comando:
$ sudo apt-get install apache2Edite el fichero /etc/apache2/apache2.conf y configure un ServerName para evitar advertencias durante el arranque de Apache:
$ vim /etc/apache2/apache2.confServerRoot "/etc/apache2"ServerName "your-domain.com"Habilite el módulo de proxy:
$ sudo a2enmod proxy_ajp$ sudo a2enmod proxy_wstunnelCree los certificados
$ sudo mkdir /etc/apache2/ssl$ sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem$ sudo a2enmod sslAsegúrese de que el puerto 443 figura en /etc/apache2/ports.conf:
$ cat /etc/apache2/ports.conf | grep ListenCree el fichero de configuración /etc/apache2/sites-available/openkm.conf con este contenido:
$ vim /etc/apache2/sites-available/openkm.conf<VirtualHost *:443> ServerName openkm.your-domain.com RedirectMatch ^/$ /openkm
# WebSocket support - needs proxy-wstunnel 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
ErrorLog /var/log/apache2/openkm.your-domain.com-error.log CustomLog /var/log/apache2/openkm.your-domain.com-access.log combined
SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.pem</VirtualHost>El ServerName del VirtualHost debe ser distinto del ServerName de la configuración principal de Apache. Habilite esta configuración de sitio:
$ cd /etc/apache2/sites-available/$ sudo a2ensite openkm.confRedirigir todas las conexiones HTTP a HTTPS
Sección titulada «Redirigir todas las conexiones HTTP a HTTPS»Edite el fichero de configuración /etc/apache2/sites-available/openkm.conf y añada el siguiente contenido
$ vim /etc/apache2/sites-available/openkm.conf<VirtualHost *:80> ServerName openkm.your-domain.com Redirect permanent / https://openkm.your-domain.com/</VirtualHost>Comprobar la configuración
Sección titulada «Comprobar la configuración»Reinicie Apache:
$ sudo /etc/init.d/apache2 restartCompruebe el acceso a su instalación de OpenKM en https://openkm.your-domain.com/.
Uso de Let’s Encrypt
Sección titulada «Uso de Let’s Encrypt»Let’s Encrypt es una autoridad de certificación gratuita que proporciona certificados X.509 para el cifrado Transport Layer Security (TLS) sin coste alguno. Para poder solicitar e instalar los certificados necesita la utilidad certbot. Si utiliza Apache, también necesita el paquete certbot-apache:
$ apt install certbot certbot-apacheUna vez instalada, ejecute la utilidad con estos parámetros:
$ certbot --domain <your-domain-name> --email <your-sysadmin-email> --agree-tos --redirect --apacheEste certificado será válido durante 90 días, por lo que debe renovarlo antes de que caduque. Es una buena práctica crear una tarea cron para actualizarlo automáticamente:
@monthly /usr/bin/certbot renewTenga en cuenta también que los puertos 80 y 443 deben ser accesibles desde Internet para validar el dominio y generar el certificado.
Red Hat y CentOS
Sección titulada «Red Hat y CentOS»Utilice el gestor de paquetes yum para instalar Apache:
$ sudo yum install httpdHabilítelo en el arranque:
$ sudo chkconfig httpd --level 2345 onCree el certificado
$ sudo yum install mod_ssl openssl crypto-utilsGenere las claves privadas (para más información, visite Apache HTTP Secure Server Configuration).
$ genkey your-domain.comDurante el proceso se generarán dos ficheros en:
Sustituya SSLCertificateFile /etc/pki/tls/certs/your-domain.com.cert
SSLCertificateKeyFile /etc/pki/tls/private/your-domain.com.key
Ahora cree el fichero /etc/httpd/conf.d/openkm.conf con este contenido:
$ vim /etc/httpd/conf.d/openkm.conf<VirtualHost *:443> ServerName openkm.your-domain.com ProxyPass / ajp://localhost:8009/openkm/ ProxyPassReverse / http://your-domain.com/openkm/ ErrorLog /var/log/your-domain.com-error.log CustomLog /var/log/your-domain.com-access.log combined
SSLEngine on SSLCertificateFile /etc/pki/tls/certs/your-domain.com.cert SSLCertificateKeyFile /etc/pki/tls/private/your-domain.com.key</VirtualHost>Por último, modifique los valores de SSLCertificateFile y SSLCertificateKeyFile en el fichero /etc/httpd/conf.d/ssl.conf:
$ vim /etc/httpd/conf.d/ssl.confSSLCertificateFile /etc/pki/tls/certs/your-domain.com.certSSLCertificateKeyFile /etc/pki/tls/private/your-domain.com.keyComprobar la configuración
Sección titulada «Comprobar la configuración»Reinicie Apache:
$ sudo /etc/init.d/httpd restartCompruebe el acceso a su instalación de OpenKM en https://openkm.your-domain.com/.
Error Permission denied: proxy: AJP: attempt to connect
Sección titulada «Error Permission denied: proxy: AJP: attempt to connect»Si el registro muestra un error como Permission denied: proxy: AJP: attempt to connect, resuélvalo ejecutando el siguiente comando:
$ /usr/sbin/setsebool httpd_can_network_connect 1Si funciona, haga que la configuración sea permanente para que se conserve tras los reinicios:
$ /usr/sbin/setsebool -P httpd_can_network_connect 1Windows
Sección titulada «Windows»Consulte Configuración de Apache como proxy inverso HTTP
Resolución de problemas
Sección titulada «Resolución de problemas»Si ve un error como:
Necesita habilitar estos módulos de Apache:
$ sudo a2enmod rewrite$ sudo a2enmod proxy_http$ sudo a2enmod headersSi ve errores como estos:
[proxy_ajp:error] [pid 27579:tid 140057021224704] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header[proxy_ajp:error] [pid 27579:tid 140057021224704] [client xxx.xxx.xxx.xxx:60526] AH00992: ajp_read_header: ajp_ilink_receive failed[proxy_ajp:error] [pid 27579:tid 140057021224704] (70007)The timeout specified has expired: [client xxx.xxx.xxx.xxx:60526] AH00878: read response failed from 127.0.0.1:8009 (127.0.0.1)Es posible que Tomcat no esté aceptando conexiones AJP. Descomente estas líneas en $TOMCAT_HOME/conf/server.xml
<!-- Define an AJP 1.3 Connector on port 8009 --><Connector protocol="AJP/1.3" address="127.0.0.1" port="8009" redirectPort="8443" secretRequired="false" />El parámetro secretRequired es importante y, si no está presente, debe añadirlo.
Más información en Apache Tomcat 8 Configuration Reference.