Configurar apache con múltiples dominios con SSL

En debian, es tan sólo activar un ajuste en /etc/apache2/ports.conf:

<IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>

Eso sí, habrá que cambiar también a NameVirtualHost *:443 (el * en lugar de _default_) en el host SSL por defecto: /etc/apache2/sites-available/default-ssl

A partir de ahora podremos crear un VirtualHost: <VirtualHost *:443> con su ServerName, ServerAlias y DocumentRoot con estos parámetros adicionales:

SSLEngine on
SSLCertificateFile {ruta al certificado}
SSLCertificateKeyFile {ruta a la llave}
SSLCertificateChainFile {ruta al certificado intermedio}

Borrar certificados en firefox

Hace unos días he descubierto una particularidad del almacén de certificados de firefox, un bug conocido de hace mucho tiempo y aún sin corregir.

Cuando quieres borrar un certificado de usuario, si tienes establecida una clave maestra (es decir, si tienes protegidos tus certificados con clave) te dirá que te borra el certificado, pero no será cierto, te volverá a aparecer la siguiente vez que visualices los certificados.

Para borrar correctamente un certificado de usuario: Preferencias -> Seguridad -> Quitar el check de usar una clave maestra. Reiniciar el navegador y volver a Preferencias -> Avanzado -> Certificados -> Ver certificados.

Ahora si dejará borrarlos correctamente. Si no habéis reiniciado el navegador, el borrado de certificados será efectivo en el próximo cierre.

Algo curioso y que debería estar documentado o al menos advertido.

AVISO: Este artículo es antiguo y probado en versiones posteriores (de 2018) parece ya funcionar correctamente.

Instalando mailman en debian

Hoy me ha sorprendido gratamente lo fácil y sencillo que es instalar y configurar de forma muy básica mailman (un gestor de listas de correo). Lo he instalado en debian con soporte para leer las listas en apache y usando postfix como MTA.

Tan sencillo como:

apt-get install mailman 

