Blog de Victor Héry - Comments: Utiliser Let's Encrypt avec Haproxyhttps://blog.victor-hery.com/2015/12/utiliser-letsencrypt-haproxy.html/2016-03-05T12:35:00+01:00Posted by: Victor2016-03-05T12:35:00+01:002016-03-05T12:35:00+01:00Victortag:blog.victor-hery.com,2016-03-05:/2015/12/utiliser-letsencrypt-haproxy.html//comment_4md<p>Bonjour Pierre Philippe,</p>
<p>Mmh, j'ai peut être une idée pour ton problème, notamment à propos du fait que pour que la chaine de certification fonctionne, il faut que la ligne let's encrypt soit lancée sur la machine qui porte l'adresse IP du site que tu veux certifier (car les serveurs …</p><p>Bonjour Pierre Philippe,</p>
<p>Mmh, j'ai peut être une idée pour ton problème, notamment à propos du fait que pour que la chaine de certification fonctionne, il faut que la ligne let's encrypt soit lancée sur la machine qui porte l'adresse IP du site que tu veux certifier (car les serveurs de let's encrypt vont essayer de contacter le domaine répondant dans les DNS)</p>
<p>Je veux bien t'aider à tester, est ce que ça te convient si on continue cette discussion par courriel plutôt ? Ça me semble plus pratique pour échanger rapidement et facilement que mon système de commentaire (qui a malheureusement ses limites avec des gros commentaires ^^)</p>
<p>N'hésite pas à me contacter via le formulaire de contact, ou à me dire si tu souhaite en discuter via commentaires :)</p>
<p>A plush' !</p>Posted by: Pierre-Philippe2016-03-03T08:59:00+01:002016-03-03T08:59:00+01:00Pierre-Philippetag:blog.victor-hery.com,2016-03-03:/2015/12/utiliser-letsencrypt-haproxy.html//comment_3md<p>Bonjour et merci pour ta réponse aussi rapide.</p>
<p>J'ai déjà un serveur Haproxy qui redirige en fonction des sous domaines vers les serveurs appropriés.<br>
J'ai donc une autre machine ou je test Haproxy pour le certificat.</p>
<p>Le bute est d'avoir un seul certificat par domaine pour un ensemble de sous …</p><p>Bonjour et merci pour ta réponse aussi rapide.</p>
<p>J'ai déjà un serveur Haproxy qui redirige en fonction des sous domaines vers les serveurs appropriés.<br>
J'ai donc une autre machine ou je test Haproxy pour le certificat.</p>
<p>Le bute est d'avoir un seul certificat par domaine pour un ensemble de sous domaine et Haproxy me parais la solution.<br>
D'autant plus que mes appli web ne tournent pas sur Apache ou Nginx et donc pas facile pour les certificats.</p>
<div class="highlight"><pre><span></span><code><span class="n">HAPROXY</span> <span class="n">config</span>
<span class="k">global</span>
<span class="n">log</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">log</span> <span class="n">local0</span>
<span class="n">log</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">log</span> <span class="n">local1</span> <span class="n">notice</span>
<span class="n">chroot</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">haproxy</span>
<span class="n">stats</span> <span class="n">socket</span> <span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="k">admin</span><span class="p">.</span><span class="n">sock</span> <span class="k">mode</span> <span class="mi">660</span> <span class="k">level</span> <span class="k">admin</span>
<span class="n">stats</span> <span class="n">timeout</span> <span class="mi">30</span><span class="n">s</span>
<span class="k">user</span> <span class="n">haproxy</span>
<span class="k">group</span> <span class="n">haproxy</span>
<span class="n">daemon</span>
<span class="o">#</span> <span class="k">Default</span> <span class="n">SSL</span> <span class="n">material</span> <span class="n">locations</span>
<span class="o">#</span><span class="n">ca</span><span class="o">-</span><span class="n">base</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">certs</span>
<span class="o">#</span><span class="n">crt</span><span class="o">-</span><span class="n">base</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">ssl</span><span class="o">/</span><span class="n">private</span>
<span class="o">#</span> <span class="k">Default</span> <span class="n">ciphers</span> <span class="k">to</span> <span class="n">use</span> <span class="k">on</span> <span class="n">SSL</span><span class="o">-</span><span class="n">enabled</span> <span class="n">listening</span> <span class="n">sockets</span><span class="p">.</span>
<span class="o">#</span> <span class="k">For</span> <span class="k">more</span> <span class="n">information</span><span class="p">,</span> <span class="n">see</span> <span class="n">ciphers</span><span class="p">(</span><span class="mi">1</span><span class="n">SSL</span><span class="p">).</span> <span class="n">This</span> <span class="n">list</span> <span class="k">is</span> <span class="k">from</span><span class="p">:</span>
<span class="o">#</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">hynek</span><span class="p">.</span><span class="n">me</span><span class="o">/</span><span class="n">articles</span><span class="o">/</span><span class="n">hardening</span><span class="o">-</span><span class="n">your</span><span class="o">-</span><span class="n">web</span><span class="o">-</span><span class="n">servers</span><span class="o">-</span><span class="n">ssl</span><span class="o">-</span><span class="n">ciphers</span><span class="o">/</span>
<span class="o">#</span><span class="n">ssl</span><span class="o">-</span><span class="k">default</span><span class="o">-</span><span class="n">bind</span><span class="o">-</span><span class="n">ciphers</span> <span class="n">ECDH</span><span class="o">+</span><span class="n">AESGCM</span><span class="p">:</span><span class="n">DH</span><span class="o">+</span><span class="n">AESGCM</span><span class="p">:</span><span class="n">ECDH</span><span class="o">+</span><span class="n">AES256</span><span class="p">:</span><span class="n">DH</span><span class="o">+</span><span class="n">AES256</span><span class="p">:</span><span class="n">ECDH</span><span class="o">+</span><span class="n">AES128</span><span class="p">:</span><span class="n">DH</span><span class="o">+</span><span class="n">AES</span><span class="p">:</span><span class="n">ECDH</span><span class="o">+</span><span class="mi">3</span><span class="n">DES</span><span class="p">:</span><span class="n">DH</span><span class="o">+</span><span class="mi">3</span><span class="n">DES</span><span class="p">:</span><span class="n">RSA</span><span class="o">+</span><span class="n">AESGCM</span><span class="p">:</span><span class="n">RSA</span><span class="o">+</span><span class="n">AES</span><span class="p">:</span><span class="n">RSA</span><span class="o">+</span><span class="mi">3</span><span class="n">DES</span><span class="p">:</span><span class="o">!</span><span class="n">aNULL</span><span class="p">:</span><span class="o">!</span><span class="n">MD5</span><span class="p">:</span><span class="o">!</span><span class="n">DSS</span>
<span class="o">#</span><span class="n">ssl</span><span class="o">-</span><span class="k">default</span><span class="o">-</span><span class="n">bind</span><span class="o">-</span><span class="k">options</span> <span class="k">no</span><span class="o">-</span><span class="n">sslv3</span>
<span class="k">defaults</span>
<span class="n">log</span> <span class="k">global</span>
<span class="k">mode</span> <span class="n">http</span>
<span class="k">option</span> <span class="n">httplog</span>
<span class="k">option</span> <span class="n">dontlognull</span>
<span class="n">timeout</span> <span class="k">connect</span> <span class="mi">5000</span>
<span class="n">timeout</span> <span class="n">client</span> <span class="mi">50000</span>
<span class="n">timeout</span> <span class="n">server</span> <span class="mi">50000</span>
<span class="n">errorfile</span> <span class="mi">400</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">400</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">403</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">403</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">408</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">408</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">500</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">500</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">502</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">502</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">503</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">503</span><span class="p">.</span><span class="n">http</span>
<span class="n">errorfile</span> <span class="mi">504</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">haproxy</span><span class="o">/</span><span class="n">errors</span><span class="o">/</span><span class="mi">504</span><span class="p">.</span><span class="n">http</span>
</code></pre></div>
<p>frontend http-in
acl app_letsencrypt path_beg /.well-known/acme-challenge/</p>
<div class="highlight"><pre><span></span><code><span class="err">use_backend bk-letsencrypt if app_letsencrypt</span>
</code></pre></div>
<p>backend bk-letsencrypt
log global
mode http
server srv_letsencrypt 127.0.0.1:63443</p>
<p>La commande Let's Encrypt<br>
letsencrypt-auto certonly --domains xx-mydomaine.fr --renew-by-default --http-01-port 63443 --agree-tos</p>
<p>le fichier conf de Let's Encrypt</p>
<div class="highlight"><pre><span></span><code><span class="err">rsa-key-size = 4096</span>
<span class="err">email = ppb@itgreen.fr</span>
<span class="err">authenticator = standalone</span>
<span class="err">standalone-supported-challenges = http-01</span>
</code></pre></div>
<p>Par contre Let's Encrypt génère bien 2 clefs une csr et une keys.<br>
Je peut aussi envoyer un schéma format svg de l'instal.<br>
Bonne et Belle journée <br>
Pierre-Philippe </p>Posted by: Victor2016-03-02T21:56:00+01:002016-03-02T21:56:00+01:00Victortag:blog.victor-hery.com,2016-03-02:/2015/12/utiliser-letsencrypt-haproxy.html//comment_2md<p>Hello Pierre Philippe,</p>
<p>Le concept de Let's Encrypt est de créer un certificat tout ce qu'il y a de plus classique. Ici, l'astuce est que normalement, tes DNS pointent sur ton haproxy, puisque c'est lui qui route ensuite via les ACL vers les backend.<br>
C'est donc lui qui doit posséder …</p><p>Hello Pierre Philippe,</p>
<p>Le concept de Let's Encrypt est de créer un certificat tout ce qu'il y a de plus classique. Ici, l'astuce est que normalement, tes DNS pointent sur ton haproxy, puisque c'est lui qui route ensuite via les ACL vers les backend.<br>
C'est donc lui qui doit posséder le certificat HTTPS pour le servir aux visiteurs. En l'occurence, haproxy va déchiffrer le flux avec le certificat, puis envoyer le flux non chiffré vers les backend. (Il est possible de rechiffrer le flux avant de l'envoyer, mais ce n'est pas le sujet)</p>
<p>Donc normalement, tu dois utiliser comme nom de domaine celui pour lequel tu veux un certificat, et lancer let's encrypt depuis le serveur en question. Il faut également (si tu as plusieurs adresses IP sur le haproxy), que haproxy écoute sur l'adresse où Let's encrypt va envoyer la requête de vérification. </p>
<p>Voila pour le concept :)</p>
<p>Ensuite pour ton problème plus précisément, à première vue ta configuration semble correct. Le invalid key semble montrer que let's encrypt n'est pas content de la clef généré, mais pourtant c'est lui même qui la génère.<br>
Est ce que tu as modifié la configuration de Let's Encrypt pour générer une clef plus petite que 1024bits ?<br>
Egalement, quelle version d'openSSL utilise-tu ? Il est possible avec les différentes failles de sécurité sorties ces derniers temps que Let's Encrypt ait certain critères à ce propos même si je ne l'ai pas remarqué. </p>
<p>N'hésite pas à me préciser plus comment tu utilise Let's Encrypt, je pourrais peut être t'en dire plus :) (sur quel OS, la ligne exacte que tu lances, en cachant le domaien bien sur, la version d'openssl, etc)</p>
<p>Bon courage !</p>Posted by: Pierre-Philippe2016-03-02T20:55:00+01:002016-03-02T20:55:00+01:00Pierre-Philippetag:blog.victor-hery.com,2016-03-02:/2015/12/utiliser-letsencrypt-haproxy.html//comment_1md<p>Bonjour,<br>
Je ne comprend pas le principe, en gros Let's Encrypt génère une clef pour un site http qui n'existe pas, et quand une demande de redirection sur un site géré par Haproxy une authentification https géré avant le redirection vers un des sites redirigé par haproxy ?</p>
<p>Dans mon cas …</p><p>Bonjour,<br>
Je ne comprend pas le principe, en gros Let's Encrypt génère une clef pour un site http qui n'existe pas, et quand une demande de redirection sur un site géré par Haproxy une authentification https géré avant le redirection vers un des sites redirigé par haproxy ?</p>
<p>Dans mon cas haproxy identifie des sous domaines et redirige en fonction des réglés ecl sur des backends (adresse de sites).<br>
J'aurai aimé pouvoir avoir une authentification https unique puis redirection sur un des sites. </p>
<p>Donc je ne comprend pas comment identifier le serveur haproxy (domaine) pour qu'il soit reconnue par Let's Encrypt.<br>
Car le serveur haproxy n'a pas de nom de sous domaine identifier sur le net, il ne sert que d’aiguillage vers des serveurs http qui ont un nom de sous domaine identifié sur le net.<br>
quand je lance le scrypt de génération de certificat la réponse est: </p>
<p>Domain: xxx.ndm.dl ndm.dl est mon domaine <br>
xxx est un des sous domaine </p>
<div class="highlight"><pre><span></span><code><span class="n">Type</span><span class="o">:</span> <span class="n">unauthorized</span>
<span class="n">Detail</span><span class="o">:</span> <span class="n">Error</span> <span class="n">parsing</span> <span class="n">key</span> <span class="n">authorization</span> <span class="n">file</span><span class="o">:</span> <span class="n">Invalid</span> <span class="n">key</span>
<span class="n">authorization</span><span class="o">:</span> <span class="mi">9</span> <span class="n">parts</span>
<span class="n">To</span> <span class="n">fix</span> <span class="n">these</span> <span class="n">errors</span><span class="o">,</span> <span class="n">please</span> <span class="n">make</span> <span class="n">sure</span> <span class="n">that</span> <span class="n">your</span> <span class="n">domain</span> <span class="n">name</span> <span class="n">was</span>
<span class="n">entered</span> <span class="n">correctly</span> <span class="n">and</span> <span class="n">the</span> <span class="n">DNS</span> <span class="n">A</span> <span class="n">record</span><span class="o">(</span><span class="n">s</span><span class="o">)</span> <span class="k">for</span> <span class="n">that</span> <span class="n">domain</span>
<span class="n">contain</span><span class="o">(</span><span class="n">s</span><span class="o">)</span> <span class="n">the</span> <span class="n">right</span> <span class="n">IP</span> <span class="n">address</span><span class="o">.</span>
<span class="o">-</span> <span class="n">Your</span> <span class="n">account</span> <span class="n">credentials</span> <span class="n">have</span> <span class="n">been</span> <span class="n">saved</span> <span class="k">in</span> <span class="n">your</span> <span class="n">Let</span><span class="s1">'s Encrypt </span>
<span class="s1">configuration directory at /etc/letsencrypt. You should make a </span>
<span class="s1">secure backup of this folder now. This configuration directory will </span>
<span class="s1">also contain certificates and private keys obtained by Let'</span><span class="n">s</span>
<span class="n">Encrypt</span> <span class="n">so</span> <span class="n">making</span> <span class="n">regular</span> <span class="n">backups</span> <span class="n">of</span> <span class="k">this</span> <span class="n">folder</span> <span class="k">is</span> <span class="n">ideal</span>
</code></pre></div>
<p>donc je nage un peut <br>
Merci pour le tuto</p>Posted by: Arnaud2015-12-18T10:10:00+01:002015-12-18T10:10:00+01:00Arnaudtag:blog.victor-hery.com,2015-12-18:/2015/12/utiliser-letsencrypt-haproxy.html//comment_0md<p>Wha super article</p>