Configurer les certificats TLS
Cette page met en place les certificats de la Navin Platform : le certificat public de l'API et du portail, et les
certificats internes des services de données et de sécurité. En production, l'API refuse une URL de base sans TLS,
envoie HSTS et exige rediss:// pour Redis (Règles de production).
Kubernetes avec cert-manager
Émetteurs
deploy/cert-manager/cluster-issuers.yaml déclare les émetteurs, appliqués par la couche infra :
| ClusterIssuer | Rôle |
|---|---|
eai-selfsigned-bootstrap | Signe une fois l'autorité racine interne |
eai-internal-ca | Autorité interne (secret eai-root-ca, ECDSA P-384, 10 ans) : certificats des services de données et de sécurité |
eai-openbao-pki | Moteur PKI d'OpenBao (https://openbao.openbao.svc:8200) |
letsencrypt-prod | Émetteur ACME pour le certificat public |
Étapes
-
Choisir l'émetteur du certificat public.
deploy/cert-manager/certificates.yamldélivreapi-gateway-tls(namespaceapisix, noms<control-plane-host>et<portal-host>) avecletsencrypt-prod. Sur un site sans ACME, faites pointerissuerRefvers l'émetteur de votre PKI d'entreprise, et fixez les vrais noms d'hôte.Résultat attendu :
kubectl -n apisix get certificate api-gateway-tlsestReady=True.En cas d'échec :
kubectl -n apisix describe certificate api-gateway-tlspuiskubectl get certificaterequest -Amontrent le refus de l'émetteur. -
Vérifier les certificats internes.
deploy/cert-manager/platform-services-certificates.yamldélivre, depuiseai-internal-ca,nats-tls,qdrant-tls,redis-tls,temporal-tls,keycloak-tls,opa-tls,openfga-tls,clickhouse-tls,redis-opik-tls,opensearch-tls,opensearch-admin-tls,jaeger-tls,otel-collector-tlsetopenbao-tls. PostgreSQL utilise l'autorité de CloudNativePG (secreteai-postgres-ca).kubectl get certificate -ARésultat attendu : chaque certificat
Ready=True. -
Distribuer l'autorité. External Secrets copie
ca.crt(jamaistls.key) deeai-root-cadans les namespaces qui en ont besoin (deploy/external-secrets/secrets/ca-stores.yaml). L'URL de base du Control Plane pointe vers l'autorité montée :sslmode=verify-full&sslrootcert=/run/secrets/postgres-ca/ca.crt. -
Ingress du portail.
portal.ingress.tlsSecretName(par défautportal-tls) est délivré parportal.ingress.clusterIssuer(par défauteai-internal-ca) ; fixez votre émetteur public pour un portail joint depuis les postes de travail. L'ingress impose HTTPS, TLS 1.2 et 1.3, et HSTS.
Les sauts entre charges du chart (APISIX vers Control Plane, Control Plane vers LiteLLM et Opik) ne portent pas de certificat applicatif : Cilium les chiffre de nœud à nœud avec WireGuard et authentifie les sauts Control Plane et LiteLLM par l'authentification mutuelle SPIFFE.
Serveurs installés par paquets
Les services du paquet navin-platform écoutent en HTTP clair sur 8080 et 3300 : placez devant eux un proxy inverse
TLS de la banque.
-
Délivrer un certificat pour les deux noms publics (par exemple
<control-plane-host>et<navin-host>) depuis la PKI de la banque. -
Configurer le proxy pour transmettre
<control-plane-url>vershttp://<hote>:8080ethttps://<navin-host>vershttp://<hote>:3300, avec la montée WebSocket autorisée sur/v1/realtime/. -
Fixer les URL publiques dans
/etc/navin-platform/platform.env:NAVIN_PORTAL_API_URL='<control-plane-url>'EAI_CORS_ORIGINS='https://<navin-host>'EAI_ALLOWED_HOSTS='<control-plane-host>'EAI_TRUSTED_PROXIES='<adresse-du-proxy>/32'EAI_HSTS_ENABLED='true'<adresse-du-proxy>: adresse du proxy inverse, seul pair autorisé à fixerX-Forwarded-For. -
Utiliser TLS vers les dépendances :
sslmode=verify-fulldansEAI_DATABASE_URL,rediss://avecEAI_REDIS_TLS_CA_FILE,https://pour OpenBao, Keycloak et les moteurs d'analyse de fichiers (EAI_FILE_SCAN_CA_FILE). -
Redémarrer :
sudo systemctl restart navin-platform.target.
Vérifier
curl -fsSv <control-plane-url>/healthz 2>&1 | grep -E 'SSL connection|strict-transport-security'
Sortie attendue : une connexion TLS 1.2 ou 1.3 et l'en-tête strict-transport-security.
Dépannage
| Symptôme | Cause | Correction |
|---|---|---|
EAI_DATABASE_URL must use sslmode=require, verify-ca or verify-full | URL de base sans TLS en production | Ajoutez sslmode=verify-full et l'autorité |
| Le navigateur rejette le certificat du portail | Délivré par l'autorité interne | Utilisez l'émetteur public, ou déployez l'autorité interne sur les postes |
400 Bad Request de l'API derrière le proxy | Hôte absent de EAI_ALLOWED_HOSTS | Ajoutez le nom d'hôte public |
| L'IP cliente de chaque requête est celle du proxy | Proxy absent de EAI_TRUSTED_PROXIES | Ajoutez son adresse |