Hola
En esta entrada vamos a ver cómo simular en nuestro PC un entorno de producción donde tendríamos corriendo un servidor Apache y varios servidores Tomcat balanceados.
El trabajo del servidor Apache es ejercer de intermediario entre los usuarios y el servidor o servidores tomcat balanceados, encriptando las comunicaciones con el usuario final (https) y manteniendo comunicaciones abiertas (http) con los diferentes Tomcats balanceados.
Cuando un usuario solicita una página mediante 'https://localhost/portal-xxx' al Apache, éste le solicitará un certificado electrónico, verificará si el certificado está emitido por alguna de las autoridades de certificación admitida, extraerá la parte pública del certificado (pem) y la enviará en la cabecera de la petición, junto con el resto de la solicitud, al servidor Tomcat del segundo plano 'http://localhost:8080/portal-xxx'.
Reproducir este entorno en desarrollo es muy fácil y permite probar nuestras aplicaciones sin tener que introducir en ellas nada que simule este comportamiento.
Los pasos a dar para montar todo esto son:
1) Generamos el certificado del servidor, dado que todo servidor https debe tener su propio certificado para poder realizar el handshaking asociado a toda comunicación ssl (https). En este caso el cdertificado será autofirmado, por lo que el navegador no confiará en nuestro 'https://localhost/portal-xxx' y deberemos ignorar la adveretncia de seguridad en las pruebas.
1.1) Tenemos que instalar openssl:
sudo apt-get install openssl
1.2) Para generar un certificado de servidor autofirmado de 2048 bits y 10 años de duración lanzaremos el siguiente comando:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt
Durante la generación nos pedirán los siguientes parámetros:
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Madrid
Locality Name (eg, city) []:Madrid
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA
Organizational Unit Name (eg, section) []:DEPARTAMENTO
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:egdp1970@gmail.com
1.3) Guardamos los 2 ficheros generados, en mi caso los dejaré en la carpeta 'apache-keys' de mi $HOME
1.4) También deberemos preparar un fichero con los certificados raiz admitidos por nuestro servidor, adjunto el fichero 'certificadosCA.crt' que contiene los certificados raiz admitidos por la SEDE electrónica del INE.
2) Instalación de apache2 + mod_ssl + mod_headers:
Instalamos apache2
sudo apt-get install apache2
Activamos los mods ssl y headers, estos dos mods están ahora incluídos en el apache2-common, por lo que sólo tenemos que activarlos en nuestro servidor.
sudo a2enmod ssl
sudo a2enmod headers
3) Instalación del mod_proxy:
sudo apt-get install libapache2-mod-proxy-html
sudo apt-get install libxml2-dev
Activamos el mod proxy
sudo a2enmod proxy proxy_http
4) Creamos el fichero de configuración asociado a nuestro sitio /etc/apache2/sites-available/portal-xxx.conf como una copia del fichero /etc/apache2/sites-available/default-ssl.conf
sudo cp default-ssl.conf portal-xxx.conf
Editamos el fichero 'portal-xxx.conf'
sudo gedit portal-xxx.conf
Ajustamos el contenido del fichero: /etc/apache2/sites-available/portal-xxx.conf con todo: las opciones de seguridad, las opciones de gestión de cabeceras y las opciones de redirección al tomcat. El contenido del bloque '<VirtualHost _default_:443>' debería ser:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin x9000004.empresas@ine.es
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /home/miusuario/apache-keys/localhost.crt
SSLCertificateKeyFile /home/miusuario/apache-keys/localhost.key
SSLCACertificateFile /home/miusuario/apache-keys/certificadosCA.crt
#SSLVerifyClient none
#SSLVerifyClient optional
SSLVerifyClient require
RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s"
RequestHeader set SSL-CLIENTCERT-PEM "%{SSL_CLIENT_CERT}s"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"
RequestHeader set SSL_CLIENT_CERT_CHAIN_0 "%{SSL_CLIENT_CERT_CHAIN_0}s"
SSLVerifyDepth 2
SSLOptions +ExportCertData
SSLInsecureRenegotiation on
ProxyPass /portal-xxx http://localhost:8080/portal-xxx/
ProxyPassReverse /portal-xxx http://localhost:8080/portal-xxx/
</VirtualHost>
</IfModule>
5) Activamos el nuevo sitio ssl en el servidor:
sudo a2ensite localhost-ssl
6) Paramos el servidor apache
sudo service apache2 stop
7) Arrancamos el servidor apache
sudo service apache2 start
#sudo service apache2 restart
Y eso es todo, ahora podríamos levantar nuestro proyecto en depuración en nuestro IDE con su Tomcat escuchando por el puerto 8080 y realizar el tratamiento del certificado aportado por el usuario (validarlo, verificar su estado de revocación, romperlo para extraer sus datos, etc).
Un saludo
No hay comentarios:
Publicar un comentario