dhach.acme_letsencrypt

acme-letsencrypt

CI release Ansible Galaxy

Überblick

Dies ist eine reine Ansible-Rolle, um Folgendes zu erreichen:

  • Erstellen Sie ECC- oder RSA-Privatschlüssel
  • Generieren Sie Zertifikatanfragen (für mehrere Domains)
  • Senden Sie die Anfrage an Let's Encrypt oder einen anderen ACME-Anbieter Ihrer Wahl
  • Installieren Sie alle Dateien an einem vorhersehbaren Ort

Ich habe diese Rolle geschrieben, um Let's Encrypt-Zertifikate zu erhalten, ohne auf Drittanbieter-Tools (wie certbot, acme-tiny, acme.sh usw.) angewiesen zu sein und mehr Kontrolle darüber zu haben, was passiert.

Derzeit wird nur der HTTP-Herausforderungstyp unterstützt.

Da dies nur eine Ansible-Rolle ist, kümmert sie sich nicht um die automatische Zertifikatsverlängerung. Um dies zu erreichen, können Sie diese Rolle entweder regelmäßig aus Ihrer CI/CD-Pipeline ausführen oder im Ansible Pull-Modus mit einem Crontab arbeiten.

Ansible-Version

Diese Rolle ist ab Version 2.0.0 nur mit Ansible >=2.10 kompatibel.

Wenn Sie Kompatibilität mit <2.10 benötigen (auch bekannt als "pre-collections"), verwenden Sie jede Version mit einem 1.x.x-Tag.

Anforderungen

Auf dem Zielhost:

  • openssl

Beispiele für Playbooks

Verwendung eines secp384r1 ECC-Schlüssels für ein SAN-Zertifikat (mehrere Domains).

- name: "Zertifikate für webserver01 abrufen"
  hosts: webserver01
  become: true
  roles:
    - dhach.acme_letsencrypt
  vars:
    le_base_directory: /etc/letsencrypt
    le_certificates:
      - name: ecc.example.com
        domains:
          - secp.example.com
          - ecc.example.com
        key:
          curve: secp384r1

Nun verwenden Sie einen secp256r1-Schlüssel, lassen ihn gewaltsam neu erstellen und senden dann die Anfrage an den Produktionsvalidierungsserver von Let's Encrypt:

- name: "Zertifikate für webserver02 abrufen"
  hosts: webserver02
  become: true
  roles:
    - dhach.acme_letsencrypt
  vars:
    le_acme_directory: https://acme-v02.api.letsencrypt.org/directory
    le_certificates:
      - name: another-domain.example.com
        domains:
          - another-domain-abc.example.com
          - another-domain-def.example.com
          - another-domain-ghi.example.com
          - another-domain-jkl.example.com
          - another-domain-mno.example.com
        ssl:
          type: ECC
          curve: secp256r1
          renew: true

Oder verwenden Sie RSA-Schlüssel, um jeweils ein Zertifikat für jede Domain zu erhalten:

- name: "Zertifikate für webserver03 abrufen"
  hosts: webserver03
  become: true
  roles:
    - dhach.acme_letsencrypt
  vars:
    le_certificates:
      - name: example.com
        domains:
          - foo.example.com
        key:
          type: RSA
          size: 4096
      - name: more.example.com
        domains:
          - bar.example.com
        key:
           type: RSA
           size: 4096

Wo Sie die Dateien finden

Alle generierten Schlüssel, Zertifikatsanfragen und nachfolgenden Zertifikate finden Sie unter dem Wert von {{ le_base_directory }}/{{ le_certificates['name'] }}.

Zum Beispiel, wenn Sie einen name von 'example.com' angeben und le_base_directory auf '/etc/letsencrypt/' gesetzt ist, wäre das Ergebnis:

/etc/letsencrypt/example.com/
├── domain.csr
├── domain.key
├── domain.pem
├── fullchain.pem
└── intermediate.pem

So konfigurieren Sie Ihren Webserver

ACME-Server verlangen, dass Sie eine Herausforderung beantworten, indem Sie eine Datei mit einem bestimmten Namen und Inhalt in einem vordefinierten Pfad ablegen, den Ihr Webserver über HTTP bereitstellt.

Ihr Webserver muss den Speicherort /.well-known/acme-challenge mit dem Inhalt des folgenden Verzeichnisses bereitstellen: {{ le_base_directory }}/.well-known/acme-challenge/.

Beispiele bei Verwendung des Standardwerts für le_base_directory:

Nginx:

location /.well-known/acme-challenge {
    alias /etc/letsencrypt/.well-known/acme-challenge/;

}

Apache:

Alias /.well-known/acme-challenge/ "/etc/letsencrypt/.well-known/acme-challenge/"
<Directory "/etc/letsencrypt/.well-known/acme-challenge/">
    AllowOverride None
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

Rollenvariablen und Standardwerte

Alle definierten Variablen sind unten aufgelistet, mit den jeweiligen Standardvariablen.

Zertifikatsanfragen

Sie können steuern, für welche Domains das Zertifikat angefragt werden soll. Sie haben auch die Möglichkeit, Details zur Schlüsselerstellung anzugeben. Die Optionen unterscheiden sich leicht zwischen RSA- und ECC-Schlüsseln.

Alle Zertifikatsanfragen werden als SAN (SubjectAltName) Anfragen konstruiert.

ECC:

