Aller au contenu principal

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 :

ClusterIssuerRôle
eai-selfsigned-bootstrapSigne une fois l'autorité racine interne
eai-internal-caAutorité interne (secret eai-root-ca, ECDSA P-384, 10 ans) : certificats des services de données et de sécurité
eai-openbao-pkiMoteur PKI d'OpenBao (https://openbao.openbao.svc:8200)
letsencrypt-prodÉmetteur ACME pour le certificat public

Étapes​

  1. Choisir l'émetteur du certificat public. deploy/cert-manager/certificates.yaml délivre api-gateway-tls (namespace apisix, noms <control-plane-host> et <portal-host>) avec letsencrypt-prod. Sur un site sans ACME, faites pointer issuerRef vers 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-tls est Ready=True.

    En cas d'échec : kubectl -n apisix describe certificate api-gateway-tls puis kubectl get certificaterequest -A montrent le refus de l'émetteur.

  2. Vérifier les certificats internes. deploy/cert-manager/platform-services-certificates.yaml délivre, depuis eai-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-tls et openbao-tls. PostgreSQL utilise l'autorité de CloudNativePG (secret eai-postgres-ca).

    kubectl get certificate -A

    Résultat attendu : chaque certificat Ready=True.

  3. Distribuer l'autorité. External Secrets copie ca.crt (jamais tls.key) de eai-root-ca dans 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.

  4. Ingress du portail. portal.ingress.tlsSecretName (par défaut portal-tls) est délivré par portal.ingress.clusterIssuer (par défaut eai-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.

  1. Délivrer un certificat pour les deux noms publics (par exemple <control-plane-host> et <navin-host>) depuis la PKI de la banque.

  2. Configurer le proxy pour transmettre <control-plane-url> vers http://<hote>:8080 et https://<navin-host> vers http://<hote>:3300, avec la montée WebSocket autorisée sur /v1/realtime/.

  3. 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é à fixer X-Forwarded-For.

  4. Utiliser TLS vers les dépendances : sslmode=verify-full dans EAI_DATABASE_URL, rediss:// avec EAI_REDIS_TLS_CA_FILE, https:// pour OpenBao, Keycloak et les moteurs d'analyse de fichiers (EAI_FILE_SCAN_CA_FILE).

  5. 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ômeCauseCorrection
EAI_DATABASE_URL must use sslmode=require, verify-ca or verify-fullURL de base sans TLS en productionAjoutez sslmode=verify-full et l'autorité
Le navigateur rejette le certificat du portailDélivré par l'autorité interneUtilisez l'émetteur public, ou déployez l'autorité interne sur les postes
400 Bad Request de l'API derrière le proxyHôte absent de EAI_ALLOWED_HOSTSAjoutez le nom d'hôte public
L'IP cliente de chaque requête est celle du proxyProxy absent de EAI_TRUSTED_PROXIESAjoutez son adresse