Luego de montar un servidor VPN con OpenVPN, y dejarlo corriendo durante algunos años, puede llegar el momento de necesitar dar de baja un usuario (revocar su certificado OpenSSL), o conocer la lista de usuarios habilitados (cuyo certificado es válido) y deshabilitados (cuyo certificado ha sido revocado). Cabe recordar que para simplificar la gestión de certificados OpenSSL, OpenVPN cuenta con un conjunto de scripts Bash dentro del directorio easy-rsa, los cuales son sumamente útiles y prácticos para aquellos administradores que no cuentan con suficiente experiencia o no están familiarizados con OpenSSL.
Tal como explica el artículo Mantenimiento de la CA de OpenVPN utilizando "easy-rsa", el directorio /etc/openvpn/easy-rsa/
contiene un conjunto de scripts útiles para gestionar los certificados para la VPN de forma simple:
root@vpnsrv:~# cd /etc/openvpn/easy-rsa/ root@vpnsrv:/etc/openvpn/easy-rsa# ll total 108 -rwxr-xr-x 1 root root 121 Mar 31 2010 build-ca -rwxr-xr-x 1 root root 354 Mar 31 2010 build-dh -rwxr-xr-x 1 root root 190 Mar 31 2010 build-inter -rwxr-xr-x 1 root root 165 Mar 31 2010 build-key -rwxr-xr-x 1 root root 159 Mar 31 2010 build-key-pass -rwxr-xr-x 1 root root 251 Mar 31 2010 build-key-pkcs12 -rwxr-xr-x 1 root root 270 Mar 31 2010 build-key-server -rwxr-xr-x 1 root root 215 Mar 31 2010 build-req -rwxr-xr-x 1 root root 160 Mar 31 2010 build-req-pass -rwxr-xr-x 1 root root 430 Mar 31 2010 clean-all -rwxr-xr-x 1 root root 1459 Mar 31 2010 inherit-inter drwx------ 2 root root 4096 Jun 11 2013 keys -rwxr-xr-x 1 root root 297 Mar 31 2010 list-crl -rw-r--r-- 1 root root 389 Mar 31 2010 Makefile -rw-r--r-- 1 root root 2976 Mar 31 2010 openssl-0.9.6.cnf.gz -rw-r--r-- 1 root root 8328 Mar 31 2010 openssl.cnf -rwxr-xr-x 1 root root 12504 Apr 28 2010 pkitool -rw-r--r-- 1 root root 3745 Mar 31 2010 README.gz -rwxr-xr-x 1 root root 920 Mar 31 2010 revoke-full -rwxr-xr-x 1 root root 180 Mar 31 2010 sign-req -rw-r--r-- 1 root root 1675 Nov 16 2012 vars -rwxr-xr-x 1 root root 190 Mar 31 2010 whichopensslcnf
Dentro del mismo, existe un directorio keys
, el cual contiene todos los certificados emitidos (junto con sus claves privadas), el índice de certificados, y la CRL (Certificate Revocation List) en formato PEM (crl.pem
).
root@vpnsrv:/etc/openvpn/easy-rsa# ll keys/crl.pem -rw-r--r-- 1 root root 617 Feb 19 2013 crl.pem
Es posible consultar la lista de certificados revocados ejecutando el siguiente comando:
root@vpnsrv:/etc/openvpn/easy-rsa# openssl crl -inform PEM -text -noout -in keys/crl.pem Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=adminvpnca/name=ca/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. Last Update: Feb 19 17:30:41 2013 GMT Next Update: Mar 21 17:30:41 2013 GMT Revoked Certificates: Serial Number: 02 Revocation Date: Feb 19 17:25:43 2013 GMT Serial Number: 03 Revocation Date: Feb 19 17:30:37 2013 GMT Serial Number: 04 Revocation Date: Feb 19 17:30:40 2013 GMT Signature Algorithm: md5WithRSAEncryption 59:73:ab:b1:c9:66:91:1f:33:34:7a:09:e8:ff:6b:1a:51:47: 6b:55:f9:15:9d:0c:1c:c7:e0:e9:ab:b8:9b:3a:76:f2:96:90: 6b:8b:45:2f:b6:d2:2d:26:30:d8:ff:21:f8:25:3f:3c:0d:b1: fc:27:d7:a9:37:06:22:0f:25:0f:4a:eb:e5:fb:8e:81:ea:cd: aa:63:15:27:9e:aa:a7:dd:2a:c5:35:d6:bd:fb:93:74:96:53: 60:1d:49:01:61:d2:6f:c9:20:f1:ae:84:a6:6c:f4:d2:aa:49: b4:dd:09:f1:b6:a8:49:c0:91:8c:6b:c5:e7:37:ec:5b:f1:7b: d4:48
Tal como se observa debajo de la línea "Revoked Certificates", la lista de certificados revocados es 02, 03 y 04. El inconveniente con esta CRL, es que la información firmada digitalmente incluye sólo el número de serie del certificado y la fecha en que fue revocado. Aunque es posible identificar cada certificado a partir de su número de serie consultando al índice.
Si se necesita revocar un certificado, sólo hace falta conocer su nombre base (el cual coincide con su CN). Primero, es necesario cargar las variables de entorno de easy-rsa:
root@vpnsrv:/etc/openvpn/easy-rsa# source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
Luego, revocar el certificado utilizando el script revoke-full
:
root@vpnsrv:/etc/openvpn/easy-rsa# ./revoke-full troy.mcclure Using configuration from /etc/openvpn/easy-rsa/openssl.cnf Revoking Certificate 08. Data Base Updated Using configuration from /etc/openvpn/easy-rsa/openssl.cnf troy.mcclure.crt: /C=AR/ST=Buenos Aires/L=Buenos Aires/O=Linuxito.com/OU=Sistemas/CN=troy.mcclure/name=Troy McClure/emailAddress=troy.mcclure@linuxito error 23 at 0 depth lookup:certificate revoked
Luego es posible verificar la CRL (notar que el certificado posee el número de serie 08):
root@vpnsrv:/etc/openvpn/easy-rsa# openssl crl -inform PEM -text -noout -in keys/crl.pem Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=adminvpnca/name=ca/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. Last Update: Mar 18 11:37:39 2016 GMT Next Update: Apr 17 11:37:39 2016 GMT Revoked Certificates: Serial Number: 02 Revocation Date: Feb 19 17:25:43 2013 GMT Serial Number: 03 Revocation Date: Feb 19 17:30:37 2013 GMT Serial Number: 04 Revocation Date: Feb 19 17:30:40 2013 GMT Serial Number: 08 Revocation Date: Mar 18 11:37:39 2016 GMT Signature Algorithm: md5WithRSAEncryption 19:d4:09:e3:f7:9f:36:f0:8d:c8:47:d5:4e:8d:64:c8:cc:db: a8:1d:85:21:5e:7f:ad:89:dc:d5:a9:94:26:ea:6e:c3:00:31: 18:6d:b5:df:61:6d:3e:c8:86:49:af:ba:79:85:00:fe:0a:c8: 67:55:34:e6:9f:e2:f7:d1:11:ee:bc:7c:e3:8e:86:2d:76:f8: 40:7c:1f:d0:32:d7:b7:85:d9:f5:4f:ba:42:9b:aa:2e:8b:11: d7:e3:90:5c:f1:96:b3:6a:59:03:40:1e:b5:18:75:b8:a5:23: 48:fc:6d:88:da:d1:99:b0:02:0b:48:a9:f3:a6:65:71:cc:41: 57:5a
Claro que easy-rsa posee un script para dicho propósito:
root@vpnsrv:/etc/openvpn/easy-rsa# ./list-crl Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=adminvpnca/name=ca/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. Last Update: Mar 18 11:37:39 2016 GMT Next Update: Apr 17 11:37:39 2016 GMT Revoked Certificates: Serial Number: 02 Revocation Date: Feb 19 17:25:43 2013 GMT Serial Number: 03 Revocation Date: Feb 19 17:30:37 2013 GMT Serial Number: 04 Revocation Date: Feb 19 17:30:40 2013 GMT Serial Number: 08 Revocation Date: Mar 18 11:37:39 2016 GMT Signature Algorithm: md5WithRSAEncryption 19:d4:09:e3:f7:9f:36:f0:8d:c8:47:d5:4e:8d:64:c8:cc:db: a8:1d:85:21:5e:7f:ad:89:dc:d5:a9:94:26:ea:6e:c3:00:31: 18:6d:b5:df:61:6d:3e:c8:86:49:af:ba:79:85:00:fe:0a:c8: 67:55:34:e6:9f:e2:f7:d1:11:ee:bc:7c:e3:8e:86:2d:76:f8: 40:7c:1f:d0:32:d7:b7:85:d9:f5:4f:ba:42:9b:aa:2e:8b:11: d7:e3:90:5c:f1:96:b3:6a:59:03:40:1e:b5:18:75:b8:a5:23: 48:fc:6d:88:da:d1:99:b0:02:0b:48:a9:f3:a6:65:71:cc:41: 57:5a
Si se consulta el índice (index.txt
), es posible relacionar cada CN con su número de serie:
root@vpnsrv:/etc/openvpn/easy-rsa# cat keys/index.txt V 221114133716Z 01 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=server/name=server/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 221114133737Z 130219172543Z 02 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client1/name=client1/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 221114133750Z 130219173037Z 03 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 221114133805Z 130219173040Z 04 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client3/name=client3/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230217155323Z 05 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=moe.szyslak/name=Moe Szyslak/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230217155357Z 06 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=dr.nick/name=Doctor Nick/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230217155428Z 07 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=juan.topo/name=Juan Topo/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 230320163305Z 160318113739Z 08 unknown /C=AR/ST=Buenos Aires/L=Buenos Aires/O=Linuxito.com/OU=Sistemas/CN=troy.mcclure/name=Troy McClure/emailAddress=troy.mcclure@linuxito V 230515152257Z 09 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=F\xC3\xADsica/CN=armando.barreda/name=Armando Barreda/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230609141834Z 0A unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/CN=cosme.fulanito/name=Cosme Fulanito/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Por ejemplo, el número de serie 03 corresponde con el certificado cuyo CN es "client2" (client2.crt
). Notar además, que al emitir cada certificado, easy-rsa genera una copia en formato PEM (certificado junto con su clave privada) cuyo nombre base coincide con el número de serie:
root@vpnsrv:/etc/openvpn/easy-rsa# openssl x509 -subject -noout -in keys/03.pem subject= /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. root@vpnsrv:/etc/openvpn/easy-rsa# openssl x509 -subject -noout -in keys/client2.crt subject= /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
La primera columna indica si el certificado es válido (V) o ha sido revocado (R). Por ende, si se necesita listar sólo los certificados válidos, ejecutar:
root@vpnsrv:/etc/openvpn/easy-rsa# cat keys/index.txt | grep "^V" V 221114133716Z 01 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=server/name=server/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230217155323Z 05 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=moe.szyslak/name=Moe Szyslak/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. V 230217155428Z 07 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=juan.topo/name=Juan Topo/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Lo mismo para listar sólo los revocados:
root@vpnsrv:/etc/openvpn/easy-rsa# cat keys/index.txt | grep "^R" R 221114133737Z 130219172543Z 02 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client1/name=client1/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 221114133750Z 130219173037Z 03 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 221114133805Z 130219173040Z 04 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client3/name=client3/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 230217155357Z 160318114512Z 06 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=dr.nick/name=Doctor Nick/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 230320163305Z 160318113739Z 08 unknown /C=AR/ST=Buenos Aires/L=Buenos Aires/O=Linuxito.com/OU=Sistemas/CN=troy.mcclure/name=Troy McClure/emailAddress=troy.mcclure@linuxito R 230515152257Z 160318114426Z 09 unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=F\xC3\xADsica/CN=armando.barreda/name=Armando Barreda/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. R 230609141834Z 160318114436Z 0A unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/CN=cosme.fulanito/name=Cosme Fulanito/emailAddress=Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.
Fuente: linuxito