Greetings!
I have been following the instructions listed in Configure pg_tde and Vault Configuration to get my PostgreSQL 17 database encrypted using the Percona pg_tde extension. However, for some reason I’m unable to add my self-hosted HashiCorp Vault as a global vault provider.
The main issue I’m currently facing comes from the method pg_tde_add_global_key_provider_vault_v2
psql list function
\df
public | pg_tde_add_global_key_provider_vault_v2 | integer | provider_name text, vault_token text, vault_url text, vault_mount_path text, vault_ca_path text | func
psql use the function
SELECT pg_tde_add_global_key_provider_vault_v2('vault-local','/vault/token','https://vault.local:8200','pg-tde','/etc/ssl/psql/ca.crt');
ERROR: Listing secrets of "https://vault.local:8200" at mountpoint "pg-tde" failed
/vault/config/vault.hcl
ui = true
disable_mlock = true
log_level = "info"
storage "file" {
path = "/vault/data"
}
listener "tcp" {
address = "0.0.0.0:8200"
http_idle_timeout = "5m"
tls_disable = "false"
tls_cert_file = "/etc/ssl/vault/server.crt"
tls_key_file = "/etc/ssl/vault/server.key"
tls_min_version = "tls13"
tls_max_version = "tls13"
tls_require_and_verify_client_cert = "false"
tls_client_ca_file = "/etc/ssl/ca.crt"
tls_disable_client_certs = "false"
}
AppRole for pg_tde
vault write auth/approle/role/pg-tde \
token_policies="pg-tde-policy" \
token_ttl=60m \
token_max_ttl=120m \
role_id=postgres-pg-tde
pg-tde-policy.hcl
# development policies for pg_tde in postgres
path "pg-tde/*" {
capabilities = ["read", "create", "update", "patch", "delete", "list"]
}
path "pg-tde/data/*" {
capabilities = ["read", "create", "update", "patch", "delete", "list"]
}
path "pg-tde/metadata/*" {
capabilities = ["read", "create", "update", "patch", "delete", "list"]
}
Testing the Vault configuration with vault cli from postgres
export environment variables
$ export VAULT_ADDR=https://vault.local:8200
$ export VAULT_CACERT=/etc/ssl/psql/ca.crt
$ export VAULT_TOKEN=$(cat /vault/token)
secrets list
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
pg-tde/ kv kv_4ae22c7c n/a
list secrets in pg-tde
$ vault list pg-tde/metadata
No value found at pg-tde/metadata
put secret in pg-tde
$ vault kv put pg-tde/pg_tde_key key=$(openssl rand 32 | base64)
============ Secret Path ============
pg-tde/data/pg_tde_key
======= Metadata =======
Key Value
--- -----
created_time 2025-07-16T07:08:15.770953098Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
get secret from pg-tde
$ vault kv get pg-tde/pg_tde_key
============ Secret Path ============
pg-tde/data/pg_tde_key
======= Metadata =======
Key Value
--- -----
created_time 2025-07-16T07:08:15.770953098Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1
=== Data ===
Key Value
--- -----
key M1Fk852AaEugt0obBjgopR/eFzqGoaCqUznCKZ7yvLs=
Based on the following configuration and tests listed, I would assume my self-hosted Vault is properly configured for providing an accessible KV secrets engine for pg_tde. What would be the issue for the error message I’m receiving?