β―VaultCertsViewer (vcv) shows certificate expirations from a HashiCorp Vault PKI mount.
5.1K
VaultCertsViewer (vcv) is a lightweight web UI that lists and inspects certificates stored in one or more HashiCorp Vault or OpenBao PKI mounts, especially their expiration dates and SANs.
OpenBao compatible: VCV works seamlessly with both HashiCorp Vault and OpenBao, as they share the same PKI API. Tested with OpenBao 2.4+ and Vault 1.20+ (as of 02/2026).
Option 1: Explicit mounts (recommended for production):
vault policy write vcv - <<'EOF'
path "pki/certs" { capabilities = ["list"] }
path "pki/certs/*" { capabilities = ["read","list"] }
path "pki2/certs" { capabilities = ["list"] }
path "pki2/certs/*" { capabilities = ["read","list"] }
path "sys/health" { capabilities = ["read"] }
EOF
vault write auth/token/roles/vcv allowed_policies="vcv" orphan=true period="24h"
vault token create -role="vcv" -policy="vcv" -period="24h" -renewable=true
Option 2: Wildcard pattern (for dynamic environments):
vault policy write vcv - <<'EOF'
path "pki*/certs" { capabilities = ["list"] }
path "pki*/certs/*" { capabilities = ["read","list"] }
path "sys/health" { capabilities = ["read"] }
EOF
vault write auth/token/roles/vcv allowed_policies="vcv" orphan=true period="24h"
vault token create -role="vcv" -policy="vcv" -period="24h" -renewable=true
Option 1: Explicit mounts (recommended for production):
bao policy write vcv - <<'EOF'
path "pki/certs" { capabilities = ["list"] }
path "pki/certs/*" { capabilities = ["read","list"] }
path "pki2/certs" { capabilities = ["list"] }
path "pki2/certs/*" { capabilities = ["read","list"] }
path "sys/health" { capabilities = ["read"] }
EOF
bao write auth/token/roles/vcv allowed_policies="vcv" orphan=true period="24h"
bao token create -role="vcv" -policy="vcv" -period="24h" -renewable=true
Option 2: Wildcard pattern (for dynamic environments):
bao policy write vcv - <<'EOF'
path "pki*/certs" { capabilities = ["list"] }
path "pki*/certs/*" { capabilities = ["read","list"] }
path "sys/health" { capabilities = ["read"] }
EOF
bao write auth/token/roles/vcv allowed_policies="vcv" orphan=true period="24h"
bao token create -role="vcv" -policy="vcv" -period="24h" -renewable=true
Create a settings.json file:
{
"app": {
"env": "prod",
"port": 52000,
"logging": {
"level": "info",
"format": "json",
"output": "stdout"
}
},
"certificates": {
"expiration_thresholds": {
"critical": 7,
"warning": 30
}
},
"metrics": {
"per_certificate": false,
"enhanced_metrics": true
},
"cors": {
"enabled": false,
"allowed_origins": []
},
"vaults": [
{
"id": "main",
"enabled": true,
"display_name": "Main Vault",
"address": "https://vault.example.com:8200",
"token": "s.REPLACE_ME",
"pki_mounts": ["pki", "pki2"],
"tls_insecure": false
}
]
}
services:
vcv:
image: jhmmt/vcv:1.9.1
container_name: vcv
restart: unless-stopped
ports:
- "52000:52000"
volumes:
- ./settings.json:/app/settings.json:rw
docker compose up -d
docker run -d \
--name vcv \
-v "$(pwd)/settings.json:/app/settings.json:rw" \
--cap-drop=ALL --read-only --security-opt no-new-privileges:true \
-p 52000:52000 jhmmt/vcv:1.9.1
VCV supports custom CA bundles and TLS settings per Vault instance through settings.json:
tls_ca_cert_base64: base64-encoded PEM CA bundle (preferred)tls_ca_cert: file path to PEM CA bundletls_ca_path: directory containing CA certstls_server_name: TLS SNI server name overridetls_insecure: disable TLS verification (dev only)Precedence: tls_ca_cert_base64 overrides tls_ca_cert/tls_ca_path.
VCV exposes metrics at /metrics endpoint with comprehensive certificate monitoring:
Key metrics:
vcv_certificates_total{vault_id, pki, status} - Certificate counts by statusvcv_certificates_expiring_soon_count{vault_id, pki, level} - Expiring certificatesvcv_vault_connected{vault_id} - Connection statusvcv_certificates_last_fetch_timestamp_seconds - Last successful scrapeConfiguration:
"metrics": {
"per_certificate": false, // High cardinality metrics
"enhanced_metrics": true // Detailed bucket metrics
}
To enable the administration panel, you have to edit the settings.json file and write the admin bcrypt hash password in the admin.password field.
...
"admin": {
"password": "$2y$10$.changeme"
},
...
Also, do not forget to make the settings.json file read-write, to be able to edit and save parameters.
volumes:
- ./settings.json:/app/settings.json:rw
Full documentation available on GitHubβ
jhmmt/vcv:1.9.1 - Latest stable releasejhmmt/vcv:latest - Always latest versionjhmmt/vcv:beta - Development buildContent type
Image
Digest
sha256:7065d7d7bβ¦
Size
5.9 MB
Last updated
4 days ago
docker pull jhmmt/vcv