{"id":1622,"date":"2016-11-13T18:00:00","date_gmt":"2016-11-13T17:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=1622"},"modified":"2016-11-13T17:41:05","modified_gmt":"2016-11-13T16:41:05","slug":"ejabberd-mit-lets-encrypt-zertifikat","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/ejabberd-mit-lets-encrypt-zertifikat\/","title":{"rendered":"ejabberd mit Let&#8217;s Encrypt Zertifikat"},"content":{"rendered":"<p>In diesem Artikel wird dokumentiert, wie ein Let&#8217;s Encrypt[1. <a href=\"https:\/\/letsencrypt.org\/\">https:\/\/letsencrypt.org\/<\/a> {en}] [2. <a href=\"https:\/\/de.wikipedia.org\/wiki\/Let%E2%80%99s_Encrypt\">Let&#8217;s Encrypt &#8211; Wikipedia<\/a>] Zertifikat f\u00fcr ejabberd eingerichtet werden kann. Dabei st\u00fctze ich mich auf mein TLS-Kochbuch[3. <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2016\/08\/TLS-Kochbuch.pdf\">TLS\/SSL Kochbuch: Rezepte f\u00fcr die Verwendung von OpenSSL, HTTP Strict Transport Security (HSTS) und HTTP Public Key Pinning (HPKP)<\/a>].<\/p>\n<p>Die Dokumentation bezieht sich dabei auf meine konkrete Installation und ist nicht ohne Transferleistung auf andere Installationen \u00fcbertragbar. Es ist also keine Schritt-f\u00fcr-Schritt-Anleitung! Der Artikel bietet \u00fcber die Dokumentation hinaus jedoch auch Hintergrundinformationen und Wissenswertes f\u00fcr abweichende Konfigurationen.<\/p>\n<h2>Ausgangssituation<\/h2>\n<p>In meiner Umgebung ist ejabberd auf einem Ubuntu Server 14.04 LTS[4. <a href=\"https:\/\/wiki.ubuntuusers.de\/Trusty%20Tahr\/\">Trusty Tahr &#8211; wiki.ubuntuusers.de<\/a>] installiert und nutzt ein TLS-Zertifikat von CAcert[5. <a href=\"https:\/\/www.cacert.org\/\">https:\/\/www.cacert.org\/<\/a> {en}] [6. <a href=\"https:\/\/de.wikipedia.org\/wiki\/CAcert\">CAcert &#8211; Wikipedia<\/a>].<\/p>\n<p>Au\u00dfer ejabberd l\u00e4uft auf dem Server auch noch ein Webserver, welcher verschiedene Webseiten ausliefert.<\/p>\n<p>Daneben ist bereits der Let&#8217;s Encrypt Client acme-tiny[7. <a href=\"https:\/\/github.com\/Tronde\/acme-tiny\">Fork des acme-tiny Clients auf GitHub<\/a> {en}] installiert, dessen Verwendung in Abschnitt 3.6.2 TLS-Kochbuch erl\u00e4utert wird.<\/p>\n<h2>Der Ablauf im \u00dcberblick<\/h2>\n<p>Wie vorstehend bereits erw\u00e4hnt, verwendet ejabberd bereits ein TLS-Zertifikat, welches nun durch ein Let&#8217;s Encrypt Zertifikat ersetzt werden soll. Der Ablauf gliedert sich dabei im Wesentlichen in zwei Teile. Zuerst wird ein Let&#8217;s Encrypt Zertifikat f\u00fcr den Hostnamen des ejabberd-Servers ausgestellt. Anschlie\u00dfend wird ejabberd konfiguriert, um zuk\u00fcnftig dieses Zertifikat zu nutzen.<\/p>\n<p>Zur Durchf\u00fchrung der Domainvalidierung wird ein VirtualHost f\u00fcr den Hostnamen des ejabberd-Servers konfiguriert. Da sich die genaue Konfiguration je nach verwendeter Webserver-Software unterscheidet, wird hier nicht n\u00e4her darauf eingegangen, sondern auf die Dokumentation des jeweiligen Webservers verwiesen.<\/p>\n<h3>Generierung des TLS-Zertifikats<\/h3>\n<p>Nun wird mit Hilfe von OpenSSL[8. <a href=\"https:\/\/www.openssl.org\/\">OpenSSL: Cryptography and SSL\/TLS Toolkit<\/a> {en}] [9. <a href=\"https:\/\/de.wikipedia.org\/wiki\/OpenSSL\">OpenSSL &#8211; Wikipedia<\/a>] ein privater Schl\u00fcssel und eine Zertifikatsanfrage (engl. Certificate Signing Request (CSR)) erstellt. Beide Schritte werden ausf\u00fchrlich in <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2016\/08\/TLS-Kochbuch.pdf\" target=\"_blank\">Abschnitt 3.1 TLS-Kochbuch<\/a> beschrieben.<\/p>\n<p>Ich pers\u00f6nlich generiere den privaten Schl\u00fcssel und den CSR stets offline auf einem sicheren Computer. Anschlie\u00dfend lade ich sie zum Server hoch. Die Zugriffsrechte auf den Schl\u00fcssel sind so eingeschr\u00e4nkt, dass nur root und der Benutzer, unter dem der Webserver ausgef\u00fchrt wird, diesen Schl\u00fcssel lesen d\u00fcrfen.<\/p>\n<p>Da bereits eine Installation von acme-tiny auf dem Server existiert und bereits ein Account-Key erstellt wurde, wird dieser in dem Verzeichnis verlinkt, in dem auch der private Schl\u00fcssel und der CSR liegen.<\/p>\n<p>Nun kann das TLS-Zertifikat angefordert werden. Wie dies im Detail funktioniert, wird in <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/wp-content\/uploads\/2016\/08\/TLS-Kochbuch.pdf\" target=\"_blank\">Abschnitt 3.6.2 im TLS-Kochbuch<\/a> beschrieben.<\/p>\n<p>Sind bis hier alle Schritte erfolgreich gewesen, liegen nun Schl\u00fcssel und Zertifikat in einem Verzeichnis vor.<br \/>\n<code><br \/>\n$ python acme-tiny\/acme_tiny.py --account-key \/var\/www\/sites\/ssl\/account.key --csr \/var\/www\/sites\/ssl\/request.csr --acme-dir \/var\/www\/sites\/public\/.well-known\/acme-challenge\/ &gt; \/var\/www\/sites\/ssl\/cert.crt<br \/>\nParsing account key...<br \/>\nParsing CSR...<br \/>\nRegistering account...<br \/>\nAlready registered!<br \/>\nVerifying fqdn...<br \/>\nfqdn verified!<br \/>\nSigning certificate...<br \/>\nCertificate signed!<\/code><\/p>\n<p>$ ls -l \/var\/www\/sites\/ssl\/<br \/>\n-rw-r&#8212;&#8211; 4 root root account.key<br \/>\n-rw-r&#8212;&#8211; 1 root www-data cert.crt<br \/>\n-rw-r&#8212;&#8211; 1 root root priv.key<br \/>\n-rw-r&#8212;&#8211; 1 root root request.csr<\/p>\n<h3>Zertifikat f\u00fcr ejabberd pr\u00e4parieren<\/h3>\n<p>Der Dienst ejabberd erwartet, dass der private Schl\u00fcssel, das Zertifikat und die Zertifikatskette in einer Datei \u00fcbergeben werden.[10. <a href=\"https:\/\/raymii.org\/s\/tutorials\/Ejabberd_SSL_Certificate.html\">Ejabberd SSL Certificate &#8211; Raymii.org<\/a> {en}] Dazu wird noch die Zertifikatskette von Let&#8217;s Encrpyt[11. <a href=\"https:\/\/letsencrypt.org\/certificates\/\">Let&#8217;s Encrypt: Chain of Trust<\/a> {en}] heruntergeladen und ebenfalls in <em>\/var\/www\/sites\/ssl\/<\/em> gespeichert.<\/p>\n<p>Das folgende Skript zeigt, wie das Zertifikat erzeugt, die Zertifikatsdatei f\u00fcr ejabberd zusammengesetzt und der Dienst neugestartet wird:<br \/>\n<code><br \/>\n#!\/bin\/bash<br \/>\n# Datum: 2016-11-13<br \/>\n# Autor: Joerg Kastning &lt;webmaster(aet)my-it-brain(Punkt)de&gt;<br \/>\n#<br \/>\n# Beschreibung:<br \/>\n# Dieses Skript dient der Erneuerung des TLS-Zertifikats fuer<br \/>\n# jabber.my-it-brain.de \u00fcber Let's Encrypt mit dem Client acme-tiny-by-frezbo.<\/p>\n<p>DIR='\/var\/www\/sites\/ssl'<\/p>\n<p># Erneuerung des Zertifikats<br \/>\npython acme-tiny-by-frezbo\/acme_tiny.py --account-key ${DIR}\/account.key --csr ${DIR}\/request.csr --acme-dir \/var\/www\/sites\/fqdn\/.well-known\/acme-challenge\/ &gt; ${DIR}\/cert.crt<\/p>\n<p># Erzeugung der Zertifikatsdatei fuer ejabberd<br \/>\ncat ${DIR}\/priv.key ${DIR}\/cert.crt ${DIR}\/lets-encrypt-x3-cross-signed.pem &gt;${DIR}\/ejabberd_cert.pem<\/p>\n<p>sudo chown root:ejabberd ${DIR}\/ejabberd_cert.pem<br \/>\nsudo chmod 0640 ${DIR}\/ejabberd_cert.pem<br \/>\nsudo mv ${DIR}\/ejabberd_cert.pem \/etc\/ejabberd\/ejabberd_cert.pem<\/p>\n<p># Neustart von ejabberd<br \/>\nsudo service ejabberd restart<br \/>\n<\/code><\/p>\n<h2>Abschluss der Migration<\/h2>\n<p>Durch den im vorangegangenen Abschnitt dargestellten Code wird das neue Let&#8217;s Encrypt Zertifikat an der gleichen Stelle und unter dem gleichen Dateinamen wie das alte Zertifikat abgelegt. Auf diese Weise muss die Konfiguration von ejabberd nicht weiter angepasst werden. Der Dienst l\u00e4dt nach einem Neustart das neue Zertifikat. Die Migration ist damit abgeschlossen.<\/p>\n<p>Let&#8217;s Encrypt Zertifikate besitzen eine G\u00fcltigkeit von 90 Tagen.[12. <a href=\"https:\/\/letsencrypt.org\/2015\/11\/09\/why-90-days.html\">Let&#8217;s Encrypt: Why ninety-day lifetimes for certificates?<\/a> {en}] Um die Erneuerung des Zertifikats zu automatisieren, wird das Skript &#8222;SmartRenew.sh&#8220; verwendet (siehe Abschnitt 5.4 im TLS-Kochbuch).<\/p>\n<p><strong>Quellen und weiterf\u00fchrende Links:<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel wird dokumentiert, wie ein Let&#8217;s Encrypt[1. https:\/\/letsencrypt.org\/ {en}] [2. Let&#8217;s Encrypt &#8211; Wikipedia] Zertifikat f\u00fcr ejabberd eingerichtet werden kann. Dabei st\u00fctze ich mich auf mein TLS-Kochbuch[3. TLS\/SSL Kochbuch: Rezepte f\u00fcr die Verwendung von OpenSSL, HTTP Strict Transport Security (HSTS) und HTTP Public Key Pinning (HPKP)]. Die Dokumentation bezieht sich dabei auf meine<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/ejabberd-mit-lets-encrypt-zertifikat\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[1,51],"tags":[435,436,379,415,430,305,318,417,418],"class_list":["post-1622","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-linux","tag-acme-tiny","tag-ejabberd","tag-lets-encrypt","tag-openssl","tag-osbn","tag-planet","tag-ssl","tag-tls","tag-zertifikate"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1622"}],"version-history":[{"count":12,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1622\/revisions"}],"predecessor-version":[{"id":1634,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/1622\/revisions\/1634"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}