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 $ 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 |