Y contestar a unas sencillas preguntas. Luego editar /etc/mailman/mm_cfg.py para cambiar las rutas por defecto y el nombre del host en caso que sea necesario (para que por ejemplo vaya por SSL utilizando https://secure.tudomnio.tld/pipermail/.

Leer más

Lighttpd con SSL

Todos los servidores web suelen tener métodos bastante estándares para añadir SSL, lo típico cuando se usa OpenSSL es (como ya he explicado en otro articulo anterior):

Generar la clave privada:

openssl genrsa -out serhost.com.key 1024

Generar la solicitud de certificado:

openssl req -new -key serhost.com.key -out serhost.com.csr

Ahora queda o bien enviar esa solicitud a una entidad certificadora (que nos cobrarán: 10$ (registerfly), 20$ (godaddy) a otros precios menos razonables como verisign que intentará cobrar más de 350$ por certificado, todas las compañías hacen lo mismo, pero unas tienen «mas nombre» que otras).

La otra opción es optar también por una entidad certificadora gratuita (cacert.org) que ya no está reconocida ni siquiera por firefox, para lo cual, mejor, autofirmamos nuestro certificado (nos dará un aviso que el certificado no está firmado por una autoridad certificadora de confianza, pero podemos aceptarlo de forma permanente).

Actualización: Desde que se creó este artículo, existen alternativas gratuitas como por ejemplo: letsencrypt.

Para firmarlo y obtener un crt:

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

Ahora necesitamos el certificado en formato .pem (el .pem no es más que el archivo .key y a continuación el archivo .crt), luego los concatenamos:

cat serhost.com.key serhost.com.crt > serhost.com.pem

En mi caso he guardado todos estos archivos:

  • serhost.com.key
  • serhost.com.csr
  • serhost.com.crt
  • serhost.com.pem

En un directorio: ssl-certs, de modo que tengo todo un poco más clasificado, hay que recordar darles los permisos adecuados (que el propietario sea el usuario con que se ejecuta lighttpd y solo puedan ser accedidos por él).

Una vez tenemos todo esto (vamos a suponer que en: /etc/lighttpd/ssl-certs) editamos el fichero de configuración de lighttpd (que suponemos está en: /etc/lighttpd/lighttpd.conf) y añadimos al final:

var.confdir = "/etc/lighttpd"
$SERVER["socket"] == "127.0.0.1:443" {
ssl.engine = "enable"
ssl.pemfile = var.confdir + "/ssl-certs/serhost.com.pem"
server.name = var.confdir + "serhost.com"
server.document-root = "/var/www/localhost/htdocs/"
}

Las opciones creo que son autoexplicativas, también se puede establecer la opción:

ssl.ca-file = var.confdir + "/entidadcertificadora.crt"

que indicaría donde se encuentra el certificado con que ha sido firmado nuestro propio certificado.

Por último, comentar que lighttpd soporta PHP, python, perl, ruby, y que tiene soporte para virtualhosts y diferentes módulos útiles: mod_proxy, mod_auth, mod_alias, mod_cache, mod_deflate, mod_cgi, mod_accesslog, mod_rewrite, etc, además, sus fuentes comprimidos ocupan unos 700 KB y parece ser que funciona más rápido que apache, una vez compilado a mano con todas las librerías y el man correspondiente ocupa menos de 2 megas (tras pasarle el comando strip).

Más información:

  • Configuración extraída y adaptada de: http://www.varlogarthas.net/blog/2007/03/installing_a_godaddy_ssl_certi.html (el enlace ya no funciona)
  • Lighttpd: http://www.lighttpd.net

Manejando OpenSSL

Cosillas útiles que dejo aquí para referencias posteriores:

Crear una llave privada RSA de 1024 bits sin cifrar por contraseña (para que sea más fácil trabajar con ella, si se quiere cifrar añadir -des3 y -out llaveprivada.key sin el > llaveprivada.key)

openssl genrsa 1024 > llaveprivada.key

Generar un certificado X509 de 999 días de validez usando la llave privada generada anteriormente

openssl req -new -x509 -days 999 -key llaveprivada.key -out certificado.crt

ó

openssl x509 -req -days 999 -in server.csr -signkey server.key -out server.crt

Crear un .pem a partir de llave y certificado (yo los concateno a mano estos ficheros, aunque se puede hacer con openssl pasando varios parámetros).

cat llaveprivada.key > certificado.pem
cat certificado.crt >> certificado.pem

Pasar de PEM (.PEM) a PKCS12 (.P12)

openssl pkcs12 -export -in certificado.pem -out certificado.p12

Al revés (por si hace falta convertir un p12 a .pem)

openssl pkcs12 -in certificado.p12 -out certificado.pem

Links externos:

Como generar certificados con CA propia

AVISO: Artículo desactualizado, algunas funciones de javascript ya no existen y el tamaño del certificado debe ser como poco de 2048 en adelante.

Por si alguien se pregunta como hacen para generar certificados de la FNMT o de cualquier otra entidad certificadora (CA), aquí dejo un ejemplo:

<form  enctype=”application/x-www-form-urlencoded”  action=”http://example.com/secure/keygen/test.cgi” method=”post”>
<select name=”randomkey” option2048 (alto nivel)/>
<option option1024 (nivel medio)/></option>
<select input type=”text” value=”Default Text” name=”Field1″ />
  • challenge – Specifies the challenge string to be packaged with the public key for use in verification of the form submission. If no challenge string is provided, then it is encoded as an ‘IA5STRING’ of length zero.
  • name – Names the keygen string.

Más información en: http://www.developingwebs.net/htmlcode/keygentag.php y http://www.blooberry.com/indexdot/html/ … keygen.htm

Para que te envíen algo firmado por web:

<script language="javascript">
function signAndSend() {
document.login.firma.value=crypto.signText(document.login.nick.value,"ask");
document.login.submit(); } </script>
<form>
<input type="text" name="nick" />
<input type="hidden" name="firma" />
<input type="submit" onclick="javascript:signAndSend();" value="Entrar" />
</form>

De: http://oasis.dit.upm.es/~jantonio/firmadigital/ (no funciona) en kriptopolis hay otro artículo interesante: http://www.kriptopolis.org/node/1903 (no funciona

Evidentemente, estos certificados generados, no valen para entrar en sitios de la administración, ya que poseen la firma de nuestra propia entidad certificadora y no la de la FNMT que es un organismo oficial.