Se prepara la estructura de directorios de la CA para contener los certificados.
En /etc/ssl/HA/
root@ubuntu-ha:~# mkdir -p {private,servers,clients,csr,crl}
Generación de la CA
Se general un archivo openssl.cnf para configuración de los certificados
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/ssl/HA
certs = /etc/ssl/HA
certificate = /etc/ssl/HA/ca.pem
private_key = /etc/ssl/HA/private/ca.key
crl_dir = /etc/ssl/HA/crl
database = /etc/ssl/HA/index.txt
serial = /etc/ssl/HA/serial
crlnumber = /etc/ssl/HA/crlnumber
crl = /etc/ssl/HA/ca.crl
default_md = sha256
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C=AR
ST=CABA
L=CABA
O=Mi Empresa SA
OU=IT
emailAddress=admin@miDominio.com.ar
CN = miDominio-CA
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 =miDominio-CA
Se genera la clave privada y certificado de la CA
root@ubuntu-ha:~# openssl req -newkey rsa:4096 -keyform PEM -keyout ./private/ca.key -x509 -days 3650 -outform PEM -out ./ca.pem -config openssl.cnf
Certificado de cliente
root@ubuntu-ha:~# NOMBRE="cliente1"
root@ubuntu-ha:~# MAIL="cliente1@miDominio.com.ar"
Se crea la clave privada
root@ubuntu-ha:~# openssl genrsa -out ./clients/$NOMBRE.key 4096
Se genera la solicitud de firma (CA) de certificados para la conexión de los clientes
root@ubuntu-ha:~# openssl req -new -key ./clients/$NOMBRE.key -out ./csr/$NOMBRE.csr -subj "/C=AR/ST=CABA/L=CABA/O=Mi Empresa SA/OU=IT/emailAddress=$MAIL/CN=$NOMBRE.miDominio.com.ar"
Se firma (CA) el certificado del cliente que caduca en un año
root@ubuntu-ha:~# openssl x509 -req -in ./csr/$NOMBRE.csr -CA ./ca.pem -CAkey ./private/ca.key -CAcreateserial -extensions client -days 365 -outform PEM -out ./clients/$NOMBRE.pem
Generamos una clave simétrica aleatoria para proteger el certificado P12
root@ubuntu-ha:~# PASS=`openssl rand -base64 9`
root@ubuntu-ha:~# echo $PASS > ./clients/$NOMBRE.txt
Convertir certificado en formato válido para navegador (P12)
root@ubuntu-ha:~# openssl pkcs12 -export -inkey ./clients/$NOMBRE.key -in ./clients/$NOMBRE.pem -out ./clients/$NOMBRE.p12 -passout pass:$PASS
Revocar certificados de clientes
root@ubuntu-ha:~# mv ./clients/$NOMBRE.* ./crl/
root@ubuntu-ha:~# openssl ca -revoke ./crl/$NOMBRE.pem -config openssl.cnf
Generar lista de revocados
root@ubuntu-ha:~# openssl ca -gencrl -out ca.crl -crldays 1095 -config openssl.cnf
Certificado de Servidor con Let’s Encrypt
Instalar certbot
root@ubuntu-ha:~# aptitude install certbot
Se generan los certificados verificados con el registro _acme-challenge del DNS
root@ubuntu-ha:~# certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns -d "haproxy.midominio.com.ar"
Se crea un certificado haproxy.pem on la chain y la clave privada
root@ubuntu-ha:~# cat /etc/letsencrypt/live/haproxy.midominio.com.ar/fullchain.pem /etc/letsencrypt/live/haproxy.midominio.com.ar/privkey.pem > /etc/ssl/HA/server/haproxy.pem
Configuración del HAProxy
Se edita el frontend del HAProxy en el archivo /etc/haproxy/haproxy.cfg con los parámetros crt (certificado de servidor), ca-file (certificado de cliente) y crl-file (lista de revocados) como requeridos.
bind *:443 ssl crt /etc/ssl/HA/server/haproxy.pem verify required ca-file /etc/ssl/HA/ca.pem crl-file /etc/ssl/HA/ca.crl