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=admin@linuxito.com
        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=admin@linuxito.com
        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=admin@linuxito.com
        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=admin@linuxito.com
R       221114133737Z   130219172543Z   02      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client1/name=client1/emailAddress=admin@linuxito.com
R       221114133750Z   130219173037Z   03      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=admin@linuxito.com
R       221114133805Z   130219173040Z   04      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client3/name=client3/emailAddress=admin@linuxito.com
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=moe.szyslak@linuxito.com
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=drnick@linuxito.com
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=juantopo@linuxito.com
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=abarreda@linuxito.com
V       230609141834Z           0A      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/CN=cosme.fulanito/name=Cosme Fulanito/emailAddress=cosme.fulanito@linuxito.com

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=admin@linuxito.com
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=admin@linuxito.com

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=admin@linuxito.com
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=moe.szyslak@linuxito.com
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=juantopo@linuxito.com

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=admin@linuxito.com
R       221114133750Z   130219173037Z   03      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client2/name=client2/emailAddress=admin@linuxito.com
R       221114133805Z   130219173040Z   04      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/OU=Sistemas/CN=client3/name=client3/emailAddress=admin@linuxito.com
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=drnick@linuxito.com
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=abarreda@linuxito.com
R       230609141834Z   160318114436Z   0A      unknown /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Linuxito/CN=cosme.fulanito/name=Cosme Fulanito/emailAddress=cosme.fulanito@linuxito.com


Tal vez pueda interesarte


Compartí este artículo