[PYTHON] Crypter ACME avec Alibaba Cloud: créez une requête ACME et signez une charge utile JWS

Dans cet article en plusieurs parties, vous apprendrez à utiliser l'API Let's Encrypt ACME version 2 avec ** Python ** pour les ** certificats SSL **.

Exemple de requête ACME

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"
}

Corps de la requête HTTP de l'API ACME

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)
}

En-tête protégé JWS

À 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.

Clé Web JWS (JWK)

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),
}

charge utile

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]"
    ]
})

Signature

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

Aperçu

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

Crypter ACME avec Alibaba Cloud: créez une requête ACME et signez une charge utile JWS
Crypter ACME avec Alibaba Cloud: créer une clé de compte, une clé de certificat, une demande de signature de certificat
Cryptez ACME avec Alibaba Cloud: créez des points de terminaison, des répertoires et des comptes ACME ACME
Crypter ACME avec Alibaba Cloud: concepts liés aux certificats SSL
Créez un classement de jeu sur le cloud Alibaba en utilisant Python et Redis
[CentOS 7.3] Créer un serveur FTP sur l'hôte ESXi
Exécutez l'application flask sur Cloud 9 et Apache Httpd
Créer un environnement de développement Ubuntu python sur Google Cloud Platform