le_certificates:
  - name: example.com  # im Wesentlichen ein interner Bezeichner und wo die Datei gespeichert werden soll
    domains:  # eine Liste von Domains, für die das Zertifikat ausgestellt werden soll
      - foo.example.com
      - bar.example.com
    key:  # Details für den privaten Schlüssel, falls einer generiert werden soll
      type: ECC  # (obligatorisch) Unterstützte Typen: ECC, RSA
      curve: secp384r1  # (optional | Standard: secp384r1) Kurve für ECC-Schlüssel (hat keinen Einfluss auf RSA-Schlüssel).
      renew: false  # (optional | Standard: false) Ob der Schlüssel gewaltsam neu erstellt werden soll. Es wird immer ein Backup gehalten.

RSA:

le_certificates:
  - name: example.com  # im Wesentlichen ein interner Bezeichner und wo die Datei gespeichert werden soll
    domains:  # eine Liste von Domains, für die das Zertifikat ausgestellt werden soll
      - foo.example.com
      - bar.example.com
    key:  # Details für den privaten Schlüssel, falls einer generiert werden soll
      type: RSA  # (obligatorisch) Unterstützte Typen: ECC, RSA
      size: 4096  # (optional | Standard: 4096) Länge des RSA-Schlüssels (hat keinen Einfluss auf ECC-Schlüssel)
      renew: false  # (optional | Standard: false) Ob der Schlüssel gewaltsam neu erstellt werden soll. Es wird immer ein Backup gehalten.

Verzeichnisse und Berechtigungen

le_base_directory: Das Basisverzeichnis, in dem alle generierten Dateien abgelegt werden (Standard: /etc/letsencrypt)

le_files_owner: Wer die generierten Dateien und Ordner besitzen soll (Standard: root)

le_files_group: Zu welcher Gruppe die generierten Dateien und Ordner gehören sollen (Standard: root)

Let's Encrypt-Kontoinformationen

le_account_key_path: Wo der Let's Encrypt-Kontoinhaber-Schlüssel abgelegt (oder gefunden) werden soll (Standard: "{{ le_base_directory }}/account.key")

le_account_key_type: Welchen Schlüsseltpy (RSA, ECC) soll für den Kontoinhaber verwendet werden (Standard: RSA)

le_account_key_size: Die Größe des Schlüssels. Nur für RSA-Schlüssel. (Standard: 4096)

le_account_key_curve: Welche Kurve verwendet werden soll. Nur für ECC-Schlüssel, hat keinen Einfluss auf RSA-Schlüssel. (Standard: secp384r1)

le_account_key_regenerate: Ob ein vorhandener Schlüssel neu generiert werden soll oder nicht. Ein Backup wird behalten. (Standard: false)

Leider unterstützt Let's Encrypt ECC-Kontoinhaber-Schlüssel nicht direkt. Am besten bleibt es bei RSA 4096.

Let's Encrypt / ACME-Version und Verzeichnis

le_acme_version: ACME-Version, die verwendet werden soll. Dies kann notwendig sein, wenn Sie einen anderen Anbieter als Let's Encrypt verwenden (Standard: 2)

le_acme_directory: Die ACME-Verzeichnis-URL, um Zertifikate anzufordern. Aus Sicherheitsgründen ist der Standard auf das Let's Encrypt-Staging gesetzt (Standard: https://acme-staging-v02.api.letsencrypt.org/directory)

Das Produktionsverzeichnis von Let's Encrypt ist: https://acme-v02.api.letsencrypt.org/directory.

le_renew_if_invalid_after: Versuchen Sie, die Zertifikate zu verlängern, wenn sie weniger als diese Anzahl an Tagen gültig sind (Standard: 30)

le_force_renew: Versuchen Sie, die Zertifikate gewaltsam zu verlängern (Standard: false)

le_csr_only: Wenn Sie nur private Schlüssel und CSRs generiert haben möchten, setzen Sie dies auf true. Kann nützlich für Debugging sein. (Standard: false)

Mitwirken und Probleme

Alle Beiträge sind willkommen. Zögern Sie nicht, Probleme zu melden oder Pull-Requests zu erstellen.

Ich werde gerne alle gemeldeten Probleme prüfen und immer versuchen, die Rolle zu verbessern.

Testen

Alle Tests werden mit Molecule durchgeführt.

Eine CI-Pipeline wird mit GitHub Actions realisiert und verwendet eine Matrixstrategie, die auf Ubuntu, Debian und CentOS testet.

Um mit lokalen Tests zu beginnen, richten Sie eine lokale Python-Umgebung ein, installieren Sie alle Abhängigkeiten und führen Sie die Tests aus. Hierfür ist Docker auf Ihrem Computer installiert erforderlich (oder die Verwendung von Docker-Machine):

python3 -m venv venv
source venv/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -r test-requirements.txt

molecule test

Da diese Rolle im Wesentlichen Anfragen an einen ACME-Server stellt und daher Kontrolle über eine Domain benötigt, um dynamisch einen DNS-Eintrag festzulegen, sind die Tests auf Linting, Überprüfung der Erstellung von Schlüsseln und CSRs und deren Inhalt beschränkt.

Das Testen der gesamten Rolle mit allen Funktionen erfolgt gegen den Staging-Server von Let's Encrypt auf einer tatsächlichen, mit dem Internet verbundenen Maschine, jedoch manuell.

Lizenz

GNU General Public License v3.0

Über das Projekt

Requests certificates from Let's Encrypt (or another ACME server)

Installieren
ansible-galaxy install dhach.acme_letsencrypt
GitHub Repository
Lizenz
gpl-3.0
Downloads
103
Besitzer