[PYTHON] Crypter ACME avec Alibaba Cloud: créer une clé de compte, une clé de certificat, une demande de signature de certificat

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

Clé de compte

La clé de compte est utilisée pour fournir l'ID du compte demandant le service de certificat. Aucune méthode telle que login / mot de passe n'est utilisée. Il est très important de conserver la paire de clés de votre compte en lieu sûr car la clé de compte est utilisée pour émettre, renouveler et révoquer des certificats SSL. Si vous perdez votre clé de compte, les certificats créés sous ce compte seront mis en attente. Ces certificats ne peuvent être ni renouvelés ni révoqués. Dans ce cas, vous devez créer une nouvelle clé de compte et émettre un nouveau certificat SSL à la place du certificat perdu. Si un tiers malveillant accède à votre clé de compte, vous pouvez modifier l'adresse e-mail de votre contact et révoquer votre certificat. Vous ne pouvez pas émettre un nouveau certificat SSL pour votre domaine car il nécessite une validation HTTP ou DNS de votre nom de domaine.

Impossible de trouver de documentation sur la taille de la clé privée. Je teste avec une taille de clé de 4096 bits et cela fonctionne très bien.

Il existe de nombreuses façons de créer une clé de compte. Regardons deux façons, l'une consiste à écrire un programme Python et l'autre à utiliser OpenSSL à partir de la ligne de commande. Inclut un exemple montrant comment utiliser la clé privée.

Cet exemple n'utilise pas la bibliothèque python openssl. Cet exemple utilise la bibliothèque cryptographique, ce qui facilite la création d'une clé privée. L'exemple suivant utilise openssl, qui est plus complexe mais offre plus d'options.

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)

Exemple de ligne de commande OpenSSL

openssl genrsa -out account.key 4096

Options de ligne de commande OpenSSL

1, genrsa --Générer la clé privée RSA (format PKCS # 1). 2, -out filename --Emet la clé vers le fichier spécifié. 3,4096-La taille de la clé privée générée en bits Affichez les détails et confirmez votre nouvelle clé de compte.

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

Extrayez la clé publique de la clé privée.

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

Clé de certificat

Une clé de certificat est une paire de clés utilisée pour signer une CSR (Certificate Signing Request). Ce n'est pas une clé de compte, même si les deux sont des paires de clés. Pour des raisons de sécurité, vous devez éviter de signer votre clé de compte dans CSR. En général, il est courant de créer une nouvelle clé de certificat pour chaque certificat SSL.

Répétez l'exemple ci-dessus pour créer une clé de certificat. La différence est que le nom de fichier est le nom de domaine qui émet le certificat. Remplacez "domain.com" par le nom de domaine.

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

Exemple de ligne de commande OpenSSL.

openssl genrsa -out example.com.key 4096

Option de ligne de commande OpenSSL.

1, genrsa --Générer la clé privée RSA (format PKCS # 1). 2, -out filename --Emet la clé vers le fichier spécifié. 3,4096-La taille de la clé privée générée en bits

Demande de signature de certificat CSR

CSR est un fichier (message) envoyé à CA (Certificate Authority - Let's Encrypt) pour demander un certificat SSL. Le CSR contient des détails tels que le nom de l'entreprise, l'emplacement et le nom de domaine de la personne qui demande le certificat SSL. Puisque Let's Encrypt émet uniquement un certificat SSL DV (Domain Validated), seul le nom de domaine est vérifié dans le certificat SSL généré, seul le nom de domaine est décrit et les informations de contact sont décrites. Une adresse e-mail facultative pour est également répertoriée. Les détails tels que le nom et l'emplacement de l'entreprise ne sont pas inclus.

Créer un CSR est facile avec OpenSSL. Tout ce dont vous avez besoin est un nom de domaine et éventuellement une adresse e-mail. L'exemple suivant remplace domainName par le nom de domaine et emailAddress par l'adresse e-mail.

Cet exemple supprime tous les champs de sujet tels que C, ST, L, O et OU que Let's Encrypt ne gère pas et ajoute l'extension subjectAltName requise par Chrome.

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

Aperçu

[Partie 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) utilise les fichiers account.key, certificate.key, certificate.csr pour générer et installer le certificat SSL pour Alibaba Cloud API Gateway et CDN, Let's Encrypt Chaque élément de l'API ACME est expliqué.

Recommended Posts

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: créez une requête ACME et signez une charge utile JWS
Crypter ACME avec Alibaba Cloud: concepts liés aux certificats SSL
Définir la clé de compte de service Google Cloud dans heroku