Product SiteDocumentation Site

10.2. Certificados X.509

Los certificados son los elementos principales de muchos servicios de red construidos sobre protocolos criptográficos, cuando necesitan algún tipo de autentificación central.
Entre aquellos protocolos, SSL fue inventado por Netscape (capa de zócalos seguros: «Secure Socket Layer») para asegurar conexiones con servidores web. Luego fue estandarizado por el IETF bajo el acrónimo TLS (seguridad de capa de transporte: «Transport Layer Security»). Desde entonces, TLS ha seguido evolucionando y en nuestros días SSL ha quedado obsoleto debido a múltiples fallos de diseño que se han ido descubriendo.
El protocolo TLS principalmente trata de proporcionar privacidad e integridad de datos entre dos o más aplicaciones informáticas que se comunican. El caso más común en Internet es la comunicación entre un cliente (p. ej., un navegador web) y un servidor.
Se necesita un par de claves para intercambiar información, lo que implica una clave pública que incluye información sobre la identidad del propietario y coincide con una clave privada. La clave privada se debe mantener en secreto, de lo contrario se compromete la seguridad. Sin embargo, cualquiera puede crear un par de claves, almacenar cualquier identidad en ella y pretender ser la identidad que elijan. Una solución involucra el concepto de una Autoridad de Certificación (CA: «Certification Authority») formalizado por el estándar X.509. Este término se refiere a una entidad que posee un par de claves confiable conocido como certificado raíz. Sólo se utiliza este certificado para firmar otros certificados (pares de claves),una vez se han seguido suficientes pasos para revisar la identidad almacenada en el par de claves. Las aplicaciones que utilizan X.509 luego pueden verificar los certificados que se les presente si conocen los certificados raíz confiables.
Puede implementar una AC (como se describe en Sección 10.2.2, “Infraestructura de llave pública: easy-rsa), pero si tiene la intención de usar el certificado para una página web, tiene que contar con una AC de confianza. Los precios varían de forma significativa, pero es posible implementar una gran seguridad sin gastar apenas dinero.

10.2.1. Crear certificados de confianza gratuitos

Muchos programas crean y usan certificados snakeoil (consulte el recuadro SEGURIDAD Certificados SSL de Snake oil). Afortunadamente, el paquete certbot trae todo lo que necesitamos para crear nuestros propios certificados de confianza, proporcionados por la iniciativa «Let's Encrypt» (ver el recuadro CULTURA La iniciativa Let's Encrypt), que también se puede usar para agentes de transporte de correo (Postfix) y agentes de entrega de correo (Dovecot, Cyrus, etc.).
Los administradores de Falcot simplemente quieren crear un certificado para su página web, que se ejecuta sobre Apache. Hay un conveniente complemento de Apache para certbot que automáticamente edita la configuración de Apache para servir el certificado obtenido, así que hacen uso de este:
# apt install python3-certbot-apache
[...]
# certbot --apache
aving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins seleccionados: Autenticador Apache, Instalador apache)
Ingresar el correo electrónico (usado para renovaciones urgentes y avisos de seguridad)
 (Enter 'c' to cancel): admin@falcot.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Leer los Términos de Servicio en
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. Debe
aceptar para registrarse en el servidor ACME. ¿Está de acuerdo?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
¿Estaría dispuesto, una vez que su primer certificado se emita con éxito, a compartir
su dirección de correo electrónico con Electronic Frontier Foundation, socio fundador
del proyecto Let's Encrypt y la ONG que desarrolla Certbot? Nos gustaria enviarle un
un correo electrónico sobre nuestro trabajo encriptando la web, las noticias de la EFF,
las campañas y las formas de apoyar la libertad digital.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:  N

Cuenta registrada.

No se encontraron nombres en sus archivos de configuración. Por favor ingrese su nombre(s)
de dominio (s) (separados por comas y/o espacios)  (Ponga 'c' para cancelar): falcot.com

Solicitar un certificado para falcot.com
Realizando las siguientes cuestiones:
cuestión http-01 para falcot.com
Módulo de reescritura de Apache habilitado
Esperando la verificación...
Limpieza de cuestiones
Creó un SSL vhost en /etc/apache2/sites-available/000-default-le-ssl.conf
Habilitado el módulo Apache socache_shmcb
Habilitado el módulo Enabled Apache ssl
Implementación del Certificado en VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Habilitación del sitio disponible: /etc/apache2/sites-available/000-default-le-ssl.conf

