[PYTHON] ACME mit Alibaba Cloud verschlüsseln: Kontoschlüssel, Zertifikatschlüssel, Zertifikatsignierungsanforderung erstellen

In diesem mehrteiligen Artikel erfahren Sie, wie Sie die Let's Encrypt ACME Version 2-API mit ** Python ** für ** SSL-Zertifikate ** verwenden.

Kontoschlüssel

Der Kontoschlüssel wird verwendet, um die ID des Kontos anzugeben, das die Zertifikatdienste anfordert. Es wird keine Methode wie Login / Passwort verwendet. Es ist sehr wichtig, dass Sie Ihr Kontoschlüsselpaar an einem sicheren Ort aufbewahren, da der Kontoschlüssel zum Ausstellen, Erneuern und Widerrufen Ihres SSL-Zertifikats verwendet wird. Wenn Sie Ihren Kontoschlüssel verlieren, werden die unter diesem Konto erstellten Zertifikate zurückgestellt. Diese Zertifikate können nicht erneuert oder widerrufen werden. In diesem Fall müssen Sie einen neuen Kontoschlüssel erstellen und anstelle des verlorenen Zertifikats ein neues SSL-Zertifikat ausstellen. Wenn ein böswilliger Dritter Zugriff auf Ihren Kontoschlüssel erhält, können Sie die E-Mail-Adresse Ihres Kontakts ändern und Ihr Zertifikat widerrufen. Sie können kein neues SSL-Zertifikat für Ihre Domain ausstellen, da hierfür eine HTTP- oder DNS-Überprüfung Ihres Domainnamens erforderlich ist.

Es konnte keine Dokumentation zur Größe des privaten Schlüssels gefunden werden. Ich teste mit einer 4096-Bit-Schlüsselgröße und das funktioniert gut.

Es gibt viele Möglichkeiten, einen Kontoschlüssel zu erstellen. Schauen wir uns zwei Möglichkeiten an: Die eine besteht darin, ein Python-Programm zu schreiben, und die andere darin, OpenSSL über die Befehlszeile zu verwenden. Enthält ein Beispiel für die Verwendung des privaten Schlüssels.

In diesem Beispiel wird die OpenSSL-Python-Bibliothek nicht verwendet. In diesem Beispiel wird die Kryptobibliothek verwendet, wodurch das Erstellen eines privaten Schlüssels sehr einfach ist. Im folgenden Beispiel wird openssl verwendet, das komplexer ist, aber mehr Optionen bietet.

make_account_key.py

""" Let's Encrypt ACME Version 2 Examples - Create Account Key """

from Crypto.PublicKey import RSA

filename = 'account.key'

key = RSA.generate(4096)

with open(filename,'w') as f:
    f.write(key.exportKey().decode('utf-8'))

make_account_key2.py

import sys
import OpenSSL
from OpenSSL import crypto

filename = 'account.key'

key = crypto.PKey()

key.generate_key(crypto.TYPE_RSA, 4096)

key_material = crypto.dump_privatekey(crypto.FILETYPE_PEM, key)

val = key_material.decode('utf-8')

with open("account.key", "wt") as f:
    f.write(val)

OpenSSL-Befehlszeilenbeispiel

openssl genrsa -out account.key 4096

OpenSSL-Befehlszeilenoptionen

