PrettyPrint

jueves, 16 de octubre de 2014

Instalar SSL en nuestro servidor OwnCloud

Hay bastante documentación con respecto a SSL pero no mucha sobre los pequeños problemas que da habilitar SSL en un servidor apache que sirve OwnCloud. 

Aunque sea redundar, voy a exponer aquí todos los pasos para instalar SSL y además trataré de resolver la problemática habitual con OwnCloud, partiendo de una instalación funcional de OwnCloud sin SSL, montado sobre Ubuntu server.


Lo primero es generar nuestro certificado SSL para Apache. Esto lo tenéis muy bien explicado en la web de Hackplayers, pero yo les dejo a ellos los detalles técnicos de SSL, y voy a agregar la parte del Virtualhost un poco más detallada.

Para generar el certificado tenemos que haber instalado antes openssl  (en debian o ubuntu, sudo apt-get install openssl


Creando nuestro certificado autofirmado.

Primero, y casi copiando a Hackplayers (con su permiso), generamos la clave privada:

openssl genrsa -out ssl.key 1024 

No la generamos con password para que Apache no nos la pida cada vez que se inicie.

Generamos la solicitud de firma para nuestro nuevo certificado:

openssl req -new -key ssl.key -out ssl.csr

Esto nos va a pedir toda la información que queramos incluir en nuestro certificado, desde el país hasta el mail pasando por lo más importante, la URL del servidor, como "Common Name":

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Mi Estado           
Locality Name (eg, city) []:Mi Localidad
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mi organización
Organizational Unit Name (eg, section) []:Mi departamento
Common Name (e.g. server FQDN or YOUR name) []:www.miservidorowncloud.com    
Email Address []:midireccion@midominio.com

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

Y ahora creamos nuestro certificado autofirmado:

openssl x509 -req -days 365 -in ssl.csr  -signkey ssl.key  -out  ssl.crt

Finalmente lo trasladamos a nuestro Apache. En mi caso he creado un directorio ssl debajo de /etc/apache2/conf.d/ y en él he colocado los ficheros ssl.crt  y  ssl.key .

NOTA POSTERIOR: He comprobado en alguna distribución (Raspbian en concreto) que los certificados puestos debajo de /etc/apache2/conf.d/ provocan un error, debido a que apache trata de utilizar los ficheros del certificado como ficheros de configuración. En este caso, simplemente cambiad la ubicación a la que prefiráis. A mí me bastó con trasladar en Raspbian los ficheros del certificado a /etc/apache2/ssl/

Habilitando el acceso HTTPS en Apache.

El siguiente paso es configurar Apache para que admita conexiones en el puerto 443 utilizando este nuevo certificado. Para ello hay que crear un VirtualHost, y lo más sencillo para empezar es copiar el existente en la configuración del host por defecto (en /etc/apache2/sites-available/000-default ) y replicarla para hacerle las pertinentes modificaciones.
Mi nuevo Virtualhost está configurado de esta manera dentro del mismo 000-default y después del anterior host:

<VirtualHost *:443>
        SSLEngine on
        SSLCertificateFile     /etc/apache2/conf.d/ssl/ssl.crt
        SSLCertificateKeyFile  /etc/apache2/conf.d/ssl/ssl.key
        SetEnvIf  User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www
        <Directory /var/www/owncloud>
              AllowOverride All
        </Directory>
        <Directory /mnt/storage2-ocdata/data>
              AllowOverride All
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error_ssl.log
        CustomLog ${APACHE_LOG_DIR}/access_ssl.log combined   
</VirtualHost>


Para mi instalación, el directorio por defecto de apache /var/www será accesible tanto con http como con https, y a priori también mi instalación de owncloud (/var/www/owncloud). Entre otras cosas, porque necesitaremos entrar con http como admin para poder cambiar y forzar https

Como anécdota, veréis que tengo dos directorios diferentes para el servicio owncloud. Esto se debe a que los ficheros residen en un disco independiente del disco del sistema, cosa que he comprobado que resulta muy ventajosa, especialmente porque el servidor es una máquina virtual cuyo disco no debe crecer demasiado y, en caso de fallo del servicio, saco el disco y tengo acceso pleno a su contenido sin owncloud. Eso sí, no se os ocurra montar este repositorio a través de una red por NFS o similar, el rendimiento es terrible y os garantizo que no es por culpa de la red (en otro capítulo igual os cuento los pormenores).

En cualquier caso, comprobad que las raíces de los directorios que utiliza OwnCloud tengan la directiva AllowOverride All  para que .htaccess pueda ser utilizado. Aunque no es esto lo único que hay que hacer para evitar el problema, luego profundizamos.

Reiniciamos apache y comprobamos que los logs de errores no tengan nada raro. En caso de fallo en el reinicio, revisa la configuración del VirtualHost.


SSLEngine on Invalid command?

Bien, en algunas distribuciones es necesario activar manualmente el ssl en el servicio apache. En caso de encontrarnos con este desagradable mensaje al hacer restart al apache, ejecutamos:

  sudo a2enmod ssl

Con esto, el reinicio del apache no debería soltar el error del Invalid command.


Comprobar que todo funciona... o no.

Nos conectamos a cualquier página de nuestro servidor con un navegador mediante https y comprobamos que éste nos pedirá confirmación para aceptar el certificado, ya que al ser autofirmado, no hay autoridad ninguna en su base de datos que confirme la identidad. Si tras aceptar el certificado podemos ver la página, ya estamos sólo a un paso de terminar. Recordad que en mi instalación, parte del servidor es accesible sin SSL, fuera de la parte de OwnCloud.

Si abrimos nuestro OwnCloud con http, podemos verificar que funciona y que vemos nuestros ficheros y demás apps.

Probamos con https y verificamos que también funciona lo básico (login y ver ficheros). Si no, revisa de nuevo la configuración del VirtualHost


Ahora viene lo definitivo: Abrir la página de Adminstración de OwnCloud, con la cuenta de admin

Si se abre en menos de uno o dos segundos y no hay textos en rojo en la cabecera, todo ha ido de maravilla. Podemos marcar la casilla "Forzar HTTPS" en esta misma página, y las conexiones con HTTP se redirigirán automáticamente a HTTPS. 


Problemas habituales una vez funcionando con SSL.

Si la página de Administración tarda mucho en aparecer, mala cosa. Significa que tenemos problemas con .htaccess o bien con WebDAV. Pero aunque tarde, dejadlo seguir al menos un minuto o dos. Dará timeout y veremos una o dos frases de texto rojo con uno o dos de estos típicos problemas.


"... .htaccess no está funcionando..."

El problema del .htaccess lo previnimos antes aplicando AllowOverride All a todos los directorios de OwnCloud, pero si se nos ha colado algo y hemos hecho algo mal por el camino, puede que hayamos tenido que corregir la sintaxis en el VirtualHost, pero además OwnCloud nos habrá dejado señales en sus intentos que tenemos que borrar para eliminar el problema. Detened apache, revisad en el directorio data o en la raíz de OwnCloud, si encontráis algún fichero llamado htaccesstest.txt, borradlo y finalmente reiniciad apache. 

No sé por qué, pero yo tuve que hacer esto dos o tres veces, hasta que OwnCloud se convenció de que ya estaban eliminados y dejó de soltar estos ficheros en su directorio data. Es posible que se me olvidara reiniciar apache en algún momento, no lo sé.


"...WebDAV no está bien configurado..."

Si te ha aparecido un aviso de fallo de configuración del servicio WebDAV (principal causante además de la demora al abrir la página de Administración) seguramente es porque creaste el certificado con una URL que no coincide con el nombre de tu servidor.  Abre el log de errores de Apache que has especificado en el VirtualHost para SSL (var/log/apache2/error_ssl.log en mi caso) y verás un mensaje como éste:

[ssl:warn] [pid 23128] AH01909: RSA certificate configured for www.miservidorowncloud.com:443 does NOT include an ID which matches the server name

La solución para esto es editar el fichero /etc/hosts y agregar o modificar la línea con la IP del servidor y poniendo la URL que hemos elegido en el certificado como primer nombre. Algo así:

192.168.1.10  www.miservidorowncloud.com   otronombre  yotronombremas 

Reiniciamos apache por enésima vez, accedemos a nuestro OwnCloud con https, vamos a la página de Administración y ya debería cargar rápidamente y no mostrar ningún error. Ahora sí podemos marcar la casilla "Forzar  HTTPS" para que todas las conexiones se hagan con SSL.

Sincronización

Sólo os queda modificar vuestras aplicaciones de sincronización en PCs y otros dispositivos para que en lugar de conectarse con HTTP lo hagan con HTTPS.


Espero que todo esto os sea de ayuda. 

Agradecimientos a Hackplayers por la info relativa a la generación del certificado.





No hay comentarios:

Publicar un comentario