Proxy apache con https

Cuando tienes pocas IPs y muchas maquinas una de las opciones que tienes para preservar IPs es usar proxy_http de apache, pero ¿qué ocurre cuando quieres proxyear conexiones https?

Lo lógico ha sido crear el certificado en la máquina que contiene el servicio bajo ssl, hasta aquí todo OK, pero se complicaba la cosa al tratar de hacerlo pasar por el servidor que hace de proxy apache.

Vamos a ver como lo he hecho, no es exactamente como quería, pero la cosa es que funciona :P

Para recopilar un poco y como ha habido cambios en la web startssl voy a poner el paso a paso, además que el post que tengo es un poco viejuno ya!

Vamos a generar pues el certificado para cloud.capa8.net

root@electra-owncloud:/etc/ssl# mkdir capa8
root@electra-owncloud:/etc/ssl# cd capa8
root@electra-owncloud:/etc/ssl/capa8# openssl req -nodes -newkey rsa:2048 -keyout cloud.capa8.net.key -out cloud.capa8.net.csr
Generating a 2048 bit RSA private key
.........................+++
...............+++
writing new private key to 'cloud.capa8.net.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Barcelona
Locality Name (eg, city) []:Barcelona
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Capa8 Asistencial, S.L.
Organizational Unit Name (eg, section) []:Cloud
Common Name (e.g. server FQDN or YOUR name) []:cloud.capa8.net
Email Address []:info@capa8.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


root@electra-owncloud:/etc/ssl/capa8# ls -lh
total 8.0K
-rw-r--r-- 1 root root 1.7K Mar 18 22:30 cloud.capa8.net.key
-rw-r--r-- 1 root root 1.1K Mar 18 22:30 cloud.capa8.net.csr

root@electra-owncloud:/etc/ssl/capa8# openssl x509 -req -in cloud.capa8.net.csr -signkey cloud.capa8.net.key -out cloud.capa8.net.crt
Signature ok
subject=/C=ES/ST=Barcelona/L=Barcelona/O=Capa8 Asistencial, S.L./OU=Cloud/CN=cloud.capa8.net/emailAddress=info@capa8.net
Getting Private key

root@electra-owncloud:/etc/ssl/capa8# ls
cloud.capa8.net.crt  cloud.capa8.net.csr  cloud.capa8.net.key

Ahora nos vamos a la web de startssl y si no tenemos cuenta le damos a sign-up, ponemos el país y nuestro correo electrónico. A los pocos segundos nos llega el código de verificación y lo introducimos.

A continuación tenemos que validar nuestro dominio desde la pestaña “validations wizard”, será preciso disponer de acceso a la cuenta postmaster@tudominio.com o otra cuenta administrativa. Recibirás ahí la clave y podrás validar tu dominio.

Ahora vamos a lo que nos interesa, generar un certificado gratuito de estos que duran un año.
Vamos a la pestaña “Certificates Wizard” y escogemos “Web Server SSL/TLS Certificate”, le damos a continue y en la caja de texto introducimos el (o los, hasta 5) dominios que queremos generar el certificado y en el checkbox de abajo, escogemos “Generated by Myself” e introducimos el contenido completo del fichero .csr que hemos generado hace unos segundos.
Le damos a submit y en “Tool box” > “Certificate List” aparece el subdominio con un botón que pone “Retrieve”.
Aquí nos permite descargar un .zip con los certificados generados para distintos servidores de páginas web.

Ahora volvemos a nuestro querido servidor. Este paso es necesario si el servidor va a disponer de IPv6 o es accesible por cualquier otra red, como podría ser la de guifi. En mi caso, el servidor va a estar accesible sólo por IPV6 y el proxy http lo voy a usar sobre la red nateada para el IPv4.

Así que vamos al servidor de owncloud y descomprimos el .zip, cogemos los certificados que nos interesan y el resto de morralla nos la cargamos :)

root@electra-owncloud:/etc/ssl/capa8# mkdir startssl
root@electra-owncloud:/etc/ssl/capa8# cd startssl/
root@electra-owncloud:/etc/ssl/capa8/startssl# ls
cloud.capa8.net.zip
root@electra-owncloud:/etc/ssl/capa8/startssl# unzip cloud.capa8.net.zip 
Archive:  cloud.capa8.net.zip
  inflating: IISServer.zip           
  inflating: ApacheServer.zip        
  inflating: NginxServer.zip         
  inflating: OtherServer.zip         