1, genrsa - Generieren Sie den privaten RSA-Schlüssel (PKCS # 1-Format). 2, -out Dateiname - Gibt den Schlüssel für die angegebene Datei aus. 3,4096 - Die Größe des in Bits generierten privaten Schlüssels Zeigen Sie Details an und bestätigen Sie Ihren neuen Kontoschlüssel.

openssl rsa -in account.key -text -check -noout

Extrahieren Sie den öffentlichen Schlüssel aus dem privaten Schlüssel.

openssl rsa -pubout -in account.key -out account.pub

Zertifikatschlüssel

Ein Zertifikatschlüssel ist ein Schlüsselpaar, das zum Signieren einer CSR (Certificate Signing Request) verwendet wird. Dies ist kein Kontoschlüssel, obwohl beide Schlüsselpaare sind. Aus Sicherheitsgründen sollten Sie vermeiden, Ihren Kontoschlüssel in CSR zu signieren. Im Allgemeinen ist es üblich, für jedes SSL-Zertifikat einen neuen Zertifikatschlüssel zu erstellen.

Wiederholen Sie das obige Beispiel, um einen Zertifikatschlüssel zu erstellen. Der Unterschied besteht darin, dass der Dateiname der Domänenname ist, der das Zertifikat ausstellt. Ändern Sie "domain.com" in den Domainnamen.

make_certificate_key.py

""" Let's Encrypt ACME Version 2 Examples - Create Certificate Key """

from Crypto.PublicKey import RSA

domainname = "example.com"

filename = domainname + '.key'

key = RSA.generate(4096)

with open(filename,'w') as f:
    f.write(key.exportKey().decode('utf-8'))

OpenSSL-Befehlszeilenbeispiel.

openssl genrsa -out example.com.key 4096

OpenSSL-Befehlszeilenoption.

1, genrsa - Generieren Sie den privaten RSA-Schlüssel (PKCS # 1-Format). 2, -out Dateiname - Gibt den Schlüssel für die angegebene Datei aus. 3,4096 - Die Größe des in Bits generierten privaten Schlüssels

CSR-Zertifikatsignierungsanforderung

CSR ist eine Datei (Nachricht), die an CA (Certificate Authority - Let's Encrypt) gesendet wird, um ein SSL-Zertifikat zu beantragen. Die CSR enthält Details wie den Firmennamen, den Standort und den Domainnamen der Person, die das SSL-Zertifikat beantragt. Da Let's Encrypt nur ein DV-SSL-Zertifikat (Domain Validated) ausstellt, wird im generierten SSL-Zertifikat nur der Domänenname überprüft, nur der Domänenname und die Kontaktinformationen. Eine optionale E-Mail-Adresse für ist ebenfalls aufgeführt. Details wie Firmenname und Standort sind nicht enthalten.

Das Erstellen einer CSR ist mit OpenSSL einfach. Sie benötigen lediglich einen Domainnamen und optional eine E-Mail-Adresse. Im folgenden Beispiel wird domainName durch den Domainnamen und emailAddress durch die E-Mail-Adresse ersetzt.

In diesem Beispiel werden alle Betrefffelder wie C, ST, L, O und Organisationseinheit entfernt, die von Let's Encrypt nicht verarbeitet werden, und die für Chrome erforderliche Erweiterung subjectAltName hinzugefügt.

make_csr.py

""" Let's Encrypt ACME Version 2 Examples - Create CSR (Certificate Signing Request) """

importOpenSSL

KEY_FILE = "certificate.key"
CSR_FILE = "certificate.csr"

domainName = 'api.neoprime.xyz'
emailAddress = '[email protected]'

def create_csr(pkey, domain_name, email_address):
    """ Generate a certificate signing request """

    # create certificate request
    cert = OpenSSL.crypto.X509Req()

    # Add the email address
    cert.get_subject().emailAddress = email_address

    # Add the domain name
    cert.get_subject().CN = domain_name

        san_list = ["DNS:" + domain_name]

        cert.add_extensions([
                OpenSSL.crypto.X509Extension(
            b"subjectAltName",
            False,
            ", ".join(san_list).encode("utf-8"))
        ])

    cert.set_pubkey(pkey)
    cert.sign(pkey, 'sha256')

    return cert

# Load the Certicate Key
data = open(KEY_FILE, 'rt').read()

# Load the private key from the certificate.key file
pkey = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, data)

# Create the CSR
cert = create_csr(pkey, domainName, emailAddress)

# Write the CSR to a file in PEM format
with open(CSR_FILE,'wt') as f:
    data = OpenSSL.crypto.dump_certificate_request(OpenSSL.crypto.FILETYPE_PEM, cert)
    f.write(data.decode('utf-8'))

Überblick

[Teil 3](https://www.alibabacloud.com/blog/let%27s-encrypt-acme-with-alibaba-cloud-api-gateway-and-cdn-%E2%80%93-part-3_593783? spm = a2c65.11461447.0.0.66065dd78S1HZO) verwendet die Dateien account.key, certificate.key, certificate.csr, um das SSL-Zertifikat für Alibaba Cloud API Gateway und CDN, Let's Encrypt, zu generieren und zu installieren Jedes Element der ACME-API wird erläutert.

Recommended Posts

ACME mit Alibaba Cloud verschlüsseln: Kontoschlüssel, Zertifikatschlüssel, Zertifikatsignierungsanforderung erstellen
ACME mit Alibaba Cloud verschlüsseln: Erstellen Sie ACME-Endpunkte, Verzeichnisse und ACME-Konten
ACME mit Alibaba Cloud verschlüsseln: Erstellen Sie eine ACME-Anforderung und signieren Sie eine JWS-Nutzlast
ACME mit Alibaba Cloud verschlüsseln: Konzepte für SSL-Zertifikate
Legen Sie den Google Cloud-Dienstkontoschlüssel in Heroku fest