Instalación de Mercurial sobre Apache con autenticación SSL

En esta ocasión vamos a instalar el servidor de control de versiones Mercurial y utilizaremos Apache con mod_ssl como interfaz Web. Suponemos que el código que se alojará en ese servidor no es público, así que utilizaremos autenticación por contraseñas bajo SSL.

Instalación de Mercurial:

Para instalar Mercurial en un servidor que contendrá el código fuente de una applicación que deseamos distribuir debemos utilizar los siguienetes comandos como superusuario:

Para instalar el servidor de Mercurial en Debian, sólo se requiere utilizar el comando

# apt-get install mercurial mercurial-common 

El instalador de Debian, incluirá los paquetes Mercurial y Mercurial-common además de instalar el servidor de SSH . Si no tiene instalado Python el instalador también lo considerará y hará una primera configuración del sistema. Una vez que haya terminado verifique la instalación con

# hg --version

Una vez que tiene instalado mercurial-server, puede iniciar la configuración básica y trabajar directamente con los depósitos a través de SSH. La desventaja es que no tendrá una interfaz gráfica y en algunos casos eso puede ser un problema. El método que implementaremos crea un depósito (repository) de aplicaciones sobre una instalación de Apache2 funcional. Supondremos que tiene una instalación de Apache2 básica (vea instalación de Apache Web server).

Necesitará instalar el módulo libapache2-mod-wsgi mediante

# apt-get install libapache2-mod-wsgi

Recuerde que en Debian, los guiones de pre-instalación y de post-instalación le dejarán un entorno listo para continuar trabajando. Incluso, reiniciarán el servidor de Apache de manera automática.

Ahora debemos crear un servidor virtual que atienda únicamente las peticiones de mercurial a la manera de Debian. Cree el archivo mercurial dentro del directorio /etc/apache2/sites-available/ con el siguiente contenido

 <VirtualHost *:80>
    ServerName hg1.ejemplo.com
    ServerAdmin webmaster@hg1.ejemplo.com
    DocumentRoot /var/www/mercurial/htdocs
    ErrorLog /var/log/apache2/hg-error_log
    CustomLog /var/log/apache2/hg-access_log common

    WSGIScriptAliasMatch ^(.*)$ /var/www/mercurial/cgi-bin/hgwebdir.wsgi$1

    # To enable "daemon" mode, uncomment following lines. 
    # (Read mod_wsgi docs for more info)
    # WSGIDaemonProcess hg1.ejemplo.com 
    # user=USER 
    # group=GROUP 
    # threads=15 
    # maximum-requests=1000
    # some more interesting options (tested on mod_wsgi 2.0):
    # processes=2 
    # umask=0007 
    # display-name=wsgi-hg1.ejemplo.com 
    # inactivity-timeout=300
    # WSGIProcessGroup hg1.ejemplo.com

    <Directory /var/www/mercurial/htdocs>
        Options FollowSymlinks
        DirectoryIndex index.html

        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    <Directory /var/www/mercurial/cgi-bin>
        Options ExecCGI FollowSymlinks

        AddHandler wsgi-script .wsgi

        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

El ejemplo anterior se ha tomado del manual en línea de Mercurial para la instalación de modwsgi en Mercurial.

Ahora vaya al directorio /etc/apache2/sites-enabled y cree un enlace simbólico al archivo anterior de la forma

# cd /etc/apache2/sites-enabled
# ln -s ../sites-available/mercurial 011-mercurial

o utilice el comando

# a2ensite mercurial

(a2ensite="apache 2 enable site")

Cree los directorios donde se colocarán los proyectos y la configuración de mercurial

# mkdir -p /var/www/mercurial/htdocs
# mkdir /var/www/mercurial/cgi-bin

cree el archivo hgwebdir.config

SSL en Apache2

Instale el paquete que hará la creación de certificados qu es un wrapper para openssl

# apt-get install ssl-cert

Habilite el modulo de SSL para que funcione con apache

# a2enmod ssl

(a2enmod=apache2 enable module)

Configure openssl

# vi /etc/ssl/openssl.cnf

Si desea tener un certificado para un servidor de prueba... puede utilizar directamente el comando

# mkdir /etc/apache2/ssl
# cd /etc/apache2/ssl
# make-ssl-cert /usr/share/ssl-cert/ssleay.cnf  localcerts

La clave y el certificado se encuentran es el mismo archivo. Ahora separe en dos archivos que llamaremos site.key y site.pem y los colocamos en el mismo directorio con permisos 400 y 600 respectivamente.

# chmod 600 site.pem
# chmod 400 site.key

Creemos el archivo de contraseñas que se utilizará para acceder al depósito de mercurial

# mkdir /etc/apache2/htpasswd
# htpasswd -cm /etc/apache2/htpasswd/ht.passwd hugo

A continuación creamos el archivo del servidor virtual seguro y agregaremos la información del certificado y de la clave asignando la trayectoria completa de los archivos a las variables SSLCertificateFile y SSLCertificateKeyFile respectivamente. Cree el archivo /etc/apache2/sites-available/mercurial-ssl con el siguiente contenido

 <VirtualHost *:443>
       SSLEngine On
       SSLCertificateFile /etc/apache2/ssl/site.pem
       SSLCertificateKeyFile /etc/apache2/ssl/site.key
       # SSLCertificateChainFile /trayectoria/a/DigiCertCA.pem

       ServerName hg1.ejemplo.com
       ServerAdmin webmaster@hg1.ejemplo.com
       DocumentRoot /var/www/mercurial/htdocs/
       ErrorLog /var/log/apache2/ssl.hg-error.log
       CustomLog /var/log/apache2/ssl.hg-access.log common

       WSGIScriptAliasMatch ^(.*)$ /var/www/mercurial/cgi-bin/hgwebdir.wsgi$1

       <Directory /var/www/mercurial/htdocs>
               DirectoryIndex index.html
               AddHandler wsgi-script .wsgi
               Options ExecCGI
               Order allow,deny
               Allow from all
       </Directory>

       <Location / >
               AuthType Basic
               AuthName "Ejemplo - Mercurial Repository"
               AuthUserFile /etc/apache2/htpasswd/hg.passwd

               Require valid-user
       </Location>

</VirtualHost>

Active el sitio https://hg1.ejemplo.com que tiene configurado en el archivo mercurial-ssl y reinicie el servidor. Si todo marcha bien, tendrá su sitio Web seguro con soporte bajo SSL

# a2ensite mercurial-ssl
# /etc/init.d/apache2 restart

Para probar que su sitio Web seguro está funcionando ejecute el comando

# curl -k https://hg1.ejemplo.com

La opción -k le indica al comando curl que no haga la verificación del certificado , en caso de no utilizarla, recibirá un mensaje de error que no nos permitirá conocer el estado real de la instalación.

Ahora podrá conectarse a su sitio web seguro en la dirección https://hg1.ejemplo.com si está utilizando un navegador Web configurado de manera adecuada, recibirá un mensaje de precaución indicando que el sitio Web tiene un certificado de seguridad autorizado localmente. Si desea tener un certificado auténtico existen diversas compañías (como DigiCert ) que comercializan este tipo de certificados y usted sólo deberá ejecutar las tareas de copia y asignación de permisos en el directorio /etc/apache2/ssl, los demás pasos son equivalentes.

También puede crear un certificado de autenticidad (CA) para su propia compañía y designar sus trayectorias de autenticación internas. Le recomendamos revisar el manual de configuración y la página de preguntas frecuentes de Apache y OpenSSL directamente.