[PYTHON] ACME mit Alibaba Cloud verschlüsseln: Erstellen Sie eine ACME-Anforderung und signieren Sie eine JWS-Nutzlast

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

Beispiel für eine ACME-Anfrage

Schauen wir uns ein Beispiel für die Erstellung eines neuen Kontos an. Dieses Pseudocodebeispiel zeigt einen HTTP-POST, einen HTTP-Header und einen HTTP-Body. "based64_encode" ist nicht wirklich Teil des HTTP-Körpers, zeigt jedoch an, dass der Code die Daten vor dem Senden an den ACME-Server mit base64 codieren muss.

POST /acme/new-account HTTP/1.1
Host: acme-staging-v02.api.letsencrypt.org
Content-Type: application/jose+json

{
    "protected": base64_encode({
        "alg": "ES256",
        "jwk": {...},
        "nonce": "6S8IqOGY7eL2lsGoTZYifg",
        "url": "https://acme-staging-v02.api.letsencrypt.org/acme/new-acct"
    }),
    "payload": base64_encode({
        "termsOfServiceAgreed": true,
        "contact": [
            "mailto:[email protected]",
            "mailto:[email protected]"
        ]
    }),
    "signature": "RZPOnYoPs1PhjszF...-nh6X1qtOFPB519I"
}

ACME API HTTP-Anforderungshauptteil

ACME-Anforderungen sind in JWS-Objekten (JSON Web Signature) gekapselt.

Das JWS-Objekt besteht aus drei Teilen. JWS Protected Header, API-Befehlsparameter (Paloader), Signatur. Jeder Teil wird unten erklärt. Jeder Teil wird einzeln base64-codiert und zu einem einzigen JSON-Objekt kombiniert.

{
    "protected": base64_encode(jws_protected_header),
    "payload": base64_encode(payload),
    "signature": based64_encode(signature)
}

JWS-geschützter Header

Innerhalb des JWS-Objekts befindet sich der JWS Protected Header. Der JWS Protected Header enthält die folgenden Felder:

Feld Erläuterung
alg Algorithmus. Ein MAC-basierter Algorithmus zum Signieren von Anforderungen. Die unterstützten Algorithmen sind ES256 und RS256. Referenz Siehe RFC 7518. In diesen Beispielen RS256(SH-RSASSA mit 256-PKCS1-v1_5)Verwenden Sie die. Ich werde es kurz erklären. RS256 bedeutet, mit dem privaten RSA-Schlüssel zu signieren und mit dem entsprechenden öffentlichen RSA-Schlüssel zu validieren.
jwk JSON-Webschlüssel. jwk wird für alle Anforderungen verwendet, die nicht mit einem vorhandenen Konto signiert wurden. Zum Beispiel:"Neues Konto".. jwk ist ein JSON-Objekt, das später in diesem Artikel beschrieben wird.
kid Schlüssel-ID. kid wird für alle Anfragen verwendet, die mit einem vorhandenen Konto signiert wurden. Zum Beispiel "Kontoinformationen abrufen".
nonce Nonce. Ein eindeutiger Wert, der verwendet wird, um Wiederholungsangriffe zu verhindern. Dieser Wert wird von der NewNonce-API zurückgegeben und ist der Antwortheader "Replay" nach jedem erfolgreichen ACME-API-Aufruf.-Es wird mit "Nonce" zurückgegeben.
url URL. Dieser Header-Parameter codiert die URL, auf die der Client auf die Anforderung verweist. Die erforderlichen Werte finden Sie in jeder ACME-API.

Die Felder "jwk" und "kid" schließen sich gegenseitig aus. Der Server muss die Anforderung ablehnen, die beide enthält.

Die ACME-API verwendet eine der beiden und gibt sie an.

JWS Web Key (JWK)

Die JWK-Parameter variieren je nach Art der kryptografischen Signatur. Die Beispiele in dieser Serie verwenden RSA-Schlüsselpaare.

Feld Erläuterung
e Öffentlicher Index. Dies ist der öffentliche Index des RSA-Schlüsselpaars.
kty Schlüsselart. Die Methode zum Signieren des JWS. Wenn Sie ein RSA-Schlüsselpaar verwenden, handelt es sich um RSA. Siehe RFC 7638 für Details.
n Modul. Modul aus dem RSA-Schlüsselpaar. Bei einem 2048-Bit-Schlüssel beträgt der Wert des Felds "n" beim Decodieren 256 Oktette.
{
    "e": base64_encode(public_exponent),
    "kty": "RSA",
    "n": base64_encode(modulus),
}

Nutzlast

Die Nutzdaten enthalten API-Aufrufparameter. Diese sind für jede API unterschiedlich. Der Inhalt des JSON-Objekts in der Nutzlast ist base64-codiert. Das folgende Beispiel zeigt die Nutzdaten der New Account API. Es gibt zwei Parameter. "TermsOfServiceAgreed" und "Kontakt". Die Nutzdaten sind Teil der JSON-Web-Signatur (JSWS), die im HTTP-Body enthalten ist.

"payload": base64_encode({
    "termsOfServiceAgreed": true,
    "contact": [
        "mailto:[email protected]",
        "mailto:[email protected]"
    ]
})

Unterschrift

Die Signatur ist ein SHA-256-Nachrichtenauszug mit einem privaten RSA-Schlüssel. Der ACME-Server verwendet den entsprechenden öffentlichen Schlüssel, um die Signatur zu überprüfen.

def sign(data, keyfile):
    """ Create the ACME API Signature """

    # Load the RSA Private Key from the file (RSA PKCS #1)
    pkey = load_private_key(keyfile)

    # Create the signature
    sig = crypto.sign(pkey, data, "sha256")

    return sig

Überblick

Bisher haben wir gezeigt, wie das ACME-API-System funktioniert.

Im letzten Teil des nächsten Teils erfahren Sie, wie Sie eine DNS-Validierung durchführen und DNS-Server-Ressourceneinträge erstellen und ändern, um die ACME-DNS-Validierung zu unterstützen.

Recommended Posts

ACME mit Alibaba Cloud verschlüsseln: Erstellen Sie eine ACME-Anforderung und signieren Sie eine JWS-Nutzlast
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: Konzepte für SSL-Zertifikate
Erstellen Sie mit Python und Redis eine Rangliste für Spiele in der Alibaba-Cloud
[CentOS 7.3] Erstellen Sie einen FTP-Server auf dem ESXi-Host
Führen Sie die Kolben-App auf Cloud 9 und Apache Httpd aus
Erstellen Sie eine Ubuntu-Python-Entwicklungsumgebung auf der Google Cloud Platform