Auf dem Weg zur SSL-Automatisierung

Sehr oft müssen wir mit SSL-Zertifikaten arbeiten. Erinnern wir uns an den Prozess des Erstellens und Installierens eines Zertifikats (im Allgemeinen für die meisten).


  • Finden Sie einen Anbieter (eine Website, auf der wir SSL kaufen können).
  • CSR generieren.
  • Senden Sie es an Ihren Provider.
  • Überprüfen Sie die Domain-Inhaberschaft.
  • Holen Sie sich ein Zertifikat.
  • Konvertieren Sie das Zertifikat in das gewünschte Formular (optional). Zum Beispiel von pem zu PKCS # 12.
  • Installieren Sie das Zertifikat auf dem Webserver.

Relativ schnell, unkompliziert und verständlich. Diese Option ist sehr gut geeignet, wenn wir maximal ein Dutzend Projekte haben. Und wenn es mehr gibt und sie mindestens drei Umgebungen haben? Klassische Entwicklung - Inszenierung - Produktion. In diesem Fall sollten Sie darüber nachdenken, diesen Prozess zu automatisieren. Ich schlage vor, dass Sie sich eingehender mit dem Problem befassen und eine Lösung finden, die den Zeitaufwand für das Erstellen und Verwalten von Zertifikaten in Zukunft minimiert. Der Artikel enthält eine Analyse des Problems und eine kleine Anleitung zur Wiederholung.


Ich werde im Voraus reservieren: Die Hauptspezialisierung unseres Unternehmens ist .net und dementsprechend IIS und andere Windows-Versionen. Daher werden der ACME-Client und alle Aktionen für ihn auch in Bezug auf die Verwendung von Fenstern beschrieben.


Für wen ist dies relevant und einige Quelldaten


Firma K vertreten durch den Autor. URL (zum Beispiel): company.tld


Projekt X ist eines unserer Projekte, bei denen ich zu dem Schluss gekommen bin, dass wir bei der Arbeit mit Zertifikaten trotzdem maximale Zeitersparnis erreichen müssen. Dieses Projekt verfügt über vier Umgebungen: Entwicklung, Test, Bereitstellung und Produktion. Entwicklung und Test sind auf unserer Seite, Inszenierung und Produktion auf der Kundenseite.


Ein Merkmal des Projekts ist, dass es eine große Anzahl von Modulen enthält, die als Unterdomänen verfügbar sind.


Das heißt, wir haben das folgende Bild:


DevTestInszenierungProduktion
projectX.dev.company.tldprojectX.test.company.tldstaging.projectX.tldprojectX.tld
module1.projectX.dev.company.tldmodule1.projectX.test.company.tldmodule1.staging.projectX.tldmodule1.projectX.tld
module2.projectX.dev.company.tldmodule2.projectX.test.company.tldmodule2.staging.projectX.tldmodule2.projectX.tld
............
moduleN.projectX.dev.company.tldmoduleN.projectX.test.company.tldmoduleN.staging.projectX.tldmoduleN.projectX.tld

Für die Produktion wird das gekaufte Wildcard-Zertifikat verwendet, es gibt keine Fragen. Es wird jedoch nur die erste Ebene der Unterdomäne abgedeckt. Wenn also ein Zertifikat für * .projectX.tld vorhanden ist, funktioniert es für staging.projectX.tld, für module1.staging.projectX.tld jedoch bereits nicht. Aber ich habe keine Lust, ein separates zu kaufen.


Und dies ist nur ein Beispiel für ein Projekt eines Unternehmens. Und das Projekt ist natürlich keines.


