Dans cet article en plusieurs parties, vous apprendrez à utiliser l'API Let's Encrypt ACME version 2 avec ** Python ** pour les ** certificats SSL **.
Regardons un exemple de création d'un nouveau compte. Cet exemple de pseudo-code montre un HTTP POST, un en-tête HTTP et un corps HTTP. "based64_encode" ne fait pas vraiment partie du corps HTTP, mais il indique que le code doit encoder en base64 les données avant de les envoyer au serveur ACME.
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"
}
Les demandes ACME sont encapsulées dans des objets JSON Web Signature (JWS).
L'objet JWS se compose de trois parties. En-tête protégé JWS, paramètres de commande API (paloader), signature. Chaque partie est expliquée ci-dessous. Chaque partie est individuellement encodée en base64 et combinée en un seul objet JSON.
{
"protected": base64_encode(jws_protected_header),
"payload": base64_encode(payload),
"signature": based64_encode(signature)
}
À l'intérieur de l'objet JWS se trouve l'en-tête protégé JWS. L'en-tête protégé JWS contient les champs suivants:
champ | La description |
---|---|
alg | algorithme. Un algorithme basé sur MAC utilisé pour signer les demandes. Les algorithmes pris en charge sont ES256 et RS256. Référence Voir RFC 7518. Dans ces exemples, RS256(SH-RSASSA avec 256-PKCS1-v1_5)Utilisez le. Je vais vous expliquer brièvement. RS256 signifie signer avec la clé privée RSA et valider avec la clé publique RSA correspondante. |
jwk | Clé Web JSON. jwk est utilisé pour toutes les demandes qui ne sont pas signées à l'aide d'un compte existant. Par exemple:"Nouveau compte".. jwk est un objet JSON décrit plus loin dans cet article. |
kid | ID de clé. kid est utilisé pour toutes les demandes signées à l'aide d'un compte existant. Par exemple, "Obtenir des informations sur le compte". |
nonce | Nonce. Une valeur unique utilisée pour empêcher les attaques de relecture. Cette valeur est renvoyée par l'API NewNonce et constitue l'en-tête de réponse «Replay» après chaque appel d'API ACME réussi.-Il sera retourné avec "Nonce". |
url | URL. Ce paramètre d'en-tête code l'URL que le client pointe vers la demande. Consultez chaque API ACME pour les valeurs requises. |
Les champs "jwk" et "kid" sont mutuellement exclusifs. Le serveur doit rejeter la demande contenant les deux.
L'API ACME utilise l'un ou l'autre et le spécifie.
Les paramètres JWK varient en fonction du type de signature cryptographique. Les exemples de cette série utilisent des paires de clés RSA.
champ | La description |
---|---|
e | Index public. Il s'agit de l'index public de la paire de clés RSA. |
kty | Type de clé. La méthode utilisée pour signer le JWS. Si vous utilisez une paire de clés RSA, ce sera RSA. Voir RFC 7638 pour plus de détails. |
n | Module. Module de la paire de clés RSA. Pour une clé de 2048 bits, la valeur du champ "n" aura une longueur de 256 octets une fois décodée. |
{
"e": base64_encode(public_exponent),
"kty": "RSA",
"n": base64_encode(modulus),
}
La charge utile contient les paramètres d'appel d'API. Ceux-ci sont différents pour chaque API. Le contenu de l'objet json dans la charge utile est encodé en base64. L'exemple suivant montre la charge utile de l'API New Account. Il y a deux paramètres. "termsOfServiceAgreed" et "contact". La charge utile fait partie de la signature Web JSON (JWS) contenue dans le corps HTTP.
"payload": base64_encode({
"termsOfServiceAgreed": true,
"contact": [
"mailto:[email protected]",
"mailto:[email protected]"
]
})
La signature est un résumé de message SHA-256 avec une clé privée RSA. Le serveur ACME utilise la clé publique correspondante pour vérifier la signature.
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
Jusqu'à présent, nous avons montré comment fonctionne le système API ACME.
Dans la dernière partie de la suite, nous verrons comment effectuer la validation DNS et comment créer et modifier des enregistrements de ressources de serveur DNS pour prendre en charge la validation DNS ACME.
Recommended Posts