Mantenimiento de la CA de OpenVPN utilizando "easy-rsa"

El artículo Instalación y configuración de OpenVPN explicar en detalle la instalación y configuración de OpenVPN, lo cual incluye la generación de los certificados y la autoridad certificante (CA) para que los clientes puedan acceder de forma segura a la red privada virtual (VPN) utilizando openssl.

Un tema que había quedado pendiente es la posterior administración de la CA (crear, renovar y revocar certificados) utilizando los scripts "easy-rsa" incluídos en el paquete openvpn.

OpenVPN incluye una serie de scripts bash dentro del directorio "easy-rsa" para administrar la Autoridad Certificante de forma simple. Una gran ayuda para aquellos que no estén familiarizados con openssl y sus comandos básicos.



Crear un nuevo certificado cliente

Para crear un nuevo certificado cliente, por ejemplo "juan.perez", ejecutar en el servidor:

# cd /etc/openvpn/easy-rsa
# . ./vars
# ./build-key juan.perez
Generating a 1024 bit RSA private key                                               
...................++++++                                                           
......++++++                                                                        
writing new private key to 'juan.perez.key'                                    
-----                                                                               
You are about to be asked to enter information that will be incorporated            
into your certificate request.                                                      
What you are about to enter is what is called a Distinguished Name or a DN.         
There are quite a few fields but you can leave some blank                           
For some fields there will be a default value,                                      
If you enter '.', the field will be left blank.                                     
-----                                                                               
Country Name (2 letter code) [AR]:AR                                                
State or Province Name (full name) [Buenos Aires]:                                  
Locality Name (eg, city) [Bahía Blanca]:                                            
Organization Name (eg, company) [Pepe S.A.]:                                              
Organizational Unit Name (eg, section) []:Sistemas                                  
Common Name (eg, your name or your server's hostname) [juan.perez]:            
Name []:Juan Perez                                                             
Email Address [it@pepe.org.ar]:juan.perez@pepe.org.ar                            

Please enter the following 'extra' attributes
to be sent with your certificate request     
A challenge password []:                     
An optional company name []:                 
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature              
Signature ok                                              
The Subject's Distinguished Name is as follows            
countryName           :PRINTABLE:'AR'                     
stateOrProvinceName   :PRINTABLE:'Buenos Aires'           
localityName          :T61STRING:'Bah\0xFFFFFFC3\0xFFFFFFADa Blanca'
organizationName      :PRINTABLE:'Pepe S.A.'                              
organizationalUnitName:PRINTABLE:'Sistemas'                         
commonName            :PRINTABLE:'juan.perez'                  
name                  :PRINTABLE:'Juan Perez'                  
emailAddress          :IA5STRING:'juan.perez@pepe.org.ar'       
Certificate is to be certified until Feb 17 15:53:23 2023 GMT (3650 days)
Sign the certificate? [y/n]:y                                            


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries                    
Data Base Updated

Se deben completar correctamente los campos que necesita openssl para crear el certificado. Luego se deben enviar al cliente los siguientes archivos:

  • Certificado de la CA (ca.crt)
  • Certificado del cliente
  • Clave privada del cliente
  • Archivo de configuración del cliente OpenVPN (client.conf)

Nota: La instalación de estos archivos se encuentra detallada en el artículo Instalación y configuración de OpenVPN

De acuerdo a la personalización que se realizó sobre el archivo de configuración "client.conf" (el cual se instala en los clientes) en el artículo anteriormente mencionado, el certificado del cliente debe nombrarse client.crt y su clave privada client.key.

Es posible comprimir los archivos en formato zip o tar y enviarlos utilizando FTP, scp o un medio removible. Por seguridad no se debe enviar por correo electrónico ni cualquier otro medio no encriptado.

Revocar un certificado cliente

Para revocar un certificado cliente, ejecutar en el servidor:

# cd /etc/openvpn/easy-rsa
. ./vars
# ./revoke-full prueba01
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Revoking Certificate 02.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
prueba01.crt: /C=AR/ST=Buenos Aires/L=Bah\xC3\xADa Blanca/O=Pepe S.A./OU=Sistemas/CN=prueba01/name=prueba01/emailAddress=prueba01@pepe.org.ar
error 23 at 0 depth lookup:certificate revoked

Renovar un certificado

Según la configuración por defecto de OpenVPN, los certificados son válidos por diez años. Debido a que en la tierra donde moran los sysadmins las cosas cambian muy a menudo, tal vez nunca sea necesario renovar un certificado. Es más probable que ocurra una migración del servidor de VPN, una o varias reigenierías de redes y otra cantidad de eventos poco predecibles antes de que pasen diez años. Además, teniendo en cuenta la gran rotación de recursos humanos en el sector IT (por lo menos aquí en Argentina), tal vez sea problema del próximo sysadmin...

Pero hombre vamos, no por estos motivos que acabo de enumerar vamos a dejar de aprender cómo se debe realizar una tarea! Nunca sabemos cuando lo vamos a necesitar. Veamos entonces como se renueva un certificado.

Primero algunos conceptos teóricos. Para renovar un certificado es necesario crear un nuevo pedido de certificado (.csr) pero utilizando el par de claves existente (en lugar de crear un nuevo par, como lo hace el script "build-key"). El directorio "easy-rsa" no incluye un script para renovar certificados, por lo tanto si es necesario renovar un certificado habrá que hacerlo directamente con openssl.

Suponiendo que es necesario renovar el certificado de Pepe, cuyo common name (CN) es "pepe.botella", se debe ejecutar:

# cd /etc/openvpn/easy-rsa/keys
# openssl req -new -key pepe.botella.key -out pepe.botella.csr

Con esto se crea un nuevo pedido de certificado "pepe.botella.csr", el cual puede ser firmado por la CA para obtener el nuevo certificado "pepe.botella.crt" utilizando el script "sign-req":

# cd /etc/openvpn/easy-rsa
# sign-req pepe.botella

Con eso el certificado ha sido renovado por diez años más.

Configurar un cliente GNU/Linux

El artículo Instalación y configuración de OpenVPN explica como configurar clientes Windows, por lo tanto aquí presento cómo configurar un cliente CentOS. Suponiendo que OpenVPN se encuentra instalado, habiendo ejecutado el comando yum install openvpn (es necesario contar con el repositorio RPMforge),

Luego de enviar al cliente los archivos anteriormente mencionados, se deben descomprimir en el directorio /etc/openvpn:

# ll /etc/openvpn/
total 24                            
-rw-r--r-- 1 root root 1346 Feb 19 12:41 ca.crt
-rw-r--r-- 1 root root 3430 Feb 19 12:41 client.conf
-rw-r--r-- 1 root root 4046 Feb 19 12:41 client.crt 
-rw------- 1 root root  887 Feb 19 12:41 client.key 
-rw-r--r-- 1 root root 5636 Feb 19 12:41 juan.perez.tar

Luego se debe iniciar el servicio openvpn:

# service openvpn start
Starting openvpn:                                          [  OK  ]

Opcionalmente se puede configurar el servicio para que inicie automáticamente:

# chkconfig openvpn on

Luego de iniciar el servicio se puede verificar la conexión con la VPN:

# ifconfig tun0
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.8  P-t-P:10.8.0.17  Mask:255.255.255.255       
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1                 
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                         
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                       
          collisions:0 txqueuelen:100                                                
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)                                     

# ping 10.9.0.3
PING 10.9.0.3 (10.9.0.3) 56(84) bytes of data.
64 bytes from 10.9.0.3: icmp_seq=2 ttl=254 time=1.75 ms
64 bytes from 10.9.0.3: icmp_seq=3 ttl=254 time=1.72 ms
^C
--- 10.9.0.3 ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2976ms
rtt min/avg/max/mdev = 1.729/1.741/1.754/0.043 ms



 

Suscribirse

    Registrate para recibir las novedades y artículos por correo electrónico.

Linuxito en G+