Openssl: certificados para EAP-TLS y PEAP

El primer paso para configurar la red inalámbrica es crear los certificados digitales necesario para establecer una validación mutua entre el autenticador y el solicitante, es decir el servidor necesita identificarse ante el cliente con un certificado y lo mismo le ocurre al cliente, que tiene que demostrar su identidad al servidor. Más información en certificados digitales.

La gestión de certificados se realiza mediante openssl. El fichero de configuarción se denomina openssl.cnf y dependiendo de la distribución puede tener distintas ubicaciones. En este texto supongo que se encuentra en el directorio $SSLDIR, directorio en el que residen los datos de openssl.

Para localizar el fichero podemos ejecutar

find / -name openssl.cnf


Modificar $SSLDIR

Los certificados digitales incluyen cierta información que es necesario personalizar ya adaptarla a nuestros datos. También se pueden modficar las rutas de la CA y de los ficheros de llaves, etc. En principio sólo nos interesa modificar los datos predeterminados de la entidad para definir los datos que aparecerán en los certificados.

countryName_default
        stateOrProvinceName_default
        localityName_default
        0.organizationName_default
        organizationalUnitName_default
        emailAddress_default

Por ejemplo:

countryName_default = ES

Y así establecemos como país predeterminado "ES".

Posteriormente deberemos modificar la ruta para indicar donde se almacenan los datos de la CA y pondremos:

dir = ./CA

y de esta forma utilizaremos la autoridad certificadora que haya en el diectorio activo.



Crear una autoridad certificadora

La forma más simple de hacerlo es mediante los scripts que proporciona el propio openssl. Un buen sitio para crear esta autoridad certificadora es el diectorio /etc/raddb/certs, pero antes de ejecutar estas órdenes deberíamos asegurarnos que no existe ninguna CA previa que no interese perder. Para crear una CA en /etc/raddb/certs ejecutamos:

mkdir  /etc/raddb/certs
cd  /etc/raddb/certs
/ruta/CA.pl -newca

y genera toda la estructura de directorio necesaria, la llave privada (cakey.pem) y el certificado (cacert.pem). Podemos elegir un directorio cualquiera en lugar del propuesto.

Durante el proces de creación de la CA tendremos que proporcionar la contraseña de la llave privada que tendremos que usar para crear certificados.

El script CA.pl lo podemos localizar con

locate CA.pl

o bien

find / -name CA.pl


Exportar el certificado raíz

Vamos a necesitar exportar el certificado raíz para distribuirlo entre los clientes, por lo que creamos varias versiones en distintos formatos. Cada cliente puede preferir un formato concreto.

cd  /etc/raddb/certs

openssl x509 -inform PEM -outform DER \

-in CA/cacert.pem -out root.der

y tenemos el certificado raíz en root.pem además de CA/cacert.pem



Crear el certificado para el servidor radius

Primero necesitamos crear un fichero llamado /etc/raddb/certs/xpextensions con el siguiente contenido:

#
#  For use with the 'CA.all' script.
#
[ xpclient_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2
[ xpserver_ext]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

y ya procedemos a crear el certificado para el servidor

cd  /etc/raddb/certs
openssl req -new -keyout key_radius.pem \

-out req_radius.pem -nodes

openssl ca  -policy policy_anything -out cert_radius.pem \

-extensions xpclient_ext -extfile xpextensions \

-infiles req_radius.pem

 

openssl pkcs12 -export -in cert_radius.pem \
 -inkey key_radius.pem -out cert-radius.p12 -clcerts

 

openssl x509 -inform PEM -outform DER \
  -in cert-radius.pem -out cert-radius.der

 

Y los ficheros cert_radius.pem y key_radius.pem contienen el certificado y la llave privada para el servidor radius que posteriormente utilizaremos en el fichero de configuración.

Hemos creado la llave privada sin contraseña. Para que la llave privada tenga contraseña basta quitar la opción -nodes.


Certificados para los clientes


#!/bin/sh
if [ $# -ne 2 ]
then
        echo "Uso:"
        echo "$0 usuario dias"
        exit
fi
DIR=/etc/raddb/certs
user=$1
dates=$2
CFG=$DIR/openssl.cnf
CFGU=$DIR/Users/$user/openssl-$user.cnf
CERTPATH=$DIR/Users/$user
[ -d $DIR/Users ] || mkdir -p $DIR/Users/$user
if ! [ -f $CERTPATH/openssl-$user.cnf ]
then
  cat $CFG|\

sed "s/(commonName_default[ ]*=).*/&1 $user/g" |\

sed "s/emailAddress_default[ ]*=).*/&1 $Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo./g" >$CFGU

fi


openssl req -batch -config $CFGU \
 -new -nodes -keyout $CERTPATH/$user.key \
 -out $CERTPATH/$user.req -days $dates
openssl ca -batch -config $CFGU \
 -policy policy_anything -out $CERTPATH/$user.crt \
 -extensions xpclient_ext -extfile $DIR/xpextensions \
 -infiles $CERTPATH/$user.req
openssl x509 -in $CERTPATH/$user.crt -out $CERTPATH/$user.pem
openssl pkcs12 -export -nodes  -in $CERTPATH/$user.pem \
 -inkey $CERTPATH/$user.key \
 -certfile $DIR/CA/cacert.pem \
 -name "$user" \
 -out $CERTPATH/$user.p12 -clcerts
cp $DIR/CA/cacert.pem $CERTPATH
cp $DIR/root.der $CERTPATH
# fin

 

 

Cuando ejecutamos este script como

certificados.sh julia 365

debería crear un directorio /etc/raddb/certs/Users/julia que contiene todos los ficheros necesarios para la conexión. En Linux con wpa_supplicante deberemos utilizar julia.pem como certificado, julia.key como llave privada y cacert.pem como certificado de la CA. En sistemas win32 tendremos que usar julia.p12 como certificado que contiene también la llave privada y root.der que contiene el certificado de la CA. Con un doble click sobre ellos se pueden instalar.

Para revocar un certificado podemos ejecutar

openssl -revoke  /ruta/cert.pem

y regeneramos la lista de certificados revocados.

openssl ca -gencrl -config $SSLDIR/openssl.cnf -out $DIR/CA/crl/revoke.crl