Todo el mundo sabe que subversion ya no mola, pero todavía se sigue utilizando en muchos proyectos y en muchas empresas. Al recibir el testigo de sysadmin en ASPgems comprobé que cada vez que hacía un checkout del repositorio con un usuario unix nuevo subversion me mostraba un mensaje parecido a este:
- The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually!
- The certificate hostname does not match.
Certificate information:
- Hostname: ASPgems
- Valid: from May 3 03:47:58 2008 GMT until May 3 03:47:58 2009 GMT
- Issuer: IT, Satimis, HK
- Fingerprint: 0c:3a:2f:08:a6:15:ff:24:28:6b:fb:52:7f:5d:6a:28:20:e9:c9:6e (R)eject, accept (t)emporarily or accept (p)ermanently?
Total que al hacer el primer despliegue de la aplicación, en el deploy se quedaba parado esperando a que respondieramos a la última pregunta.
En mis máquinas tengo un usuario de shell para cada aplicación, así que este problema me sucedía con bastante frecuencia. Mi primera opción para solventarlo era hacerse un shellscript un poco cutre que lanzado desde root hacía un checkout a un directorio vacío al usuario de la aplicación. Así, semiautomáticamente resolvía el problema.
Por supuesto esta no era la mejor solución, era la solución del lado oscuro: rápida y facil. Hoy con un poco de tiempo me he puesto a investigar la solución correcta, que es conseguir que el subversión de cada máquina acepte el certificado.
Para ello he tenido que realizar distintas tareas, aqui os lo dejo:
Lo primero es volver a generar el certificado en el servidor que tiene apache y dav_svn (el servidor de subversión). Los pasos (como root) son:
Creamos un directorio ssl en la el directorio de configuración de apache:
mkdir -p /etc/apache2/ssl
Accdemos al directorio y generamos una clave privada RSA:
cd /etc/apache2/ssl
openssl genrsa -des3 -out server.key 1024
En algún momento nos pedirá una passphrase que debemos rellenar y guardar.
Creamos una petición de firma CSR (Certificate Signing Request) :
openssl req -new -key server.key -out server.csr
Tendremos que asignar ciertos valores, es muy importante asignar en el valor CN (Common Name) el nombre del dominio del virtualhost de apache que va usarse como servidor de subversion. Un ejemplo podria ser:
Country Name (2 letter code) [GB]< State or Province Name (full name) [Berkshire]: Madrid
Locality Name (eg, city) [Newbury]: Madrid
Organization Name (eg, company) [My Company Ltd]: ASPgems
Organizational Unit Name (eg, section) []:Systems
Common Name (eg, your name or your server's hostname) []: svn.wadus.com
Email Address []</span>: wadus at aspgems.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
A continuación procedemos a eliminar la passphrase de la clave generada, si no hacemos esto cada vez que reiniciemos apache nos pedirá la passphrase, algo que es bastante incomodo.
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
Nos pedirá la passphrase que hemos guardado cuidadosamente antes.
Para finalizar generamos el certificado:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Una vez tengamos el certificado (es el fichero server.crt), tenemos que editar nuestro virtualhost de apache indicandole los paths tanto al certificado como a la clave. Es muy importante que nos aseguremos de que la directiva ServerName del virtualhost de apache tiene el mismo dominio introducido en la sección CN (Common Name) cuando hemos generado la petición de firma.
Hay que añadir el siguiente código al fichero de configuración del virtualhost:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Y reiniciamos apache:
sudo /etc/init.d/apache2 restart
Una vez tengamos esto el certificado estará configurado en el apache correctamente. Pasamos a configurar las máquinas para que acepten como válido el certificado. Esta parte se realiza en las máquinas en las que queremos automatizar el paso del checkout de subversion. Llamemolas clientes.
Lo primero que tenemos que hacer es copiar el certificado a los clientes y ponerlo en algun sitio en la máquina, concretamente debian y ubuntu tienen un directorio específico para almacenar certificados en /etc/ssl/certs.
En la máquina que aloja el subversion, ejecutamos:
scp /etc/apache2/ssl/server.crt cliente.wadus.com:
En la maquina cliente ejecutamos:
sudo mv server.crt /etc/ssl/certs/svn.pem
Y ahora editamos el fichero /etc/subversion/servers añadiendo al final la siguiente linea que nos permite indicarle al cliente de subversion que de como válido el certificado:
ssl-authority-files = /etc/ssl/certs/svn.pem
Con esto ya hemos acabado y hemos conseguido que nuestros clientes de subversion acepten el certificado como válido.
Para más información sobre como generar certificados consultad este enlace.