root@electra-owncloud:/etc/ssl/capa8/startssl# ls
ApacheServer.zip  cloud.capa8.net.zip  IISServer.zip  NginxServer.zip  OtherServer.zip
root@electra-owncloud:/etc/ssl/capa8/startssl# unzip ApacheServer.zip 
Archive:  ApacheServer.zip
  inflating: 2_cloud.capa8.net.crt   
  inflating: 1_root_bundle.crt       
root@electra-owncloud:/etc/ssl/capa8/startssl# rm *.zip
root@electra-owncloud:/etc/ssl/capa8/startssl# ls
1_root_bundle.crt  2_cloud.capa8.net.crt

Ahora en el fichero /etc/apache2/sites-available/cloud-capa8.conf definimos el virtualhost correspondiente:

< VirtualHost *:80>
        ServerName cloud.capa8.net
        ServerAlias *.cloud.capa8.net cloud.capa8.cat *.cloud.capa8.cat

        ServerAdmin ***@***

        DocumentRoot /var/www/owncloud/

        # Si activo esto hace un bucle de redirección y tampoco puedo deshabilitar este virtualhost...
        #RewriteEngine On
        #RewriteCond %{HTTPS} !=on
        #RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
< /VirtualHost>

< IfModule mod_ssl.c>
< VirtualHost *:443>
        ServerAdmin ***@***

        DocumentRoot /var/www/owncloud/
        ServerName cloud.capa8.net
        ServerAlias *.cloud.capa8.net cloud.capa8.cat *.cloud.capa8.cat

        
                Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
        

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        ErrorLog ${APACHE_LOG_DIR}/cloud-capa8-ssl_error_log
        TransferLog ${APACHE_LOG_DIR}/cloud-capa8-ssl_access_log

        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!LOW:!aNULL:!eNULL
        SSLCertificateFile /etc/ssl/capa8/startssl/2_cloud.capa8.net.crt
        SSLCertificateKeyFile /etc/ssl/capa8/cloud.capa8.net.key
        SSLCertificateChainFile /etc/ssl/capa8/startssl/1_root_bundle.crt
        CustomLog   ${APACHE_LOG_DIR}/cloud-capa8-ssl_request "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

        RewriteEngine On
        RewriteOptions inherit
< /VirtualHost>
< /IfModule>

Cuidadín al copiar el fichero a saco, he tenido que añadir un espacio después de < porque sino el wordpress se vuelve loco y me muestra lo que le da la gana :P Ahora nos vamos al servidor cabecera que está recibiendo las peticiones http y https que tiene la IP pública y en su /etc/hosts le añadimos la IP que tiene el servidor de cloud

root@electra-http:~# vi /etc/hosts
192.168.1.3 electra-http
192.168.1.4 cloud.capa8.net cloud.capa8.cat

Copiamos los ficheros de certificado del otro servidor a éste.

Y Añadimos un nuevo fichero de configuración de virtualhost con éste contenido

< VirtualHost *:80>
        ServerName cloud.capa8.net
        ServerAlias *.cloud.capa8.net cloud.capa8.cat *.cloud.capa8.cat

        ServerAdmin ***@***

        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
< /VirtualHost>

< VirtualHost *:443>
        ServerName cloud.capa8.net
        ServerAlias *.cloud.capa8.net cloud.capa8.cat *.cloud.capa8.cat

        
                Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
        

        ServerAdmin ***@***

        < Proxy *>
                Require all granted
        < /Proxy>

        SSLEngine on
        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!LOW:!aNULL:!eNULL
        SSLCertificateFile /etc/ssl/capa8/startssl/2_cloud.capa8.net.crt
        SSLCertificateKeyFile /etc/ssl/capa8/cloud.capa8.net.key
        SSLCertificateChainFile /etc/ssl/capa8/startssl/1_root_bundle.crt
        CustomLog   ${APACHE_LOG_DIR}/cloud-capa8-ssl_request "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://cloud.capa8.net/
        ProxyPassReverse / http://cloud.capa8.net/
< /VirtualHost>

Habilitamos el sitio, los módulos necesarios y reiniciamos apache

root@electra-http:~# a2enmod rewrite proxy_http
root@electra-http:~# a2ensite cloud.capa8
root@electra-http:~# service apache2 restart

Y ahora accedemos a la url http://cloud.capa8.net y tendría que redirigir a https://cloud.capa8.net con un certificado firmado.

Y listos! :)

Se aceptan propuestas de mejora :P

One Comment

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.