Let’s Encrypt für haproxy

Voraussetzung: haproxy ist installiert, acme.sh ist installiert.

Leider benötigt haproxy die Zertifikate in einer eher unüblichen Form. Nämlich den öffentlichen und den privaten Teil in einer Datei.

A. Haproxy einrichten [nur beim allerersten mal notwendig]

  1. etc/haproxy/certlist.txt erstellen
  2. haproxy.cfg unter etc/haproxy entsprechend anpassen.
    bind *:443 ssl crt-list /etc/haproxy/certlist.txt
  3. PHP-Script certbot_haproxy.php und certbot_haproxy.sh nach /etc/acme.sh speichern (source siehe unten)
  4. Cronjob einrichten:
    unter /etc/cron.daily/ neue datei lets_haproxy erstellen mit zeile /etc/acme.sh/letsencrypt_haproxy.sh

B. Neues Zertifikat einrichten

  1. Zertifikat erzeugen
  2. Zertifikat für Haproxy kopieren
    etc/acme.sh/letsencrypt_haproxy.sh
    -> alle unter etc/acme.sh/certs gespeicherten Zertifikate werden in eine für haproxy nutzbare Form umgewandelt und unter
    /stc/ssl/haproxy gespeichert
  3. Domain zu /etc/haproxy/certlist.txt hinzufügen.
    zb /etc/ssl/haproxy/domain.de.pem domain.de

letsencrypt_haproxy.php

<?php
$writedir = '/etc/ssl/haproxy';
	$dir = "/etc/acme.sh/certs";
	$directory = opendir($dir);
	while($file = readdir($directory)) {
    if($file != "." && $file != "..") {
      if(is_dir("$dir/$file")) {
        $content = file_get_contents("$dir/$file/fullchain.cer");
        $content .= file_get_contents("$dir/$file/$file.key");
        file_put_contents("$writedir/$file.pem", $content);

      } else {
      }
    }
  }
  closedir($directory);
?>

letsencrypt_haproxy.sh

php $(dirname $(readlink -f ${0}))/letsencrypt_haproxy.php
sudo service haproxy reload
echo "certs renewed und kopiert und haproxy reloaded"