Docker部署Vault TLS证书验证失败:缺少IP SANs无法初始化
解决Vault TLS证书无IP SANs导致的初始化错误
你遇到的这个错误核心原因很明确:你的TLS证书里没有包含127.0.0.1这个IP地址的Subject Alternative Name(SAN)。现代TLS客户端(包括Vault)验证证书时,会严格检查请求的IP/域名是否在证书的SAN列表里,仅靠CN字段已经不足以通过验证了。不用-tls-skip-verify是对的,那只是临时规避,下面咱们来彻底解决这个问题:
步骤1:修改openssl.cnf配置文件,添加IP SANs
你需要在openssl配置里明确指定SAN扩展,把127.0.0.1(以及你可能用到的Docker容器IP、域名)加进去。以下是完整的配置示例,你可以根据自己的需求调整:
[ ca ] default_ca = testca [ testca ] dir = . certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/newcerts private_key = $dir/cakey.pem serial = $dir/serial default_days = 365 default_md = sha256 policy = testca_policy x509_extensions = testca_extensions [ testca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = supplied [ testca_extensions ] basicConstraints = CA:false subjectAltName = @alt_names keyUsage = digitalSignature,keyEncipherment [ req ] prompt = no default_bits = 2048 default_md = sha256 distinguished_name = dn req_extensions = v3_req [ dn ] CN = localhost O = YourOrganization OU = YourTeam L = YourCity ST = YourState C = US emailAddress = admin@yourdomain.com [ v3_req ] subjectAltName = @alt_names [ alt_names ] IP.1 = 127.0.0.1 # 如果你的Docker容器有固定IP,也可以加上 # IP.2 = 172.17.0.2 DNS.1 = localhost # 如果用域名访问Vault,添加对应的DNS条目 # DNS.2 = vault.yourdomain.com
步骤2:重新生成符合要求的证书
先清理之前生成的旧证书文件(如果有的话),然后按以下步骤重新生成:
- 生成CA密钥和根证书:
openssl req -new -x509 -days 3650 -keyout cakey.pem -out cacert.pem -config openssl.cnf
- 生成Vault服务器的密钥和证书签名请求(CSR):
openssl genrsa -out vault.key 2048 openssl req -new -key vault.key -out vault.csr -config openssl.cnf
- 用CA签署服务器证书:
# 先初始化CA所需的文件(第一次执行需要) touch index.txt echo 01 > serial openssl ca -in vault.csr -out vault.crt -config openssl.cnf -extensions testca_extensions
步骤3:配置并启动Vault Docker容器
首先创建一个Vault配置文件config.hcl,指定证书路径:
listener "tcp" { address = "0.0.0.0:8200" tls_cert_file = "/vault/certs/vault.crt" tls_key_file = "/vault/certs/vault.key" tls_client_ca_file = "/vault/certs/cacert.pem" } storage "file" { path = "/vault/data" } disable_mlock = true
然后用Docker启动Vault,挂载证书和配置文件:
docker run -d \ --name vault-server \ -v $(pwd)/config.hcl:/vault/config/config.hcl \ -v $(pwd)/:/vault/certs \ -p 8200:8200 \ hashicorp/vault server -config=/vault/config/config.hcl
步骤4:验证Vault初始化
设置Vault环境变量时,指定CA证书路径,这样客户端就能正常验证证书了:
export VAULT_ADDR=https://127.0.0.1:8200 export VAULT_CACERT=$(pwd)/cacert.pem
现在执行vault init,应该就能顺利完成初始化,不会再出现x509验证错误了。
内容的提问来源于stack exchange,提问作者Maciej Ziniewicz
相关产品推荐
相关产品推荐

