Dans cet article en plusieurs parties, vous apprendrez à utiliser l'API Let's Encrypt ACME version 2 avec ** Python ** pour les ** certificats SSL **.
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
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
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'))
[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