[DEPRECATED] Let's Encrypt & HaProxy

Il est facile d'utiliser un client Let's Encrypt pour Apache ou NGinx, mais dès que l'on commence à utiliser HaProxy, il faut mettre les mains dans le camboui, et c'est un peu plus compliqué. Voici le tuto pour arriver à le faire fonctionner correctement.

Configuration de HaProxy

Voici la configuration du HaProxy :

root@HaProxy:/etc/haproxy# cat haproxy.cfg
# InfraKaZ Config HaProxy
global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot          /var/lib/haproxy
        maxconn         512
        pidfile         /var/run/haproxy.pid
        stats timeout 30s
        user            haproxy
        group           haproxy
        daemon
	lua-load /etc/haproxy/acme-http01-webroot.lua

	# SSL Location
        crt-base /etc/haproxy/ssl/

 # Default SSL Cyphers & Options
	ssl-default-bind-ciphers AES128+AESGCM+EECDH+SHA256:AES128+EECDH:AES128+AESGCM+DHE:AES128+EDH:AES256+AESGCM+EECDH:AES256+EECDH:AES256+AESGCM+EDH:AES256+EDH:-SHA:AES128+AESGCM+EECDH+SHA256:AES128+EECDH:AES128+AESGCM+DHE:AES128+EDH:AES256+AESGCM+EECDH:AES256+EECDH:AES256+AESGCM+EDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!3DES:!DSS 	
	ssl-default-bind-options no-sslv3 no-tls-tickets
    	ssl-dh-param-file /opt/certbot/dhparams.pem 
	tune.ssl.default-dh-param 2048

defaults
        log             global
        mode	          http
        option          httplog
        option          dontlognull
        retries         3
        maxconn         512
        option          redispatch
        option          forwardfor
        option          http-server-close
        timeout connect 10s
        timeout client  30s
        timeout server  120s
        timeout check   10s
        errorfile 400   /etc/haproxy/maintenance.html
        errorfile 403   /etc/haproxy/maintenance.html
        errorfile 408   /etc/haproxy/maintenance.html
        errorfile 500   /etc/haproxy/maintenance.html
        errorfile 502   /etc/haproxy/maintenance.html
        errorfile 503   /etc/haproxy/maintenance.html
        errorfile 504   /etc/haproxy/maintenance.html

        # Log Fomat
        #Legend: "client_ip"\ "local_date_time"\ "timestamp"\ "captured_request_headers CLF style"\ "frontend_port"\ "frontend_name_transport"\ "frontend concurrent connections"\ "http_request"\ "status_code"\ "bytes_uploaded(from client to server)"\ "bytes_read(from server to client)"\ "backend_name"\ "server_name"\ "server_port"\ "beconn(backend concurrent connections)"
        log-format      "%ci"\ "%Tl"\ "%Ts"\ "%hrl"\ "%fp"\ "%ft"\ "%fc"\ "%r"\ "%ST"\ "%U"\ "%B"\ "%b"\ "%s"\ "%sp"\ "%bc"

userlist stats-auth
	group admin   users KaZ
        user  KaZ     insecure-password InSeCuRePaSSwoRD

userlist InfraKaZ-Admins
        user KaZ   insecure-password InSeCuRePaSSwoRD

listen admin_page
        bind 192.168.1.102:8088
        mode               http
        balance            source
	stats enable
	stats uri          /haproxy
        acl AUTH_ADMIN     http_auth_group(stats-auth) admin
        stats http-request auth unless AUTH_ADMIN
        stats admin        if AUTH_ADMIN

frontend http
        bind 0.0.0.0:80
        
        # letsencrypt
        acl url_acme_http01 path_beg /.well-known/acme-challenge/
        http-request use-service lua.acme-http01 if METH_GET url_acme_http01
        
        redirect scheme https code 301 if !{ ssl_fc } !url_acme_http01
        
        default_backend                                  maintenance


frontend InfraKaZ_HTTPS
#        bind 192.168.1.102:80
        bind 192.168.1.102:443 ssl crt /etc/haproxy/ssl/
	mode http
        rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomains;\ preload
        rspadd X-Frame-Options:\ DENY
	default_backend maintenance

        # ACL WHITELIST
        acl acl_match_whitelist src     127.0.0.1               # SuperIPLocalHost

        # Anti-DOOS
        stick-table type ip size 200k expire 2m store conn_cur
        tcp-request connection accept if acl_match_whitelist
        tcp-request connection reject if { src_conn_cur ge 30 }
        tcp-request connection track-sc1 src
        rate-limit sessions 10

        redirect scheme https code 301 if !{ ssl_fc }

	      # ACLs Admin
        acl acl_match_url_stats_haproxy                   url_beg          /haproxy

        # ACLs
        acl acl_match_host_cazevieille_me        hdr_end(host) -i cazevieille.me
        acl acl_match_host_cazevieille_com        hdr_end(host) -i cazevieille.com


        # Backend
        use_backend cazevieille_me         if acl_match_host_cazevieille_me

        default_backend                                  maintenance



backend cazevieille_me
	mode http
        server cazevieille_me 192.168.1.101:80 check 


backend cazevieille_com
	mode http
        server cazevieille_com 192.168.1.101:80 check 

#Default Backend
backend maintenance
	server maintenance 127.0.0.1:80 check

Nous avons deux Backend sur cette configuration : Le premier qui est exclusivement réservé à LetsEncrypt et qui est utilisé pour le HTTP, pour que Let's Encrypt puisse faire sa validation, et le second qui est celui qui sera utilisé par défaut à savoir InfraKaZ_HTTPS.

Obtension du certificat HTTPS

Il va tout d'abord falloir se rendre à l'adresse suivante : https://github.com/janeczku/haproxy-acme-validation-plugin

Nous allons donc cloner le repo suivant dans le répertoire /etc/haproxy/ :

 git clone https://github.com/janeczku/haproxy-acme-validation-plugin.git 

Il faudra ensuite copier le fichier lua dans le dossier /var/lib/haproxy/ :

 cp -p acme-http01-webroot.lua /var/lib/haproxy/ 

Une fois ceci effectué, nous pouvons lancer la commande :

sudo certbot certonly --text --webroot --webroot-path   /var/lib/haproxy -d cazevieille.me --renew-by-default --agree-tos   --email ssl-lee@infrakaz.me

NB : Pour tester si tout est ok, il est reommandé d'utiliser cette commande pour générer un certificat de test :

sudo certbot certonly --test --text --webroot --webroot-path   /var/lib/haproxy -d cazevieille.me --renew-by-default --agree-tos   --email ssl-lee@infrakaz.me

Création du fichier SSL Certbot

Le certificat a été crée, mais en revanche, il n'st pas exploitable par HaProxy. Nous allons donc le parser, et réunir plusieurs fichier dans un seul même fichier :

sudo cat /etc/letsencrypt/live/cazevieille.me/privkey.pem \
  /etc/letsencrypt/live/cazevieille.me/fullchain.pem \
  | sudo tee /etc/haproxy/ssl/cazevieille_me.pem >/dev/null
Back to top