Idioma
Categoría
Buscar

Gestión de certificados para OpenVPN con Easy-RSA

Cómo crear una CA para generar, firmar, revocar y renovar certificados de forma segura. Comprenda el papel de las claves públicas y privadas, las solicitudes, los certificados y más

Gestión de certificados para OpenVPN con Easy-RSA
En Código abierto Por Rudi Drusian Lange
Publicado el
Última actualización

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.

Importante: La memoria USB debe estar formateada con un sistema de archivos compatible con Linux (ext3, ext4, xfs, etc.), de lo contrario, no será posible ejecutar el script easyrsa.

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].

¡Atención! El comando init-pki remueve cualquier configuración anterior, incluyendo certificados ya creados. Úselo solo al iniciar una nueva configuración o al reconfigurar toda la infraestructura.

$ 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

Atención: Siempre que un certificado sea revocado, una nueva CRL deberá ser generada y copiada para el servidor. Si la CRL expira, ningún cliente conseguirá conectarse hasta que sea actualizada.

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.

Referencias

Tablón de Anuncios

Este no es mi idioma original y no lo hablo muy bien. Utilicé mis pocos conocimientos y herramientas de traducción para redactar el texto de este artículo. Disculpe los posibles errores ortográficos o gramaticales, se agradecen sugerencias de correcciones y se pueden enviar al correo electrónico de contacto que se encuentra en el pie de página del sitio. Mi intención es compartir algunos conocimientos y espero que esta traducción sea lo suficientemente buena.


Algunos de los contenidos de este sitio web, incluidos textos, imágenes, gráficos y otros materiales, pueden ser generados o mejorados mediante herramientas de inteligencia artificial (IA). Para obtener más detalles sobre nuestro uso de IA, consulte nuestro Término de uso.