Elija si desea redirigir o no el tráfico HTTP a HTTPS, eliminando el acceso HTTP. (separados por comas y/o espacios).
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: 1: Noredirect: No realice más cambios en la configuración del servidor web.
2: Redirect - Haga que todas las solicitudes se redirijan al acceso  HTTPS seguro. Elija
Elija esto para sitios nuevos o si confía en que su sitio funciona con HTTPS. Puede
deshacer este cambio editando la configuración de su servidor web.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Seleccione el número apropiado [1-2] then [enter] (pulsar 'c' para cancelar): 2

Módulo de reescritura de Apache habilitado
Redirigiendo vhost en /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
¡Felicitaciones! Ha habilitado correctamente https://falcot.com

Debe probar su configuración en:
https://www.ssllabs.com/ssltest/analyze.html?d=falcot.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

NOTAS IMPORTANTES:
 - ¡Felicitaciones! Su certificado y cadena se han guardado en:
   /etc/letsencrypt/live/falcot.com/fullchain.pem
   Su archivo de clave se ha guardado en:
   /etc/letsencrypt/live/falcot.com/privkey.pem
   Su certificado vencerá el 04/06/2022. Para obtener una versión nueva o
   modificada de este certificado en el futuro, simplemente ejecute certbot
   de nuevo con la opción "certonly". Para renovar *todos* sus certificados
   de forma no interactiva, ejecute "certbot renew"
 - Las credenciales de su cuenta se han guardado en el directorio de configuración 
   de Certbot en /etc/letsencrypt. Debería hacer una copia de seguridad segura de 
   esta carpeta ahora. Este directorio de configuración también contendrá certificados 
    y claves privadas obtenidas por Certbot, por lo que es ideal realizar copias de 
   seguridad periódicas de esta carpeta.
 - Si te gusta Certbot, considera apoyar nuestro trabajo:

   Donando a ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
Si prefiere mantener el servidor en funcionamiento durante la creación del certificado, puede ejecutar el complemento webroot para obtener el certificado con los argumentos certonly y --webroot. Tendría que especificar un --webroot-path (abreviado -w), que debería contener los archivos servidos. La orden tiene este aspecto:
# certbot certonly --webroot -w /var/www/html -d www.DOMINIO.com -d DOMINIO.com
Necesita reiniciar todos los servicios usando los certificados que ha creado.
Los certificados creados son los llamados certificados de corta duración, que son válidos durante 90 días y deben ser por ello renovados una vez cada tres meses usando la orden certbot renew. Sin embargo, no deberíamos renovar cada certificado manualmente, sino automáticamente. certbot incluye una tarea cron básica en /etc/cron.d/certbot. Para cerciorarse de que los certificados pueden ser renovados automáticamente, puede ejecutar certbot renew --dry-run.

10.2.2. Infraestructura de llave pública: easy-rsa

