Configuración de un servidor web Apache como proxy

Esta sección explica cómo usar un proxy de servidor web Apache frente a EJBCA. El servidor resultante:

  • Mostrar EJBCA RA Web en https://ca-server.company.local/

  • Redirigir todas las solicitudes HTTP a HTTPS, excepto OCSP y CRL.

  • Requerir un certificado SSL de cliente al acceder a https://ca-server.company.local/adminweb/

  • Ser capaz de equilibrar la carga de solicitudes

  • Aún respondo a solicitudes en https://ca-server.company.local/ejbca/*

Este ejemplo se creó en Ubuntu 64-bit Server 7.10 usando el paquete Apache Web Server 2.2, pero debería ser fácil de adaptar a cualquier sistema capaz de ejecutar Apache.

Para admitir solicitudes GET de OCSP a través del proxy en la versión reciente de Apache (2.4), es posible que deba activar mod_lbmethod_byrequests . También podría necesitar usar el directorio nocanon para ProxyPass y así reenviar correctamente las barras diagonales codificadas (/).

Para configurar un servidor web Apache como proxy frente a EJBCA, comience por instalar EJBCA de forma normal. Si desea tener la CA en la misma máquina que el proxy, debe modificar $EJBCA_HOME/conf/web.properties para que solo escuche al host local:

httpsserver.bindaddress.pubhttp= 127.0 . 0.1
httpsserver.bindaddress.pubhttps= 127.0 . 0.1
httpsserver.bindaddress.privhttps= 127.0 . 0.1

Instale el servidor web Apache y habilite los módulos necesarios:

$sudo su
#apt-get install apache2
#cd /etc/apache2/mods-enabled/
#ln -s ../mods-available/proxy.load proxy.load
#ln -s ../mods-available/proxy_http.load proxy_http.load
#ln -s ../mods-available/proxy_ajp.load proxy_ajp.load
#ln -s ../mods-available/proxy_balancer.load proxy_balancer.load
#ln -s ../mods-available/rewrite.load rewrite.load
#ln -s ../mods-available/ssl.load ssl.load

Genere el certificado SSL para Apache. Tenga en cuenta que el certificado SSL debe ser emitido por la misma CA que emitió el certificado SSL de Tomcat (ManagementCA en la configuración predeterminada). Para generar el certificado SSL para Apache mediante la CLI de EJBCA, ejecute lo siguiente:

$ cd $EJBCA_HOME
$ bin/ejbca.sh ra addendentity apache-ssl foo123
"CN=ca-server.company.local,O=EJBCA Sample,C=SE" "" ManagementCA "" 1
PEM SERVER
$ bin/ejbca.sh ra setclearpwd apache-ssl foo123
$ bin/ejbca.sh batch
$ ls p12/pem/ca-server.company.local*
p12/pem/ca-server.company.local-CA.pem p12/pem/ca-server.company.local-Key.pem p12/pem/ca-server.company.local.pem

Configure el archivo de host virtual predeterminado /etc/apache2/sites-enabled/000-default, de acuerdo con lo siguiente.

Tenga en cuenta que esta configuración con SSLVerifyClient dentro de una directiva de ubicación no es segura debido a la vulnerabilidad en SSL/TLS descubierta el 15/11/2009 (CVE-2009-3555). Debe ejecutar versiones actualizadas de Apache y Java, o usar SSLVerifyClient y SSLCipherSuite únicamente en hosts virtuales completos. Puede lograr el mismo efecto que se muestra a continuación utilizando un subdominio independiente para la administración de EJBCA (por ejemplo, admin.ca.youdomain.com).

NameVirtualHost *: 80
<VirtualHost *: 80 >
DocumentRoot /var/www/
# Proxy requests to EJBCA instances (only one on local machine configured)
<Proxy balancer: //mycluster-kerb>
BalancerMember ajp: //localhost:8009/ejbca
</Proxy>
ProxyPass / balancer: //mycluster-kerb/
RewriteEngine On
# Redirect all but the CRL Distribution Point, OCSP and Healthcheck to HTTPS
RewriteCond %{THE_REQUEST} !(/publicweb/webdist/certdist.*cmd=crl|/publicweb/status/)
RewriteRule ^(.*)$ https: //%{SERVER_NAME}$1 [L,R]
# Treat requests to / and /ejbca/ as the same. Required by EJBCA's CA UI.
RewriteCond %{THE_REQUEST} /ejbca/
RewriteRule ^/ejbca/(.*)$ /$ 1 [PT]
# Configure log
LogLevel warn
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
NameVirtualHost *: 443
<VirtualHost *: 443 >
DocumentRoot /var/www/
RewriteEngine On
# Treat requests to / and /ejbca/ as the same. Required by EJBCA's CA UI.
RewriteCond %{THE_REQUEST} /ejbca/
RewriteRule ^/ejbca/(.*)$ /$ 1 [PT]
# Configure secure SSL for this server using SSL certificate generated by EJBCA
SSLEngine on
SSLCipherSuite HIGH
SSLProtocol all -SSLv2
SSLCertificateFile /home/jboss/ejbca/p12/pem/ca-server.company.local.pem
SSLCertificateKeyFile /home/jboss/ejbca/p12/pem/ca-server.company.local-Key.pem
# Require Client SSL certificate for the CA UI
<Location /adminweb>
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /home/jboss/ejbca/p12/pem/ca-server.company.local-CA.pem
</Location>
# Proxy requests to EJBCA instances (only one on local machine configured)
<Proxy balancer: //mycluster-kerb>
BalancerMember ajp: //localhost:8009/ejbca
</Proxy>
ProxyPass / balancer: //mycluster-kerb/
# Configure log
LogLevel warn
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Recargue la configuración de Apache y verifique que solo el puerto 80, 443 y otros servicios deseados (por ejemplo, un ssh-daemon) estén escuchando en todas las interfaces externas:

$sudo /etc/init.d/apache2 reload
$sudo netstat -nap | grep LISTEN | grep -v 127.0 . 0.1
tcp 0 0 0.0 . 0.0 : 80 0.0 . 0.0 :* LISTEN 7612 /apache2
tcp 0 0 0.0 . 0.0 : 443 0.0 . 0.0 :* LISTEN 7612 /apache2
tcp6 0 0 ::: 22 :::* LISTEN 3746 /sshd

Se recomienda utilizar un firewall como capa adicional de seguridad (por ejemplo, descartar paquetes malformados y evitar que se exploten servicios futuros).

Configuración de URL

La siguiente configuración de ejemplo permite representar URL agradables para OCSP, por ejemplo, para apuntar su localizador de servicio OCSP a http://ocsp.company.com/ en lugar de http://ocsp.company.com:8080/ejbca/publicweb/status/ocsp (se omite cierta información para mayor brevedad):

<VirtualHost ocsp.company.com: 80 >
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http: //127.0.0.1:8080/ejbca/publicweb/status/ocsp
ProxyPassReverse / http: //127.0.0.1:8080/ejbca/publicweb/status/ocsp
</VirtualHost>

Esto también se aplica a los puntos de distribución de CRL.