update pki
This commit is contained in:
@@ -3,6 +3,10 @@ kind: Certificate
|
|||||||
metadata:
|
metadata:
|
||||||
name: ca-root-certificate
|
name: ca-root-certificate
|
||||||
namespace: certificates-ops
|
namespace: certificates-ops
|
||||||
|
annotations:
|
||||||
|
# Ce certificat doit être créé en premier pour générer le secret ca-root-secret
|
||||||
|
# utilisé par le ClusterIssuer ca-issuer
|
||||||
|
argocd.argoproj.io/sync-wave: "0"
|
||||||
spec:
|
spec:
|
||||||
# Ce certificat génère la CA root de votre PKI interne
|
# Ce certificat génère la CA root de votre PKI interne
|
||||||
secretName: ca-root-secret
|
secretName: ca-root-secret
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ apiVersion: cert-manager.io/v1
|
|||||||
kind: ClusterIssuer
|
kind: ClusterIssuer
|
||||||
metadata:
|
metadata:
|
||||||
name: ca-root-issuer
|
name: ca-root-issuer
|
||||||
|
annotations:
|
||||||
|
# Ce ClusterIssuer doit être créé en premier (avant le Certificate ca-root-certificate)
|
||||||
|
argocd.argoproj.io/sync-wave: "-1"
|
||||||
spec:
|
spec:
|
||||||
selfSigned: {}
|
selfSigned: {}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,14 @@ apiVersion: cert-manager.io/v1
|
|||||||
kind: ClusterIssuer
|
kind: ClusterIssuer
|
||||||
metadata:
|
metadata:
|
||||||
name: ca-issuer
|
name: ca-issuer
|
||||||
|
annotations:
|
||||||
|
# Ce ClusterIssuer dépend du secret ca-root-secret généré par ca-root-certificate
|
||||||
|
# ArgoCD créera d'abord le Certificate, puis ce ClusterIssuer
|
||||||
|
argocd.argoproj.io/sync-wave: "1"
|
||||||
spec:
|
spec:
|
||||||
ca:
|
ca:
|
||||||
secretName: ca-root-secret
|
secretName: ca-root-secret
|
||||||
# Le secret ca-root-secret contient la clé privée et le certificat de la CA root
|
# Le secret ca-root-secret contient la clé privée et le certificat de la CA root
|
||||||
# Il est généré par le Certificate ca-root-certificate ci-dessus
|
# Il est généré par le Certificate ca-root-certificate ci-dessus
|
||||||
|
# IMPORTANT: Ce ClusterIssuer sera en erreur jusqu'à ce que le secret soit créé
|
||||||
|
|
||||||
|
|||||||
182
scripts/init-pki.sh
Normal file
182
scripts/init-pki.sh
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script d'initialisation de la PKI interne
|
||||||
|
# Ce script vérifie et crée le certificat CA root si nécessaire
|
||||||
|
# Usage: ./init-pki.sh [--context CLUSTER_CONTEXT]
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CONTEXT="${KUBECTL_CONTEXT:-cluster-ops}"
|
||||||
|
NAMESPACE="certificates-ops"
|
||||||
|
CERT_NAME="ca-root-certificate"
|
||||||
|
SECRET_NAME="ca-root-secret"
|
||||||
|
ISSUER_NAME="ca-root-issuer"
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--context)
|
||||||
|
CONTEXT="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 [--context CLUSTER_CONTEXT]"
|
||||||
|
echo " --context: Contexte kubectl (défaut: cluster-ops)"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "=== Initialisation de la PKI interne ==="
|
||||||
|
echo "Cluster: $CONTEXT"
|
||||||
|
echo "Namespace: $NAMESPACE"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Vérifier que kubectl est disponible
|
||||||
|
if ! command -v kubectl &> /dev/null; then
|
||||||
|
echo "❌ kubectl n'est pas installé"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier l'accès au cluster
|
||||||
|
if ! kubectl --context="$CONTEXT" cluster-info &> /dev/null; then
|
||||||
|
echo "❌ Impossible d'accéder au cluster $CONTEXT"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier que cert-manager est installé
|
||||||
|
if ! kubectl --context="$CONTEXT" get crd certificates.cert-manager.io &> /dev/null; then
|
||||||
|
echo "❌ cert-manager n'est pas installé sur le cluster $CONTEXT"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier que le namespace existe
|
||||||
|
if ! kubectl --context="$CONTEXT" get namespace "$NAMESPACE" &> /dev/null; then
|
||||||
|
echo "📦 Création du namespace $NAMESPACE..."
|
||||||
|
kubectl --context="$CONTEXT" create namespace "$NAMESPACE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier que le ClusterIssuer ca-root-issuer existe
|
||||||
|
if ! kubectl --context="$CONTEXT" get clusterissuer "$ISSUER_NAME" &> /dev/null; then
|
||||||
|
echo "❌ Le ClusterIssuer $ISSUER_NAME n'existe pas"
|
||||||
|
echo " Assurez-vous qu'il est déployé via ArgoCD"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier si le secret existe déjà
|
||||||
|
if kubectl --context="$CONTEXT" get secret "$SECRET_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||||||
|
echo "✅ Le secret $SECRET_NAME existe déjà"
|
||||||
|
echo " La PKI est déjà initialisée"
|
||||||
|
|
||||||
|
# Vérifier l'état du certificat
|
||||||
|
if kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||||||
|
CERT_STATUS=$(kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" \
|
||||||
|
-o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' 2>/dev/null || echo "Unknown")
|
||||||
|
|
||||||
|
if [ "$CERT_STATUS" == "True" ]; then
|
||||||
|
echo "✅ Le certificat CA root est prêt"
|
||||||
|
echo ""
|
||||||
|
echo "📋 Informations du certificat:"
|
||||||
|
kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" -o wide
|
||||||
|
echo ""
|
||||||
|
echo "✅ La PKI est opérationnelle"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "⚠️ Le certificat existe mais n'est pas encore prêt (status: $CERT_STATUS)"
|
||||||
|
echo " Attente de la génération..."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "⚠️ Le secret existe mais le Certificate n'existe pas"
|
||||||
|
echo " Cela peut indiquer un problème de configuration"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "📋 Le secret $SECRET_NAME n'existe pas encore"
|
||||||
|
echo " Vérification du Certificate..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier si le Certificate existe
|
||||||
|
if ! kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||||||
|
echo "❌ Le Certificate $CERT_NAME n'existe pas dans le namespace $NAMESPACE"
|
||||||
|
echo " Assurez-vous qu'il est déployé via ArgoCD"
|
||||||
|
echo ""
|
||||||
|
echo " Le Certificate doit être créé dans:"
|
||||||
|
echo " helm/certificates/ops/templates/certificate-ca-root.yaml"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Attendre que le certificat soit généré
|
||||||
|
echo "⏳ Attente de la génération du certificat CA root..."
|
||||||
|
echo " (Cela peut prendre quelques secondes)"
|
||||||
|
|
||||||
|
MAX_WAIT=120 # 2 minutes
|
||||||
|
ELAPSED=0
|
||||||
|
INTERVAL=5
|
||||||
|
|
||||||
|
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
||||||
|
if kubectl --context="$CONTEXT" get secret "$SECRET_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||||||
|
CERT_STATUS=$(kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" \
|
||||||
|
-o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' 2>/dev/null || echo "False")
|
||||||
|
|
||||||
|
if [ "$CERT_STATUS" == "True" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "✅ Certificat CA root généré avec succès !"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -n "."
|
||||||
|
sleep $INTERVAL
|
||||||
|
ELAPSED=$((ELAPSED + INTERVAL))
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Vérifier le résultat final
|
||||||
|
if ! kubectl --context="$CONTEXT" get secret "$SECRET_NAME" -n "$NAMESPACE" &> /dev/null; then
|
||||||
|
echo ""
|
||||||
|
echo "❌ Le secret n'a pas été généré après $MAX_WAIT secondes"
|
||||||
|
echo ""
|
||||||
|
echo "🔍 Diagnostic:"
|
||||||
|
echo ""
|
||||||
|
echo "1. Vérifier le Certificate:"
|
||||||
|
kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" -o yaml
|
||||||
|
echo ""
|
||||||
|
echo "2. Vérifier les événements:"
|
||||||
|
kubectl --context="$CONTEXT" get events -n "$NAMESPACE" --sort-by='.lastTimestamp' | tail -10
|
||||||
|
echo ""
|
||||||
|
echo "3. Vérifier les logs de cert-manager:"
|
||||||
|
echo " kubectl --context=$CONTEXT logs -n cert-manager-ops -l app.kubernetes.io/name=cert-manager --tail=50"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier que le ClusterIssuer ca-issuer fonctionne maintenant
|
||||||
|
echo "🔍 Vérification du ClusterIssuer ca-issuer..."
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
if kubectl --context="$CONTEXT" get clusterissuer ca-issuer &> /dev/null; then
|
||||||
|
ISSUER_STATUS=$(kubectl --context="$CONTEXT" get clusterissuer ca-issuer \
|
||||||
|
-o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' 2>/dev/null || echo "False")
|
||||||
|
|
||||||
|
if [ "$ISSUER_STATUS" == "True" ]; then
|
||||||
|
echo "✅ Le ClusterIssuer ca-issuer est prêt"
|
||||||
|
else
|
||||||
|
echo "⚠️ Le ClusterIssuer ca-issuer n'est pas encore prêt (status: $ISSUER_STATUS)"
|
||||||
|
echo " Il devrait se mettre à jour automatiquement"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Résumé ==="
|
||||||
|
echo "✅ Certificat CA root: $(kubectl --context="$CONTEXT" get certificate "$CERT_NAME" -n "$NAMESPACE" -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' 2>/dev/null || echo "Unknown")"
|
||||||
|
echo "✅ Secret CA root: $(kubectl --context="$CONTEXT" get secret "$SECRET_NAME" -n "$NAMESPACE" &> /dev/null && echo "Existe" || echo "Manquant")"
|
||||||
|
echo ""
|
||||||
|
echo "📋 Prochaines étapes:"
|
||||||
|
echo "1. Extraire le certificat CA root:"
|
||||||
|
echo " ./scripts/extract-ca-root-cert.sh --context=$CONTEXT"
|
||||||
|
echo ""
|
||||||
|
echo "2. Distribuer le certificat aux clients (voir docs/PKI-INTERNE.md)"
|
||||||
|
echo ""
|
||||||
|
echo "3. Créer des certificats pour vos applications internes en utilisant 'ca-issuer'"
|
||||||
|
echo ""
|
||||||
|
echo "🎉 Initialisation terminée !"
|
||||||
|
|
||||||
Reference in New Issue
Block a user