VaultCertsViewer : un tableau de bord léger pour suivre la santé des certificats
Suivre des certificats TLS répartis sur plusieurs moteurs PKI Vault devient vite pénible : expirations oubliées, renouvellements en urgence, manque de visibilité.
VCV (Vault Certificate Viewer) est une petite application web auto-hébergée qui offre une vue claire et rapide de vos certificats émis par Vault — pour agir avant que les incidents n’arrivent.
Quel problème VCV résout-il ?#
Les organisations qui utilisent HashiCorp Vault doivent souvent gérer :
- Plusieurs instances Vault et environnements
- Plusieurs montages PKI (root, intermediate, équipes/applications dédiées)
- Des certificats qui expirent à des rythmes différents, à des endroits différents
- Le besoin d’une interface simple et unique
VCV se concentre sur l’essentiel : visibilité et clareté.
Ce que vous obtenez#
Un inventaire clair des certificats#
VCV liste les certificats émis par vos moteurs PKI Vault avec les informations utiles :
- Common Name (CN)
- Émetteur / montage source
- Date d’expiration (le plus important)
- Jours restants
- Statut (révoqué, expiré, valide)
L’objectif : répondre rapidement à des questions comme :
- « Quels certificats expirent bientôt ? »
- « Quel montage PKI produit le plus de certificats à courte durée de vie ? »
- « Sommes-nous tranquilles pour les X prochains jours ? »
Des seuils d’expiration configurables#
Les politiques varient selon les environnements. VCV propose des seuils d’expiration configurables (par exemple : warning à 30 jours, critique à 7 jours) afin de coller à vos pratiques opérationnelles sans modifier le code.
Une interface web simple#
VCV est conçu pour être :
- Facile à exécuter (auto-hébergé)
- Rapide à utiliser
- Accessible aux opérateurs
Pas de complexité inutile : juste le tableau de bord.
Prêt pour la supervision (métriques & alerting)#
VCV expose des métriques pour s’intégrer à votre stack de supervision (ex. Prometheus ou VictoriaMetrics). Vous pouvez ainsi créer des alertes telles que :
- « Des certificats expirent dans < 7 jours »
- « Problème de connectivité à Vault »
- « Dernière récupération trop ancienne »
Comment VCV s’intègre dans votre workflow#
VCV ne cherche pas à remplacer Vault, ni votre supervision. Il complète l’ensemble :
- Vault reste la source de vérité
- VCV rend les données faciles à consommer
- Prometheus/Alertmanager (ou équivalent) déclenche les alertes au bon moment
Concrètement, les équipes utilisent VCV comme :
- Un tableau de bord de vérification quotidien/hebdo
- Un outil de prévention d’incidents
- Une vue rapide en cas de diagnostic sur la PKI Vault
Pour qui ?#
VCV est particulièrement utile si vous :
- Exploitez Vault PKI dans une instance ou plusieurs
- Gérez plusieurs montages PKI
- Supportez de nombreux services internes avec des certificats à durée de vie courte
- Cherchez une UI légère pour repérer les risques tôt
Pourquoi VCV est volontairement “petit”#
Beaucoup de plateformes de gestion de certificats deviennent de véritables écosystèmes. VCV reste volontairement focalisé :
- Complexité opérationnelle minimale
- Déploiement et mises à jour simples
- UI claire et valeur immédiate
Si vous faites déjà confiance à Vault pour la PKI, VCV vous aide à faire confiance à votre visibilité.
Administration de l’application#
VCV est pensé pour rester facile à exploiter : les administrateurs configurent la connexion à Vault (adresses et authentification), sélectionnent les montages PKI à exposer et ajustent les seuils d’expiration selon la politique de l’organisation.
Via une page protégée par un mot de passe, la zone d’administration vous présentera des formulaires pour ajouter tous les chemins vers les instances Vault que vous gérez. Toutes les informations sont stockées dans un fichier au format JSON.
VCV ne remplace pas la gouvernance Vault : le contrôle d’accès et la gestion des secrets restent assurés par Vault ; l’enjeu côté admin est donc la configuration sûre, l’observabilité et la rotation régulière des identifiants.
Déploiement avec docker#
Prérequis de mise en place#
Les informations de configuration de l’application sont stockées dans un fichier settings.json. Vous devez créer ce fichier avant de lancer le conteneur.
Créez ce fichier settings.json dans le répertoire de travail, et saisissez ces informations en remplaçant les valeurs avec vos propres données :
{
"app": {
"env": "prod",
"logging": {
"level": "info",
"format": "json",
"output": "both",
"file_path": "/var/log/app/vcv.log"
},
"port": 52000
},
"certificates": {
"expiration_thresholds": {
"critical": 2,
"warning": 10
}
},
"cors": {
"allowed_origins": ["http://localhost:4321", "http://localhost:3000"],
"allow_credentials": true
},
"vaults": [
{
"id": "vault-main",
"address": "http://vault:8200",
"token": "root",
"pki_mounts": ["pki", "pki_dev", "pki_stage", "pki_production"],
"display_name": "Vault",
"tls_ca_cert_base64": "BASE64_PEM_CA_BUNDLE",
"tls_ca_cert": "",
"tls_ca_path": "",
"tls_server_name": "vault.service.consul",
"tls_insecure": true,
"enabled": true
},
{
"id": "vault-dev",
"address": "http://vault-dev:8200",
"token": "root",
"pki_mounts": ["pki", "pki_corporate", "pki_external", "pki_partners"],
"display_name": "Vault dev",
"tls_ca_cert_base64": "BASE64_PEM_CA_BUNDLE",
"tls_ca_cert": "",
"tls_ca_path": "",
"tls_server_name": "vault-dev.service.consul",
"tls_insecure": true,
"enabled": true
}
]
}Test rapide avec la commande docker run#
Simplement, saisissez cette commande pour lancer vcv et accéder à VCV :
docker run -d \
-v "$(pwd)/settings.json:/app/settings.json:rw" \
-v "$(pwd)/logs:/var/log/app:rw" \
--cap-drop=ALL --read-only --security-opt no-new-privileges:true \
-p 52000:52000 jhmmt/vcv:1.6Mise en production avec un fichier docker-compose#
Créez ce fichier docker-compose.yml et saisissez ces informations :
---
services:
vcv:
image: jhmmt/vcv:1.6
container_name: vcv
restart: unless-stopped
ports:
- "52000:52000/tcp"
cap_drop:
- ALL
read_only: true
security_opt:
- no-new-privileges:true
environment: # admin password: 'admin'
- VCV_ADMIN_PASSWORD=$$2y$$10$$.SWJT4Amz9tyq4qq2vqQyOZm/KZAf38YVVNxj/6EvYLk4I0C6Q9A2
- SETTINGS_PATH=/app/settings.json
volumes:
- ./settings.json:/app/settings.json:rw
deploy:
resources:
limits:
cpus: "0.50"
memory: 64MDéploiement dans Kubernetes#
Puisque VaultCertsViewer est une image mono-binaire, il est tout à fait possible de déployer l’application dans un cluster Kubernetes. Voici le manifest complet à utiliser :
apiVersion: v1
kind: Namespace
metadata:
name: vcv
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: vcv-sa
namespace: vcv
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vcv
namespace: vcv
labels:
app: vcv
spec:
replicas: 1
selector:
matchLabels:
app: vcv
template:
metadata:
labels:
app: vcv
spec:
serviceAccountName: vcv-sa
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
containers:
- name: vcv
image: jhmmt/vcv:1.6
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 52000
protocol: TCP
volumeMounts:
- name: vcv-settings
mountPath: /app/settings.json
subPath: settings.json
readOnly: true
resources:
requests:
cpu: "100m"
memory: "64Mi"
limits:
cpu: "500m"
memory: "128Mi"
readinessProbe:
httpGet:
path: /api/ready
port: http
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /api/health
port: http
initialDelaySeconds: 10
periodSeconds: 20
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
volumes:
- name: vcv-settings
secret:
secretName: vcv-settings
---
apiVersion: v1
kind: Secret
metadata:
name: vcv-settings
namespace: vcv
type: Opaque
stringData:
settings.json: |
{
"app": {
"env": "prod",
"port": 52000,
"logging": {
"level": "info",
"format": "json",
"output": "stdout",
"file_path": "/var/log/app/vcv.log"
}
},
"cors": {
"allowed_origins": [],
"allow_credentials": true
},
"certificates": {
"expiration_thresholds": {
"critical": 7,
"warning": 30
}
},
"vaults": [
{
"id": "vault-main",
"address": "https://vault-prod.example.com:8200",
"token": "change-me",
"pki_mounts": [
"pki",
"pki_dev",
"pki_stage",
"pki_production"
],
"display_name": "Vault",
"tls_ca_cert_base64": "BASE64_PEM_CA_BUNDLE",
"tls_ca_cert": "",
"tls_ca_path": "",
"tls_server_name": "vault.service.consul",
"tls_insecure": false,
"enabled": true
},
{
"id": "vault-dev",
"address": "https://vault-dev.example.com:8200",
"token": "change-me",
"pki_mounts": [
"pki",
"pki_corporate",
"pki_external",
"pki_partners"
],
"display_name": "Vault dev",
"tls_ca_cert_base64": "BASE64_PEM_CA_BUNDLE",
"tls_ca_cert": "",
"tls_ca_path": "",
"tls_server_name": "vault-dev.service.consul",
"tls_insecure": false,
"enabled": true
}
]
}
---
apiVersion: v1
kind: Service
metadata:
name: vcv
namespace: vcv
labels:
app: vcv
spec:
selector:
app: vcv
ports:
- name: http
port: 52000
targetPort: http
protocol: TCP
type: ClusterIPSuite à cette installation, vous devrez utiliser votre Gateway et créer la HTTPRoute nécessaire pour accéder à l’app depuis l’extérieur du cluster Kubernetes.
Conclusion#
L’expiration de certificats est un risque prévisible — et pourtant encore très fréquent.
VCV facilite le suivi, la priorisation et l’action proactive grâce à une vue simple des certificats sur plusieurs moteurs PKI Vault, avec des seuils configurables et des métriques prêtes pour la supervision.