From e5491994b9821150f86572536e94984286722efc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Muff=20L=C3=A9o?= <mezmer@MacBook-Pro-de-Muff.local>
Date: Thu, 6 Jun 2024 11:38:39 +0200
Subject: [PATCH] started ACME scripts

---
 atelier_secu.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 68 insertions(+), 3 deletions(-)

diff --git a/atelier_secu.md b/atelier_secu.md
index b019440..ce6132f 100644
--- a/atelier_secu.md
+++ b/atelier_secu.md
@@ -204,12 +204,12 @@ vault secrets tune -max-lease-ttl=240h pki_int
 vault write -format=json pki_int/intermediate/generate/internal \
      common_name="chepia.ch Intermediate Authority" \
      issuer_name="chepia-dot-ch-intermediate" \
-     | jq -r '.data.csr' > pki_intermediate.csr
+     | ./jq -r '.data.csr' > pki_intermediate.csr
 vault write -format=json pki/root/sign-intermediate \
      issuer_ref="root" \
      csr=@pki_intermediate.csr \
      format=pem_bundle ttl="240h" \
-     | jq -r '.data.certificate' > intermediate.cert.pem
+     | ./jq -r '.data.certificate' > intermediate.cert.pem
 vault write pki_int/intermediate/set-signed certificate=@intermediate.cert.pem
 ```
 
@@ -615,7 +615,71 @@ spec:
 
 - Activation de la config avec `microk8s kubectl apply -f acme.yaml `
 
+A partir de cette étape, on va pouvoir gérer les certificats de nos clients grâce au protocole ACME. Pour vérifier que le domaine à certifier appartient bien au client, ACME utilise deux types de challenges, DNS01 et HTTP01 :
 
+- **DNS01** : Ce challenge vérifie que le serveur DNS est bien contrôlé par l'utilisateur. Pour cela, celui-ci doit ajouter un enregistrement DNS de type TXT avec une valeur prédéfinie. 
+- **HTTP01** : Ce challenge vérifie que le serveur web est bien sous le contrôle de l'utilisateur. Pour cela, celui-ci doit placer un fichier contenant un token à l'adresse `http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>`.
+
+Pour que la certification par ACME réussisse, le client doit donc avoir un serveur DNS mis en place, sinon notre émetteur ACME ne pourra pas accéder au domaine et vérifier le challenge. Mais même avec cela, la mise en place du challenge et l'installation des certificats doit être faite à la main, ce qui n'est pas souhaitable. On va donc créer un script automatisant ces tâches, à l'image de Certbot. Comme celles-ci sont différentes pour chaque type de serveur web (Apache, Nginx, etc), on va se concentrer sur Nginx avec un challenge HTTP01 pour l'instant.
+
+## Création du script 
+
+### Récupération du token 
+
+- Pour transmettre le token utilisé dans le challenge, il faut choisir une méthode pour authentifier l'utilisateur. Pour cela, 
+
+```python
+import requests
+import json
+
+vault_addr = "http://127.0.0.1:8200"
+role_id = "your-role-id"
+secret_id = "your-secret-id"
+
+def get_vault_token(role_id, secret_id):
+    url = f"{vault_addr}/v1/auth/approle/login"
+    payload = {
+        "role_id": role_id,
+        "secret_id": secret_id
+    }
+    response = requests.post(url, data=json.dumps(payload))
+    response.raise_for_status()
+    return response.json()['auth']['client_token']
+
+vault_token = get_vault_token(role_id, secret_id)
+print(f"Vault Token: {vault_token}")
+
+```
+
+```python
+import requests
+import json
+
+vault_addr = "http://127.0.0.1:8200"
+username = "your-username"
+password = "your-password"
+
+def get_vault_token(username, password):
+    url = f"{vault_addr}/v1/auth/userpass/login/{username}"
+    payload = {
+        "password": password
+    }
+    response = requests.post(url, data=json.dumps(payload))
+    response.raise_for_status()
+    return response.json()['auth']['client_token']
+
+vault_token = get_vault_token(username, password)
+print(f"Vault Token: {vault_token}")
+
+```
+
+```
+server { listen 80; server\_name example.com; location /.well-known/acme-challenge/ { alias /var/www/html/.well-known/acme-challenge/; } location / { # Configuration de votre site } }
+
+```
+### Mise en place du challenge
+
+### Installation du certificat
 
 # Glossaire
 
@@ -638,4 +702,5 @@ spec:
 - https://www.digicert.com/fr/what-is-pki
 - https://www.ssldragon.com/blog/best-practices-to-store-the-private-key/
 - https://www.thesslstore.com/blog/what-is-a-key-management-service-key-management-services-explained/
-- https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html
\ No newline at end of file
+- https://cheatsheetseries.owasp.org/cheatsheets/Key_Management_Cheat_Sheet.html
+- https://tharakamd-12.medium.com/writing-your-own-certbot-plugin-for-lets-encrypt-215efb79b950
\ No newline at end of file
-- 
GitLab