Häufige Gründe, warum sich jeder mit diesem Problem befasst, sehen etwa so aus:


  • In jüngerer Zeit hat Google vorgeschlagen, die maximale Gültigkeitsdauer von SSL-Zertifikaten zu verringern . Mit allen Konsequenzen.
  • Erleichterung der Ausstellung und Aufrechterhaltung von SSL für die internen Anforderungen von Projekten und des gesamten Unternehmens.
  • Durch die zentrale Speicherung von Zertifikatseinträgen wird das Problem der Domänenüberprüfung mithilfe von DNS und nachfolgender automatischer Updates teilweise behoben und das Problem der Client-Vertrauenswürdigkeit behoben. Nichtsdestotrotz verursacht CNAME mehr Vertrauen auf dem Server des Partner- / Auftragnehmerunternehmens als auf einer Drittanbieter-Ressource.
  • Nun, schließlich passt in diesem Fall der Satz „Besser haben als nicht haben“ perfekt.

Auswählen eines SSL-Anbieters und vorbereitende Schritte


Von den verfügbaren Optionen für kostenlose SSL-Zertifikate wurden Cloudflare und Letsencrypt berücksichtigt. Das DNS für dieses (und einige andere Projekte) wird auf Cloudflare gehostet, aber ich bin kein Fan davon, ihre Zertifikate zu verwenden. Daher wurde beschlossen, letsencrypt zu verwenden.
Um ein Platzhalter-SSL-Zertifikat zu erstellen, müssen Sie den Besitz der Domain bestätigen. Bei diesem Verfahren wird ein DNS-Eintrag (TXT oder CNAME) erstellt und anschließend bei der Ausstellung eines Zertifikats überprüft. Linux hat ein Hilfsprogramm namens certbot , mit dem Sie diesen Prozess teilweise (oder für einige DNS-Anbieter vollständig) automatisieren können. Von den gefundenen und getesteten ACME- Clientoptionen für Windows habe ich mich für WinACME entschieden .


Wenn der Datensatz für die Domain erstellt ist, fahren wir mit der Erstellung des Zertifikats fort:


Bild


Uns interessiert die letzte Schlussfolgerung, nämlich die verfügbaren Optionen zur Überprüfung des Domainbesitzes für die Ausstellung eines Wildcard-Zertifikats:


  1. Manuelles Erstellen von DNS-Einträgen (automatische Aktualisierung wird nicht unterstützt)
  2. Erstellen von DNS-Einträgen mit dem acme-dns-Server (weitere Details finden Sie hier .
  3. Erstellen von DNS-Einträgen mit Ihrem eigenen Skript (analog zum Cloudflare-Plugin für certbot).

Auf den ersten Blick ist der dritte Punkt durchaus geeignet, aber ob der DNS-Provider diese Funktionalität nicht unterstützt? Und wir brauchen einen allgemeinen Fall. Im Allgemeinen handelt es sich um CNAME-Einträge, die alle unterstützt werden. Aus diesem Grund halten wir bei Punkt 2 an und konfigurieren unseren ACME-DNS-Server.


Konfigurieren des ACME-DNS-Server- und Zertifikatausstellungsprozesses


Ich habe zum Beispiel die Domain 2nd.pp.ua erstellt und werde sie in Zukunft verwenden.


Voraussetzung für den ordnungsgemäßen Betrieb des Servers ist die Erstellung von NS- und A-Records für seine Domain. Und der erste unangenehme Moment, auf den ich gestoßen bin - Cloudflare (zumindest im kostenlosen Modus) ermöglicht es Ihnen nicht, gleichzeitig einen NS- und einen A-Datensatz für denselben Host zu erstellen. Nicht, dass es ein Problem gewesen wäre, aber beim Binden ist es möglich. Der Support antwortete, dass das Panel dies nicht zulasse. Es spielt keine Rolle, zwei Einträge zu erstellen:


acmens.2nd.pp.ua. IN A 35.237.128.147 acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua. 

Zu diesem Zeitpunkt sollte der Host acmens.2nd.pp.ua werden.


 $ ping acmens.2nd.pp.ua PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data 

acme.2nd.pp.ua wird jedoch nicht aufgelöst, da der DNS-Server, der es bedient, noch nicht ausgeführt wird.


Datensätze werden erstellt. Gehen Sie zum Konfigurieren und Ausführen des ACME-DNS-Servers. Ich werde es live auf dem Ubuntu-Server im Docker- Container haben, aber Sie können es überall dort ausführen, wo es Golang gibt. Windows ist auch in Ordnung, aber ich bevorzuge immer noch einen Linux-Server.


Erstellen Sie die erforderlichen Verzeichnisse und Dateien:


 $ mkdir config $ mkdir data $ touch config/config.cfg 

Nutzen Sie den Vorteil vim Ihren bevorzugten Texteditor und fügen Sie eine Beispielkonfiguration in die Datei config.cfg ein.


Um erfolgreich zu sein, müssen Sie nur die Abschnitte general und api optimieren:


 [general] listen = "0.0.0.0:53" protocol = "both" domain = "acme.2nd.pp.ua" nsname = "acmens.2nd.pp.ua" nsadmin = "admin.2nd.pp.ua" records = "acme.2nd.pp.ua. A 35.237.128.147", "acme.2nd.pp.ua. NS acmens.2nd.pp.ua.", ] ... [api] ... tls = "letsencrypt" … 

