Apache 1.3.x + mod_ssl

Instrucciones para instalar y configurar Apache + OpenSSL

RESUMEN

Este documento intenta explicar como hacer la configuracion de Apache y ModSSL para obtener un site seguro, que tenga capacidad de manejar conexiones encriptadas, usando una clave que puede ser firmada por una autoridad privada (Verisign, Thawte, etc) o por una autoridad creada por nosotros mismos. Tambien tu clave puede ser firmada por algun servidor de algun amigo tuyo, que este cuya clave haya sido firmada por un servidor seguro, pero esto ultimo ya es un tema que no tocare en este documento

REQUISITOS

Para realiar esta instlacion, asumire que tienes instalados, configurados y 100% funcionales lo sisguientes paquetes.

Apache 1.3.x
OpenSSL
ModSSL

Procedimiento

Aqui veremos algunos elementos que deben estar presentes en la configuracion de Apache. En el archivo de configuracion de Apache (httpd.conf) debemos tener las siguientes lineas

 <IfDefine SSL>
 LoadModule ssl_module    extramodules/libssl.so
 </IfDefine>
 <IfDefine SSL>
 AddModule mod_ssl.c
 </IfDefine>
 Include /etc/apache/conf/addon-modules/mod_ssl.conf

Con esas lineas, tendrias ya configurado el archivo principal de Apache. Ahora, es importante notar que la linea Include, la cual contiene el path hacia el archivo de configuracion que contiene las directivas de Apache y ModSSL. Veamos ahora la configuracion del ModSSL la cual esta contenida en el archivo mod_ssl.conf

 <IfModule mod_ssl.c>
 Listen 443
 AddType application/x-x509-ca-cert .crt
 AddType application/x-pkcs7-crl    .crl
 SSLPassPhraseDialog  builtin
 SSLSessionCache        shm:logs/ssl_scache(512000)
 SSLSessionCacheTimeout  300
 SSLMutex  sem
 SSLRandomSeed startup builtin
 SSLRandomSeed connect builtin
 SSLLog      logs/ssl_engine_log
 SSLLogLevel info
 
B< SSLCertificateFile /path_to/server.crt>
 
B< SSLCertificateKeyFile /path_to/server.key>
 
 SSLEngine On
 </IfModule>

Con esto deberia ser suficiente, aunque para activar el ModSSL para los VirtualHost, se debe agregar lo siguiente al httpd.conf. Respecto a las lineas en negrita, fijense que aqui estamos especificando la ruta en donde se encuentran los archivos que poseen la clave privada y la firma digital. Ya veremos en la proxima seccion como hacer para generar dichas claves, e incluso como firmarlas con nuestro propio servidor en el caso de que no poseamos un certificado de Verisgn , Thawte, etc

 Include /etc/apache/conf/vhosts/ssl.default-vhost.conf

Ahora, la estrategia que usare en este documento consta de lo siguiente. Creare dos VirtualHosting, uno para un dominio virtualel cual no requiere de encriptacion (www.dominio.com), y el otro para un dominio virtual que si requiere de encriptacion (ssl.dominio.com). Comenzare configurando el dominio virtual que requiere de encriptacion (ssl.dominio.com) En el interior del archivo ssl.default-vhost.conf se debe tener algo asi

 <IfModule mod_ssl.c>
 <VirtualHost _default_:443>
 DocumentRoot /var/www/htdocs
 ErrorLog logs/ssl-error_log
 TransferLog logs/ssl-access_log
 SSLEngine on
 SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

SSLCertificateFile /path_to/server.crt

SSLCertificateKeyFile /path_to/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"
 RewriteEngine On
 RewriteOptions inherit
 </VirtualHost>
 <VirtualHost 10.0.0.40:443>
 ServerName ssl.dominio.com
 DocumentRoot /var/www/sslsite
 DirectoryIndex index.html
 ServerPath /dominio
 SSLEngine on

SSLCertificateFile conf/ssl/server.crt