También puede crear su propia AC, para lo que usaremos el algoritmo RSA, ampliamente utilizado en criptografía de llave pública. Involucra un «par de llaves», compuestas de una llave privada y una llave pública. Las dos llaves están fuertemente relacionadas entre ellas y sus propiedades matemáticas son tales que un mensaje cifrado con la llave pública sólo puede ser descifrado por alguien que conozca la llave privada, lo que asegura confidencialidad. En la dirección opuesta, un mensaje cifrado con la clave privada puede ser descifrado por cualquiera que conozca la llave pública, lo que permite autenticar el origen del mensaje ya que sólo pudo haber sido generado por alguien con acceso a la llave privada. Cuando se asocie una función de hash digital (MD5, SHA1 o una variante más reciente), esto lleva a un mecanismo de firma que puede aplicarse a cualquier mensaje.
Dado que los CA públicos sólo expiden certificados a cambio de un pago (importante), también es posible crear una autoridad de certificación privada dentro de la empresa. El paquete easy-rsa proporciona herramientas que dan soporte a la infraestructura de certificados X.509, implementados como un conjunto de scripts haciendo uso del comando openssl.
Los administradores de Falcot Corp utilizan esta herramienta para crear los certificados necesarios, tanto para los servidores como para los clientes. Esto permite que la configuración de todos los clientes sea similar ya que sólo deberán configurarlos para confiar en certificados que provengan de la CA local de Falcot. Esta CA es el primer certificado a crear; para ello los administradores preparan un directorio con los ficheros necesarios para la CA en una ubicación apropiada, preferentemente a una máquina que no está conectada a la red para evitar el riesgo de robo de la llave privada de la CA.
$ make-cadir pki-falcot
$ cd pki-falcot
Luego almacenan los parámetros necesarios en el archivo vars, que pueden ser descomentados y editados:
$ grep EASYRSA vars
if [ -z "$EASYRSA_CALLER" ]; then
# easyrsa.  More specific variables for specific files (e.g., EASYRSA_SSL_CONF)
#set_var EASYRSA	"${0%/*}"
#set_var EASYRSA_OPENSSL	"openssl"
#set_var EASYRSA_OPENSSL	"C:/Program Files/OpenSSL-Win32/bin/openssl.exe"
#set_var EASYRSA_PKI		"$PWD/pki"
#set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI"
#set_var EASYRSA_DN	"cn_only"
set_var EASYRSA_REQ_COUNTRY	"FR"
set_var EASYRSA_REQ_PROVINCE	"Loire"
set_var EASYRSA_REQ_CITY	"Saint-Étienne"
set_var EASYRSA_REQ_ORG	"Falcot Corp"
set_var EASYRSA_REQ_EMAIL	"admin@falcot.com"
set_var EASYRSA_REQ_OU		"Certificate authority"
#set_var EASYRSA_KEY_SIZE	2048
#set_var EASYRSA_ALGO		rsa
#set_var EASYRSA_CURVE		secp384r1
#set_var EASYRSA_CA_EXPIRE	3650
#set_var EASYRSA_CERT_EXPIRE	825
#set_var EASYRSA_CRL_DAYS	180
#set_var EASYRSA_CERT_RENEW	30
#set_var EASYRSA_RAND_SN	"yes"
#set_var EASYRSA_NS_SUPPORT	"no"
#set_var EASYRSA_NS_COMMENT	"Easy-RSA Generated Certificate"
#set_var EASYRSA_TEMP_FILE	"$EASYRSA_PKI/extensions.temp"
# when undefined here, default behaviour is to look in $EASYRSA_PKI first, then
# fallback to $EASYRSA for the 'x509-types' dir.  You may override this
#set_var EASYRSA_EXT_DIR	"$EASYRSA/x509-types"
#set_var EASYRSA_KDC_REALM      "CHANGEME.EXAMPLE.COM"
# EASYRSA_PKI or EASYRSA dir (in that order.) NOTE that this file is Easy-RSA
#set_var EASYRSA_SSL_CONF	"$EASYRSA/openssl-easyrsa.cnf"
#set_var EASYRSA_REQ_CN		"ChangeMe"
#set_var EASYRSA_DIGEST		"sha256"
#set_var EASYRSA_BATCH		""
$ vim vars
$ 
Ahora preparamos el directorio de la infraestructura de clave pública con la siguiente orden:
$ ./easyrsa init-pki


init-pki complete; ahora puede crear una CA o una petición.
Su directorio PKI recién creado es: /home/debian/pki-falcot/pki

El siguiente paso es crear el par de llaves en sí de la CA (durante este paso se almacenarán las dos partes del par de llaves en pki/ca.crt y pki/private/ca.key). Podemos añadir la opción nopass para no tener que introducir una contraseña cada vez que se use la clave privada:
$ ./easyrsa build-ca nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
...............................+++++
e is 65537 (0x010001)
Está a punto de que se le pida ingresar información que se incorporará a 
su solicitud de certificado.
Lo que está a punto de ingresar es lo que se llama un Nombre Distinguido o un DN.
Hay bastantes campos, pero puede dejar algunos en blanco
Hay bastantes campos, pero puede dejar algunos en blanco,
Si introduce '.', el campo se quedará en blanco.
-----
Nombre Común (por ejemplo: su nombre de usuario, host o servidor) [Easy-RSA CA]:

