In diesem mehrteiligen Artikel erfahren Sie, wie Sie die Let's Encrypt ACME Version 2-API mit ** Python ** für ** SSL-Zertifikate ** verwenden.
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-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)
}
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.
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),
}
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]"
]
})
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
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