SSLCertificateKeyFile conf/ssl/server.key

 ErrorLog /var/log/apache/ssl-error.log
 CustomLog logs/ssl-access.log combined env=!VLOG
 </VirtualHost>
 </IfModule>
                  
Las lineas en negrita merecen especial atencion, ya que en dichos archivos se encuentran los certificados firmados y las claves del servidor y del dominio virtual (fijense que las tenemos tambien adentro de <VirtualHost>. El archivo server.crt contiene XXXX mientras que el archivo server.key contiene el XXXXX de cada host virtual. Recuerde que cada VirtualHost debe posee una clave firmada y privada de manera particular, por lo que si tenemos 15 VirtualHosting que usen SSL, debemos tener 15 claves privadas y 15 firmas digitales. Es obvio lo explicado anteriormente ya que todas estas directivas se encuentran dentro de la directiva global <VirtualHost>

Ahora, para configurar el dominio virtual sin encriptacion, hacemos las configuraciones comunes de todo VirtualHosting, en el archivo Vhost.conf :

NameVirtualHost 10.0.0.40

<VirtualHost 10.0.0.40:80> ServerName www.dominio.com ServerPath /dominio DocumentRoot /var/www/dominio DirectoryIndex index.html ErrorLog /var/log/apache/error.log CustomLog /var/log/apache/access.log common </VirtualHost>

Notese que estamos usando VirtualHosting basado en nombres

Generacion de claves privadas y firmas digitales.

Veamos como es el procedimiento para firmar una clave privada. Paso a paso haremos lo siguiente.

Creamos la clave privada.
 openssl req -new -out server.csr

En el momento en que se pregunte por ``Common Name'', debemos responder con el nombre del dominio al cual le deseamos generar la clave. El certificado pertenecera al nombre del dominio, y los browsers sabran como manejar esta situacion.

Frimamos la clave
Ahora firmamos la clave anteriormente con nuestro propio servidor
 openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365

Este comando firmara la clave por un periodo de 265 dias. Puedes aumentar el numero de dias sin ningun problema.

Inicializar Apache
A partir de ahora, Apache debe ser inicializado usanod el parametro -D SSL, por lo que el proceso quedari asi
 /usr/sbin/apache -D SSL

Probando conexiones seguras.
Probamos ahora que todo haya quedado en correcto orden y configuracion. Usamos el siguiente comando
 openssl s_client -connect ip_o_nombre_de_maquina:443

Esto debera responder algo similar a esto

 CONNECTED(00000003)
 depth=0 /C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 verify error:num=18:self signed certificate
 verify return:1
 depth=0 /C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 verify return:1
 ---
 Certificate chain
 0 s:/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 i:/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 ---
 Server certificate
 -----BEGIN CERTIFICATE-----
 MIIC0TCCAjoCAQAwDQYJKoZIhvcNAQEEBQAwgbAxCzAJBgNVBAYTAmF0MQ0wCwYDV
 [...]
 9ucXUnk=
 -----END CERTIFICATE-----
 subject=/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 issuer=/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/Email=bb@apcinteractive.net
 ---
 No client certificate CA names sent
 ---
 SSL handshake has read 1281 bytes and written 320 bytes
 ---
 New, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA
 Server public key is 1024 bit
 SSL-Session:
 Protocol  : TLSv1
 Cipher    : EDH-RSA-DES-CBC3-SHA
 Session-ID: 49ACE1CF484A67D2C476B923D52110A6FCA1A7CE53D76DF7F233DEBF2333D4FB
 Session-ID-ctx:
 Master-Key: 00E9FA964253752294ECD69C18ADBA527B7170C112E2B3BCB25EA8F4FD847EC46E1FF0194EF8E16985B5E38BF6F12131
 Key-Arg   : None
 Start Time: 980696025
 Timeout   : 300 (sec)
 Verify return code: 0 (ok)
 ---

Por supuesto, tambien en tu browser puedes colocar lo siguiente

 https://nomre_o_ip_server


AUTOR

Carlos Molina Garcia cmolina@net-uno.net


REFERENCIAS

http://www.apache.org

http://www.modssl.org