Introducción
Este artículo ofrece una visión detallada sobre la gestión de certificados digitales, esencial para la seguridad en redes privadas virtuales (VPN) utilizando OpenVPN. Exploraremos desde los conceptos fundamentales, como Infraestructura de Clave Pública (PKI) y Autoridad Certificadora (CA), hasta la práctica de emisión, firma, renovación, revocación y administración de certificados con Easy-RSA.
Este es uno de los dos artículos que explican cómo configurar una conexión OpenVPN entre un servidor y múltiples clientes y cómo gestionar los certificados necesarios para garantizar la seguridad de las conexiones.
Para detalles específicos sobre la configuración de OpenVPN, consulte:
Terminología utilizada
Para comprender la gestión de certificados, es fundamental conocer algunos términos que frecuentemente aparecen en sus formas abreviadas.
¿Qué es PKI?
PKI, sigla para Infraestructura de Clave Pública, es un conjunto de tecnologías, políticas y procedimientos destinados a la creación, gestión, distribución, almacenamiento y revocación de certificados digitales y claves públicas.
Sirve como base para la seguridad de las comunicaciones digitales, garantizando autenticidad, integridad y confidencialidad de datos en sistemas como correos electrónicos, transacciones en línea y VPNs.
¿Qué es CA?
CA, sigla para Autoridad Certificadora, es la entidad responsable de emitir, firmar y gestionar certificados digitales dentro de una PKI. Su papel es verificar la identidad de personas, servidores, organizaciones y otras entidades en el entorno digital.
Algunas de las CAs más utilizadas incluyen DigiCert, GoDaddy y Let's Encrypt, que emiten certificados reconocidos globalmente.
Es posible utilizar servicios en la web para emitir certificados y configurarlos en aplicaciones como alojamiento de sitios web o conexiones VPN. Sin embargo, la mayoría de estos certificados son de pago, lo que puede hacerlos inviables en muchos casos.
Afortunadamente, es posible crear una CA propia y gestionar certificados dentro de una estructura controlada.
¿Qué es la request?
Una solicitud, un pedido de firma de certificado, es decir, una solicitud enviada a una CA para que sea firmada y transformada en certificado. El término CSR (Solicitud de Firma de Certificado), también es utilizado para referirse a este proceso. La solicitud incluye la clave pública.
¿Qué es cert?
Cert es la abreviatura de certificado digital, un archivo que vincula una clave pública a una identidad, sirviendo como credencial en el proceso de autenticación entre dispositivos en la red. El certificado es generado cuando una solicitud (CSR) es firmada por una CA, garantizando que sus informaciones son válidas y confiables.
¿Qué es keypair?
Keypair (par de claves, en español) es un conjunto compuesto por una clave pública y una clave privada, utilizado para autenticación, cifrado y verificación de integridad en sistemas de seguridad. Este par de claves es la base para la generación de certificados digitales.
Clave Pública (Public Key): compartida abiertamente con otros sistemas, es usada para cifrar datos o verificar firmas digitales.
Clave Privada (Private Key): debe ser mantenida en secreto y almacenada con seguridad. Es utilizada para descifrar datos recibidos o firmar digitalmente documentos y transacciones, garantizando la autenticidad de la entidad propietaria.
¿Cómo funciona el keypair?
Si alguien desea enviar un mensaje cifrado para ti, utilizará tu clave pública para cifrar-lo. Solo tú, con tu clave privada, podrás descifrar y leer el mensaje.
Al firmar un documento o certificado, usas tu clave privada. Cualquier persona con tu clave pública puede verificar la autenticidad de la firma, garantizando que fuiste realmente tú quien firmó.
Formato PEM
Las claves, certificados y solicitudes son almacenados en archivos en formato PEM (Correo con privacidad mejorada). Este formato utiliza codificación Base64 para representar datos cifrados.
No siempre la extensión .pem estará presente, pues archivos con extensiones como .key, .crt y .csr también utilizan el formato PEM.
Autoridad Certificadora - CA
La CA es la parte central de una PKI y también el elemento más crítico en términos de seguridad. Su clave privada es responsable de firmar todos los certificados emitidos. Si el acceso a la CA es comprometido, un invasor podrá firmar y revocar certificados, poniendo todo el sistema en riesgo.
Por ese motivo, se recomienda configurar la PKI de la CA de forma segura. No es aconsejable administrarla junto con clientes o servidores VPN. Dependiendo de las necesidades de seguridad, la CA puede ser mantenida en una cuenta altamente restringida, en un sistema dedicado (virtualizado, pero aislado de la VPN), en un sistema offline o incluso en un medio removible, como una memoria USB, disco duro externo o tarjeta inteligente.
Al crear una nueva CA, un par de claves (pública y privada) es generado, junto con la estructura de archivos necesaria para soportar la firma de certificados.
Cómo todo se encaja
Para crear una PKI, se inicia configurando una CA, que será responsable por los certificados. Durante esa configuración, un par de claves es generado: la clave privada es almacenada en un archivo con extensión .key, mientras que la clave pública es incluida en el certificado, un archivo con extensión .crt.
El siguiente paso es generar el par de claves para el servidor. Así como en la CA, la clave privada es almacenada en un archivo .key, mientras que la clave pública es embutida en un archivo de solicitud .req. Esta solicitud debe ser firmada por la CA para convertirse en un certificado válido .crt, que contendrá las informaciones de la clave pública.
El mismo proceso es realizado para el cliente: se genera un par de claves, y la CA firma la solicitud para generar el certificado.
El par de claves, tanto del cliente como del servidor, puede ser generado directamente por la CA o localmente en el propio servidor/cliente, enviando solo la solicitud para la CA firmar. El segundo método es preferible, pues la clave privada nunca sale del lugar donde será utilizada.
Las solicitudes de certificado (.req) no contienen informaciones sensibles y pueden ser transferidas por cualquier medio conveniente. Ya los certificados firmados (.crt) no necesitan ser protegidos con el mismo rigor que las claves privadas, pero pueden incluir identificadores específicos explotables por atacantes. Para evitar riesgos, es recomendable transferirlos por métodos seguros.
En caso de que el par de claves sea generado en la CA, la clave privada (.key) necesitará ser transmitida de forma segura al servidor o cliente. Este proceso es crítico y, siempre que sea posible, debe ser hecho por medio de medio físico (disco duro externo, memoria USB) para evitar interceptaciones. Alternativamente, la transferencia puede ser realizada via SSH (scp, sftp) o HTTPS, que son considerados métodos seguros.
El servidor deberá almacenar:
- Su clave privada
- Su certificado
- El certificado de la CA
- Clave TLS
- Parámetros Diffie-Hellman (DH)
El cliente deberá almacenar:
- Su clave privada
- Su certificado
- El certificado de la CA
- Clave TLS
Conectando servidor y cliente
Dos sistemas que posean certificados firmados por la misma CA, además del certificado de la propia CA, pueden comunicarse sin nunca haber intercambiado informaciones de seguridad directamente.
Durante el handshake TLS, cada sistema presenta su certificado, y el otro lado verifica su validez comparándolo con su copia del certificado de la CA. Como ambos confían en la misma CA, los certificados son validados y la conexión es autenticada.
Cada sistema comprueba la validez de su certificado firmando un conjunto de datos con su clave privada. Como solo el titular de la clave privada puede realizar esa firma, su seguridad debe ser garantizada. Este proceso confirma la autenticidad de los certificados y permite el establecimiento seguro de la conexión.
Easy-RSA - Introducción
Ahora es hora de partir para la práctica, configurando su PKI, su CA y generando los certificados necesarios. Para eso, utilizaremos Easy-RSA.
Easy-RSA es un script utilizado para gestionar certificados digitales dentro de una Infraestructura de Clave Pública (PKI). Es ampliamente empleado en conjunto con OpenVPN para crear y administrar certificados SSL/TLS esenciales para la configuración de una VPN segura.
Diseñado para ser intuitivo, Easy-RSA simplifica la administración de certificados, incluso para aquellos sin conocimiento avanzado en criptografía. Automatiza gran parte de los procesos involucrados en la gestión de una PKI, convirtiéndose en una herramienta valiosa para administradores de red.
Descargar Easy-RSA
La CA necesita ser mantenida segura. Entre los métodos mencionados anteriormente, será utilizado una memoria USB para crear la PKI de la CA. Así, después de la configuración, basta con remover el dispositivo y almacenarlo en un lugar protegido para garantizar la seguridad de las claves privadas.
En este ejemplo, asumiremos que la memoria USB está montada en /mnt/usb. Easy-RSA debe ser configurado con un usuario común, sin permisos de administrador.
La instalación de Easy-RSA es simple e idéntica en cualquier sistema Linux. Para descargarlo, acceda al directorio de la memoria USB y ejecute:
$ bash
cd /mnt/usb git clone https://github.com/OpenVPN/easy-rsa
El comando anterior descargará la versión más reciente disponible en el repositorio oficial de Easy-RSA en GitHub, que, en el momento de este artículo, es la 3.3.0.
Si prefiere descargar una versión específica, use:
git clone --branch v3.2.2 https://github.com/OpenVPN/easy-rsa
El comando anterior descargará la versión 3.2.2 de Easy-RSA.
Configurando EasyRSA
El directorio base de EasyRSA está en easy-rsa/easyrsa3/.
Antes de iniciar, es recomendado ajustar algunas variables utilizadas en los scripts para garantizar la consistencia de los datos durante la generación de los certificados. Para eso, copie el archivo de ejemplo vars.example para vars:
$ bash
cd /mnt/usb/easy-rsa/easyrsa3/ cp vars.example vars vi vars
Ahora, edite el archivo vars con su editor de texto preferido. Remueva los comentarios de las líneas abajo y personalice con sus informaciones:
/mnt/usb/easy-rsa/easyrsa3/vars
# Campos organizacionales set_var EASYRSA_REQ_COUNTRY "MX" # País set_var EASYRSA_REQ_PROVINCE "Jalisco" # Estado set_var EASYRSA_REQ_CITY "Guadalajara" # Ciudad set_var EASYRSA_REQ_ORG "Mi empresa" # Nombre de la organización set_var EASYRSA_REQ_EMAIL "contacto@miempresa.com" # Correo electrónico set_var EASYRSA_REQ_OU "Departamento de TI" # Unidad Organizacional # Expiración (en días) set_var EASYRSA_CA_EXPIRE 7300 # Validez de la CA set_var EASYRSA_CERT_EXPIRE 3650 # Validez de los certificados emitidos
Los primeros parámetros configurados en el archivo vars son los campos organizacionales, que serán incorporados a todos los certificados generados. Estas informaciones identifican la entidad que utiliza el certificado y proporcionan detalles de contacto.
El valor de EASYRSA_REQ_COUNTRY debe seguir la convención de dos caracteres definida por ISO 3166-1 alpha-2.
El segundo conjunto de variables define el tiempo de expiración del certificado de la CA y de los certificados emitidos para clientes y servidores VPN. El tiempo es especificado en días. Para la CA, se recomienda un período largo, posiblemente mayor que el padrón de 10 años (3.650 días), como 20 años (7.300 días). Esto porque, cuando el certificado de la CA expira, todos los certificados que ella firmó se vuelven inválidos, y su renovación exige distribuir el nuevo certificado de la CA para todos los clientes y servidores de la VPN.
Ya para los certificados de los clientes y del servidor, puede adoptarse un período un poco menor. Sin embargo, un plazo largo, como 10 años, puede ser adecuado. Si es necesario, cualquier certificado puede ser revocado manualmente en cualquier momento, este proceso será abordado más adelante.
Mantener un mecanismo de revocación bien estructurado puede ser más eficiente que lidiar con expiraciones automáticas.
Las demás variables del archivo vars deben ser modificadas solo por quien comprende su propósito y no serán abordadas en este artículo.
Creando la PKI
Para configurar una nueva Infraestructura de Claves Públicas (PKI) con Easy-RSA, utilice el comando ./easyrsa init-pki. Si necesita ayuda sobre los parámetros disponibles, ejecute ./easyrsa help [comando].
$ bash
# Acceda al directorio de EasyRSA cd /mnt/usb/easy-rsa/easyrsa3/ # Inicie la PKI ./easyrsa init-pki Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Notice ------ 'init-pki' complete; you may now create a CA or requests. Your newly created PKI dir is: * /mnt/usb/easy-rsa/easyrsa3/pki Using Easy-RSA configuration: * /mnt/usb/easy-rsa/easyrsa3/vars
Este comando crea un directorio llamado pki/, que contiene la estructura necesaria para almacenar y gestionar solicitudes, claves privadas y certificados.
El siguiente paso es crear la Autoridad Certificadora (CA).
Creando su propia CA
Durante la creación de la clave privada de la CA, algunas informaciones serán solicitadas:
Contraseña para la creación de la clave
Una contraseña será utilizada para cifrar el archivo de la clave privada. Esto garantiza que, incluso si alguien obtiene acceso al archivo, no podrá utilizarlo sin la contraseña correcta. Guarde esta contraseña con seguridad, pues será necesaria siempre que sea firmar una solicitud.
Common Name (CN)
Identifica la Autoridad Certificadora y es utilizado solo para exhibición. En este ejemplo, usaremos el nombre del sitio Telazul, ajuste conforme su aplicación.
Creando la CA con Easy-RSA
Para crear su propia CA, ejecute el siguiente comando:
$ bash
# Acceda al directorio de EasyRSA cd /mnt/usb/easy-rsa/easyrsa3/ # Cree la CA ./easyrsa build-ca Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Enter New CA Key Passphrase: # Ingrese la contraseña Confirm New CA Key Passphrase: # Confirme la contraseña ...............................................................................................................................+++++ ...............................................................+++++ 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. ----- Common Name (eg: your user, host, or server name) [Easy-RSA CA]: Telazul # Nombre de la CA Notice ------ CA creation complete. Your new CA certificate is at: * /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt Create an OpenVPN TLS-AUTH|TLS-CRYPT-V1 key now: See 'help gen-tls' Build-ca completed successfully.
Su Autoridad Certificadora fue generada con éxito.
Próximos pasos
El siguiente paso será generar la clave TLS y los parámetros Diffie-Hellman (DH). Ambos protegen la negociación de la conexión VPN, pero de formas distintas:
- TLS-AUTH/TLS-CRYPT: Protege la integridad y el sigilo de la comunicación.
- DH (Diffie-Hellman): Protege el intercambio de claves criptográficas.
Generando la clave TLS
La clave TLS-Crypt es utilizada para proteger la comunicación de OpenVPN, impidiendo que paquetes falsificados sean aceptados, dificultando ataques DoS y ofuscando el handshake TLS, haciendo que la detección de la VPN sea más difícil por terceros. Para generar la clave, ejecute:
$ bash
./easyrsa gen-tls-crypt-key
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Notice
------
TLS-CRYPT Key generated at:
* /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key
If this file is changed then it MUST be redistributed to ALL servers
AND clients, to be in effect. Do NOT change this existing file.
Esta clave impide que terceros interfieran en la comunicación o detecten que la VPN está en operación.
Generando parámetros Diffie-Hellman (DH)
El protocolo Diffie-Hellman (DH) permite que dos participantes establezcan un secreto compartido sobre un canal inseguro sin transmitir directamente la clave secreta, garantizando mayor seguridad en el intercambio de claves. Para generar los parámetros DH, ejecute:
$ bash
./easyrsa gen-dh
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............+.....................
........................++*++*++*++*
DH parameters appear to be ok.
Notice
------
DH parameters of size 2048 created at:
* /mnt/usb/easy-rsa/easyrsa3/pki/dh.pem
El uso de Diffie-Hellman permite que OpenVPN establezca un secreto compartido sin exponer directamente la clave, protegiendo la confidencialidad de la comunicación.
Explorando la PKI
Los comandos anteriores crearon la estructura básica de la PKI. Vamos a examinarla:
$ bash
tree pki/ pki/ ├── ca.crt ├── certs_by_serial ├── dh.pem ├── index.txt ├── issued ├── private │ ├── ca.key │ └── easyrsa-tls.key ├── reqs ├── revoked │ ├── certs_by_serial │ └── private_by_serial ├── serial
- ca.crt ➔ Certificado de la CA.
- certs_by_serial ➔ Directorio conteniendo certificados firmados por la CA, organizados por número de serie.
- dh.pem ➔ Parámetros Diffie-Hellman (DH).
- index.txt ➔ Base de datos con el registro de los certificados emitidos.
- issued ➔ Directorio conteniendo los certificados firmados por la CA, organizados por nombre común (CN).
- private ➔ Directorio donde las claves privadas son almacenadas.
- private/ca.key ➔ Clave privada de la CA.
- private/easyrsa-tls.key ➔ Clave privada TLS.
- reqs ➔ Local para almacenamiento de solicitudes de certificado.
- revoked ➔ Directorio conteniendo certificados y claves revocados.
- serial ➔ Archivo que almacena el número de serie del próximo certificado a ser emitido.
Con esta estructura, la CA está lista para generar solicitudes, crear claves y firmar certificados. El siguiente paso será crear los archivos necesarios para el servidor y los clientes de OpenVPN.
Ambiente ficticio
Para ilustrar los próximos ejemplos, consideremos un escenario ficticio en que empleados de una oficina trabajan remotamente y necesitan conectarse a la red de la empresa para desempeñar sus funciones.
En ese contexto, el servidor OpenVPN será instalado en la oficina, mientras que los clientes VPN serán configurados en los dispositivos de los empleados en sus residencias.
Generando el par de claves del servidor
Para generar las claves del servidor, utilice el comando ./easyrsa gen-req [nombre-del-servidor]. En este ejemplo, añadimos el parámetro nopass, que desactiva el uso de contraseña en la creación de la clave privada.
El uso de contraseña es recomendado, pero puede ser inconveniente en servidores remotos o sin acceso fácil a un teclado, pues exigirá su digitación en cada inicialización del servicio. Como la clave sin contraseña no es cifrada, es esencial restringir su acceso con permisos adecuados, tema abordado en el artículo sobre la configuración del servidor OpenVPN citado en la introducción.
$ bash
./easyrsa gen-req oficina nopass Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Generating a RSA private key ...........................+++++ .....................................................+++++ writing new private key to '/mnt/usb/easy-rsa/easyrsa3/pki/3c601300/temp.2.1' ----- 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. ----- Common Name (eg: your user, host, or server name) [oficina]: Enter ↲ # Confirme Notice ------ Private-Key and Public-Certificate-Request files created. Your files are: * req: /mnt/usb/easy-rsa/easyrsa3/pki/reqs/oficina.req * key: /mnt/usb/easy-rsa/easyrsa3/pki/private/oficina.key
Ahora, el par de claves del servidor está listo. El siguiente paso es firmar la solicitud de certificado (CSR) generada.
Firmando la solicitud del servidor
Para firmar la solicitud del servidor, utilice el comando ./easyrsa sign-req server [nombre-del-servidor]. Durante el proceso, confirme los detalles digitando yes cuando sea solicitado, luego, ingrese la contraseña de la clave privada de la CA, generada en el comando build-ca.
$ bash
./easyrsa sign-req server oficina Using Easy-RSA 'vars' configuration: * /mnt/usb/easy-rsa/easyrsa3/vars Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. You are about to sign the following certificate: Requested CN: 'oficina' Requested type: 'server' Valid for: '3650' days subject= commonName = oficina Type the word 'yes' to continue, or any other input to abort. Confirm requested details: yes # Confirme Using configuration from /mnt/usb/easy-rsa/easyrsa3/pki/80bec09b/temp.1.1 Enter pass phrase for /mnt/usb/easy-rsa/easyrsa3/pki/private/ca.key: # Contraseña de la CA Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'oficina' Certificate is to be certified until Feb 23 18:09:06 2035 GMT (3650 days) Write out database with 1 new entries Data Base Updated Notice ------ Inline file created: * /mnt/usb/easy-rsa/easyrsa3/pki/inline/private/oficina.inline Notice ------ Certificate created at: * /mnt/usb/easy-rsa/easyrsa3/pki/issued/oficina.crt
El certificado del servidor fue generado y almacenado en pki/issued/oficina.crt. Este archivo será necesario en la configuración de OpenVPN.
Copiando los archivos para el servidor
Conecte la memoria USB conteniendo la CA en el servidor y copie los archivos para la carpeta de configuración de OpenVPN. Como son necesarios permisos de administrador, ejecute los comandos como root o con sudo.
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/oficina.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/oficina.key /etc/openvpn/keys/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key /etc/openvpn/keys/
Generando el par de claves para el cliente
El par de claves puede ser generado en la propia CA y después transferido para el cliente, pero la práctica recomendada es generarlo directamente en el cliente y enviar solo la solicitud para la CA firmar. De esa forma, la clave privada nunca sale del cliente, aumentando la seguridad.
A continuación, será demostrado ese proceso, con la generación de las claves en el cliente y la importación de la solicitud en la CA para firma. Como los ejemplos anteriores ya fueron detallados, aquí los comandos serán presentados de forma más objetiva.
Generando la solicitud en el cliente
Con un usuario común, haga la descarga de Easy-RSA, inicialice la PKI y genere el par de claves. En este ejemplo, el cliente será identificado como casa.
$ bash
Descargue Easy-RSA en el cliente git clone https://github.com/OpenVPN/easy-rsa Acceda a la carpeta del script easyrsa cd easy-rsa/easyrsa3 Inicie la PKI ./easyrsa init-pki Genere las claves sin contraseña ./easyrsa gen-req casa nopass
Copie la solicitud generada pki/reqs/casa.req del cliente para el servidor. Conecte la memoria USB con la estructura CA en el servidor e importe la solicitud. No copie la solicitud para la memoria USB porque puede causar conflictos. Déjela en el computador, el comando import-req ya la copiará automáticamente para pki/reqs/.
$ bash
cd /mnt/usb/easy-rsa/easyrsa3/
./easyrsa import-req /camino/para/casa.req casa
Using Easy-RSA 'vars' configuration:
* /mnt/usb/easy-rsa/easyrsa3/vars
Notice
------
Request successfully imported with short-name: casa
This request is now ready to be signed.
Firme la solicitud con la CA. Durante el proceso, será solicitado confirmar los detalles de la solicitud, digite yes y presione Enter ↲, luego ingrese la contraseña de la CA.
$ bash
./easyrsa sign-req client casa
Observe que el parámetro de sign-req cambia de server para client al firmar certificados para clientes. Esta distinción es esencial, pues un certificado firmado incorrectamente como server no funcionará para la conexión del cliente.
Después de la firma, el certificado estará disponible en pki/issued/casa.crt.
Copiando los archivos para el cliente
Para facilitar la explicación, será considerado que la memoria USB conteniendo la CA y los certificados fue llevado hasta la casa del empleado para copiar los archivos. Si fuera transferirlos por internet, utilice un método seguro, como SSH (scp, sftp) o HTTPS.
Conecte la memoria USB conteniendo la CA en el cliente y copie los archivos para la carpeta de configuración de openvpn. Será necesario permisos de administrador, ejecute los comandos como root o use el comando sudo.
Conecte la memoria USB en el cliente y copie los archivos para la carpeta de configuración de OpenVPN:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/certs/
cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/casa.crt /etc/openvpn/certs/
cp /mnt/usb/easy-rsa/easyrsa3/pki/private/easyrsa-tls.key /etc/openvpn/keys/
# Clave generada en el propio cliente
cp /camino/para/easy-rsa/easyrsa3/pki/private/casa.key /etc/openvpn/keys/
Las configuraciones de la VPN en el cliente son detalladas en el artículo sobre configuración de OpenVPN, citado en la introducción.
Revocando un certificado
La revocación de certificados es una medida esencial para mantener la seguridad de la VPN. Siempre que un dispositivo sea desactivado, comprometido o un empleado deje la empresa, es fundamental revocar su certificado para impedir accesos indebidos.
Para revocar un certificado e invalidar su uso, se utiliza el comando: ./easyrsa revoke nombreDeLaSolicitud.
Este proceso es irreversible. Será solicitado que confirme la revocación digitando yes. Luego, digite la contraseña de la clave de la CA cuando sea solicitado para concluir la revocación.
$ bash
./easyrsa revoke casa
El certificado revocado será movido para la carpeta revoked/ dentro del ambiente de la PKI de la CA.
Sin embargo, la revocación por sí sola no bloquea automáticamente al cliente. El servidor necesita estar configurado para consultar la Lista de Certificados Revocados (CRL). Si esa lista no es actualizada en el servidor, clientes revocados aún podrán conectarse.
Ejecute el comando abajo e informe la contraseña de la CA cuando sea solicitado:
$ bash
./easyrsa gen-crl
Esto creará un archivo llamado crl.pem. Cópielo para el directorio de configuración de OpenVPN en el servidor:
$ shell
cp /mnt/usb/easy-rsa/easyrsa3/pki/crl.pem /etc/openvpn/
En el archivo de configuración del servidor OpenVPN (oficina.conf, en este ejemplo), añada la siguiente línea para que el servidor consulte la CRL:
oficina.conf
crl-verify /etc/openvpn/crl.pem
Reinicie el servidor OpenVPN para aplicar la alteración. Después de eso, cuando un cliente intente conectarse con un certificado revocado, el log del servidor exhibirá el siguiente mensaje:
/var/log/openvpn.log
VERIFY ERROR: depth=0, error=certificate revoked: CN=casa
La CRL será verificada siempre que un cliente intente conectarse. Como el servidor OpenVPN está configurado para reducir privilegios después de la inicialización y operar como el usuario nobody, es necesario garantizar que el archivo crl.pem pueda ser leído correctamente. Ajuste los permisos con los siguientes comandos:
# bash
chown root:nobody /etc/openvpn/crl.pem chmod 440 /etc/openvpn/crl.pem
Renovando un certificado
Los certificados poseen una fecha de expiración y, eventualmente, necesitarán ser renovados. Este proceso puede ser realizado tanto antes como después de la expiración. Esencialmente, la renovación involucra la creación de un nuevo certificado y la revocación del antiguo. Sin embargo, el procedimiento utiliza comandos específicos que permiten reutilizar el mismo nombre del certificado original.
Si desea probar esta funcionalidad, puede aumentar el período de expiración de los certificados en el archivo vars, como haremos aquí, y renovar el certificado. Para verificar la validez actual de un certificado, utilice el comando:
$ shell
openssl x509 -in pki/issued/casa.crt -noout -dates
notBefore=Feb 27 18:04:32 2025 GMT
notAfter=Feb 25 18:04:32 2035 GMT
Para efecto de pruebas, altere la expiración para 20 años en el archivo vars, modificando la línea set_var EASYRSA_CERT_EXPIRE 7300. Si el certificado ya está expirado o próximo del vencimiento, basta con ejecutar los comandos a seguir para renovarlo por más 10 años, sin necesidad de modificar la configuración de expiración.
$ shell
./easyrsa renew casa
El proceso exhibirá un aviso informando que el certificado actual será excluido. Confirme con yes. Luego, será solicitado que confirme la creación del nuevo certificado, yes nuevamente. Por fin, ingrese la contraseña de la clave de la CA para firmar el nuevo certificado.
Revogue el certificado antiguo con el comando:
$ bash
./easyrsa revoke-renewed casa
Yes para confirmar e ingrese la contraseña de la clave de la CA para concluir la revocación. ¿Piensa que acabó? ¡Aún no! El siguiente paso es actualizar la CRL, lo que es hecho con el comando:
$ bash
./easyrsa gen-crl
Para más informaciones, consulte el tópico Revocando un certificado en este artículo.
En el cliente
Copie el nuevo certificado y la nueva clave para el cliente:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/issued/casa.crt /etc/openvpn/certs/ cp /mnt/usb/easy-rsa/easyrsa3/pki/private/casa.key /etc/openvpn/keys/
En el servidor
Copie la nueva CRL para el servidor:
# bash
cp /mnt/usb/easy-rsa/easyrsa3/pki/crl.pem /etc/openvpn/
Reinicie el servicio OpenVPN en el cliente y en el servidor:
# bash
/etc/rc.d/rc.openvpn restart
Verificando la nueva expiración del certificado:
$ shell
openssl x509 -in pki/issued/casa.crt -noout -dates
notBefore=Feb 27 18:12:09 2025 GMT
notAfter=Feb 22 18:12:09 2045 GMT
Repare que la nueva expiración será en 2045 en vez de 2035. Aunque el proceso de renovación sea simple, puede ser trabajoso, por eso fue sugerido anteriormente trabajar con fechas de expiración más largas.
Configurando el servidor y cliente en OpenVPN
Para configurar OpenVPN e integrar los certificados generados, consulte el artículo Cómo configurar un servidor OpenVPN con Easy-RSA en Linux. En él, encontrará las instrucciones detalladas para ajustar el servicio y establecer conexiones seguras entre clientes y servidores.
Conclusión
Este artículo presentó el uso de Easy-RSA para gestionar claves y certificados en Linux, cubriendo desde la creación de la CA hasta la revocación y renovación de certificados. Con estos procedimientos, es posible establecer una infraestructura de autenticación segura para OpenVPN, garantizando el control sobre los dispositivos que pueden conectarse a la red.