7.3 KiB
Export des Certificats TLS pour Équipements Externes
Ce guide explique comment exporter et utiliser les certificats TLS générés par cert-manager pour des équipements externes au cluster Kubernetes (pfSense, OpenMediaVault, NAS, etc.).
Vue d'ensemble
Les certificats TLS sont générés par cert-manager dans le namespace certificates-ops et stockés sous forme de secrets Kubernetes. Pour les utiliser sur des équipements externes, il faut :
- Exporter le certificat depuis Kubernetes
- Convertir au format approprié (PEM, PKCS12, etc.)
- Importer dans l'équipement externe
- Automatiser le renouvellement (optionnel)
Méthode 1 : Export manuel avec script
Prérequis
- Accès au cluster Kubernetes avec
kubectl opensslinstallé sur votre machinebase64disponible (généralement inclus)
Export du certificat
Utilisez le script scripts/export-certificate.sh :
# Export en format PEM (par défaut)
./scripts/export-certificate.sh wildcard-prd-tls certificates-ops cluster-ops ./certs pem
# Export en format PKCS12 (pour pfSense)
./scripts/export-certificate.sh wildcard-prd-tls certificates-ops cluster-ops ./certs pkcs12
Formats disponibles
- PEM : Format standard, certificat et clé séparés (
.crtet.key) - PKCS12/PFX : Format conteneurisé avec certificat et clé dans un seul fichier (
.p12ou.pfx)
Méthode 2 : Export direct avec kubectl
Export en format PEM
# Définir les variables
SECRET_NAME="wildcard-prd-tls"
NAMESPACE="certificates-ops"
CONTEXT="cluster-ops"
OUTPUT_DIR="./certs"
# Créer le répertoire
mkdir -p "$OUTPUT_DIR"
# Extraire le certificat
kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" --context="$CONTEXT" \
-o jsonpath='{.data.tls\.crt}' | base64 -d > "$OUTPUT_DIR/certificate.crt"
# Extraire la clé privée
kubectl get secret "$SECRET_NAME" -n "$NAMESPACE" --context="$CONTEXT" \
-o jsonpath='{.data.tls\.key}' | base64 -d > "$OUTPUT_DIR/private.key"
Conversion en PKCS12
# Créer un fichier PKCS12 (mot de passe optionnel)
openssl pkcs12 -export \
-out "$OUTPUT_DIR/certificate.p12" \
-inkey "$OUTPUT_DIR/private.key" \
-in "$OUTPUT_DIR/certificate.crt" \
-name "wildcard-prd" \
-passout pass: # Laissez vide pour aucun mot de passe
Import dans les équipements
pfSense
Méthode 1 : Import PKCS12 (recommandé)
- Allez dans System > Certificates
- Cliquez sur Import
- Sélectionnez le fichier
.p12ou.pfx - Entrez le mot de passe si nécessaire
- Cliquez sur Import
Méthode 2 : Import PEM séparé
- Allez dans System > Certificates
- Cliquez sur Add
- Dans Method, sélectionnez Import an existing Certificate
- Collez le contenu du fichier
.crtdans Certificate data - Collez le contenu du fichier
.keydans Private key data - Cliquez sur Save
Utilisation dans pfSense
- Allez dans System > Certificates
- Sélectionnez le certificat importé
- Utilisez-le dans :
- System > Advanced > WebGUI (certificat HTTPS)
- Services > HAProxy (certificats backend)
- VPN > OpenVPN (certificats serveur)
OpenMediaVault
- Allez dans System > Certificates > SSL
- Cliquez sur Import
- Sélectionnez le fichier certificat (
.crtou.p12) - Si vous utilisez PEM, importez séparément :
- Certificate : Fichier
.crt - Private Key : Fichier
.key
- Certificate : Fichier
- Cliquez sur Save
Synology NAS
- Allez dans Control Panel > Security > Certificate
- Cliquez sur Add
- Sélectionnez Import Certificate
- Choisissez le fichier (
.p12ou.crt+.key) - Entrez le mot de passe si nécessaire
- Cliquez sur OK
Autres équipements
La plupart des équipements réseau supportent l'import de certificats en format :
- PEM : Certificat et clé séparés
- PKCS12/PFX : Format conteneurisé
Consultez la documentation de votre équipement pour les détails spécifiques.
Automatisation du renouvellement
Les certificats Let's Encrypt sont valides 90 jours et sont renouvelés automatiquement par cert-manager. Pour synchroniser automatiquement les certificats vers vos équipements externes :
Option 1 : Webhook cert-manager
Créez un webhook qui s'exécute lors du renouvellement du certificat :
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-prd-tls
namespace: certificates-ops
spec:
# ... configuration du certificat ...
secretTemplate:
annotations:
cert-manager.io/allow-direct-injection: "true"
# Webhook pour exporter automatiquement
# (nécessite un contrôleur personnalisé)
Option 2 : Script CronJob
Créez un CronJob qui vérifie périodiquement les certificats et les exporte :
apiVersion: batch/v1
kind: CronJob
metadata:
name: export-certificates
namespace: certificates-ops
spec:
schedule: "0 0 * * *" # Tous les jours
jobTemplate:
spec:
template:
spec:
containers:
- name: export
image: alpine/k8s:1.33.0
command:
- /bin/sh
- -c
- |
# Exporter le certificat
kubectl get secret wildcard-prd-tls -n certificates-ops \
-o jsonpath='{.data.tls\.crt}' | base64 -d > /export/cert.crt
# Envoyer vers l'équipement externe (API, SCP, etc.)
# Exemple avec curl vers une API pfSense
# curl -X POST https://pfsense.example.com/api/certificates \
# -F "cert=@/export/cert.crt"
Option 3 : API REST
Si votre équipement supporte une API REST (comme pfSense), créez un service qui :
- Surveille les changements de secrets Kubernetes
- Exporte automatiquement le certificat
- Envoie une requête API à l'équipement pour mettre à jour le certificat
Sécurité
⚠️ Important : Les certificats et clés privées sont des données sensibles.
- Ne stockez jamais les clés privées dans Git
- Supprimez les fichiers exportés après import
- Utilisez des permissions restrictives sur les fichiers (chmod 600)
- Chiffrez les fichiers si vous devez les transférer
# Permissions restrictives
chmod 600 certificate.key
chmod 644 certificate.crt
# Supprimer après import
rm -f certificate.*
Dépannage
Erreur "secret not found"
Vérifiez que le secret existe :
kubectl get secret wildcard-prd-tls -n certificates-ops --context=cluster-ops
Erreur "certificate expired"
Les certificats sont renouvelés automatiquement. Vérifiez le statut :
kubectl get certificate wildcard-prd-tls -n certificates-ops --context=cluster-ops
Format non reconnu par l'équipement
Essayez de convertir dans un autre format :
# PEM vers DER
openssl x509 -in certificate.crt -out certificate.der -outform DER
# PKCS12 avec mot de passe
openssl pkcs12 -export -out certificate.p12 \
-inkey private.key -in certificate.crt \
-passout pass:VOTRE_MOT_DE_PASSE
Exemples de certificats disponibles
Dans le namespace certificates-ops :
wildcard-dev-tls:*.dev.gkdomaine.frwildcard-rct-tls:*.rct.gkdomaine.frwildcard-prd-tls:*.prd.gkdomaine.fr
Pour lister tous les certificats :
kubectl get certificates -n certificates-ops --context=cluster-ops