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