Erstellen Sie bei Bedarf auch eine Docker-Compose-Datei im Hauptverzeichnis des Dienstes:


 version: '3.7' services: acmedns: image: joohoi/acme-dns:latest ports: - "443:443" - "53:53" - "53:53/udp" - "80:80" volumes: - ./config:/etc/acme-dns:ro - ./data:/var/lib/acme-dns 

Fertig Du kannst rennen.


 $ docker-compose up -d 

Zu diesem Zeitpunkt sollte der Host acme.2nd.pp.ua mit der acme.2nd.pp.ua beginnen und 404 auf https://acme.2nd.pp.ua acme.2nd.pp.ua werden


 $ ping acme.2nd.pp.ua PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data. $ curl https://acme.2nd.pp.ua 404 page not found 

Wenn dies nicht angezeigt wird - docker logs -f <container_name> zur Hilfe, sind die Protokolle glücklicherweise gut lesbar.


Wir können anfangen, ein Zertifikat zu erstellen. Öffne Powershell als Administrator und starte winacme. Wir sind an der Wahl interessiert:


  • M: Neues Zertifikat erstellen (volle Optionen)
  • 2: Manuelle Eingabe
  • 2: [DNS-01] Bestätigungsdatensätze mit ACME-DNS erstellen ( https://github.com/joohoi/acme-dns )
  • Auf die Frage nach dem Link zum ACME-DNS-Server geben wir als Antwort die URL des erstellten Servers (https) ein. URL des acme-dns-Servers: https://acme.2nd.pp.ua

Auf dem Server gibt der Client einen Eintrag aus, der dem vorhandenen DNS-Server hinzugefügt werden muss (einmaliges Verfahren):


 [INFO] Creating new acme-dns registration for domain 1nd.pp.ua Domain: 1nd.pp.ua Record: _acme-challenge.1nd.pp.ua Type: CNAME Content: c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua. Note: Some DNS control panels add the final dot automatically. Only one is required. 

Bild


Wir erstellen den erforderlichen Datensatz und stellen sicher, dass er korrekt erstellt wurde:


Bild


 $ dig CNAME _acme-challenge.1nd.pp.ua +short c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua. 

Wir bestätigen, dass wir den erforderlichen Eintrag in winacme erstellt haben, und setzen den Erstellungsprozess des Zertifikats fort:


Bild


Hier wird beschrieben, wie Sie certbot als Client verwenden.


Damit ist die Erstellung eines Zertifikats abgeschlossen. Sie können es auf einem Webserver installieren und verwenden. Wenn beim Erstellen eines Zertifikats auch eine Aufgabe im Scheduler erstellt wird, wird der Zertifikatserneuerungsprozess zukünftig automatisch durchgeführt.

Source: https://habr.com/ru/post/de483770/


All Articles