Se completó la creación de la CA y ahora puede importar y firmar solicitudes de certificados.
Su nuevo archivo de certificado de CA para publicar se encuentra en:
/home/debian/pki-falcot/pki/ca.crt

Ahora puede crear el certificado, así como también los parámetros Diffie-Hellman necesarios en el servidor para la conexión SSL/TLS. Quieren usarlo para un servidor VPN (consulte la sección Sección 10.3, “Red virtual privada”) identificado cor el nombre DNS vpn.falcot.com; se reutiliza este nombre para los archivos de llaves generados (keys/vpn.falcot.com.crt para el certificado público, keys/vpn.falcot.com.key para la llave privada):
$ ./easyrsa gen-req vpn.falcot.com nopass
Nota: usando la configuración Easy-RSA desde: ./vars

Usando SSL: openssl OpenSSL 1.1.1b  26 Feb 2019
Generando una clave privada RSA
.................................................................................+++++
........+++++
escribiendo una nueva clave privada para '/home/roland/pki-falcot/pki/private/vpn.falcot.com.key.E5c3RGJBUd'
-----
Está a punto de que se le solicite que ingrese información que se incorporará
a su solicitud de certificado.
Lo que está a punto de ingresar es lo que se llama un Nombre Distinguido o un DN.
Hay bastantes campos, pero puede dejar algunos en blanco
Para algunos campos hay un valor predeterminado,
Si introduce '.', el campo permanecerá en blanco.
-----
Nombre Común (por ejemplo: su nombre de usuario, host o servidor) [vpn.falcot.com]:

Par de claves y solicitud de certificado completados. Sus archivos son:
req: /home/roland/pki-falcot/pki/reqs/vpn.falcot.com.req
key: /home/roland/pki-falcot/pki/private/vpn.falcot.com.key

$ ./easyrsa sign-req server vpn.falcot.com

Nota: uso de la configuración Easy-RSA desde: ./vars

Usando SSL: openssl OpenSSL 1.1.1b  26 Feb 2019


Está a punto de firmar el siguiente certificado.
Verifique la precisión de los detalles que se muestran a continuación. Tenga en cuenta que esta solicitud
no ha sido verificada criptográficamente. Asegúrese de que proceda de una fuente confiable o de que haya 
verificado la suma de comprobación de la solicitud con el remitente.

Asunto de la solicitud, que se firmará como certificado de servidor durante 1080 días:

subject=
    commonName                = vpn.falcot.com


Escriba la palabra 'yes' para continuar, o cualquier otra entrada para abortar. 
  Confirmar los detalles de la solicitud: yes
Usando la configuración desde /home/roland/pki-falcot/pki/safessl-easyrsa.cnf
Verifique que la solicitud coincida con la firma
Firma ok
El Nombre Distinguido del Sujeto es el siguiente
commonName            :ASN.1 12:'vpn.falcot.com'
El certificado tiene vigencia hasta junio 14 10:44:44 2022 GMT (1080 days)

Escribir base de datos con 1 entrada nueva
Data Base Updated

Certificado creado en: /home/roland/pki-falcot/pki/issued/vpn.falcot.com.crt

$ ./easyrsa gen-dh

Nota: usando la configuración Easy-RSA desde: ./vars

Usando SSL: openssl OpenSSL 1.1.1b  26 Feb 2019
Generando parámetros DH, long safe prime de 2048 bits de longitud, generador 2
Esto se va a tomar su tiempo
[…]
Parámetros DH de tamaño 2048 creados en /home/roland/pki-falcot/pki/dh.pem

El siguiente paso crea los certificados para los clientes VPN; necesita un certificado para cada equipo o persona autorizada para utilizar la VPN:
$ ./easyrsa build-client-full JoeSmith nopass

Usando SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generando una clave privada RSA
...................................+++++
.........................................................................................+++++
escribir una nueva clave privada para '/home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.RKlbOE'
-----
Usando la configuración desde /home/debian/pki-falcot/pki/easy-rsa-5694.DOYwSn/tmp.d5QHAC
Verificar que la solicitud coincida con la firma
Firma ok
El Nombre Distinguido del Sujeto es el siguiente
commonName            :ASN.1 12:'JoeSmith'
l certificado debe validarse hasta May 27 15:29:25 2024 GMT (825 days)

Escribir base de datos con 1 entrada nueva
Data Base Updated