K8s部署的Hashicorp Vault证书认证失效,如何配置服务端与客户端证书?
问题根因
你当前使用的是Vault服务端证书作为客户端登录凭证,该证书的扩展密钥用法仅声明了serverAuth(服务端身份认证),缺少客户端认证必需的clientAuth扩展密钥用法,因此触发密钥用法不兼容的报错。
服务端证书和客户端证书是两类用途不同的证书,不可混用。你之前生成的
vault.key、vault.crt仅用于客户端验证Vault服务端的身份,不能作为客户端登录的认证凭证。
解决步骤
1. 生成专用客户端证书
你需要额外生成一对带clientAuth密钥用法的客户端证书,可直接通过K8s内置CA签发,操作如下:
- 生成客户端私钥
openssl genrsa -out /tmp/client-web.key 2048
- 创建客户端CSR配置文件,注意添加
clientAuth扩展密钥用法
cat <<EOF >/tmp/client-csr.conf [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth EOF
- 生成客户端证书签名请求(CSR)
openssl req -new -key /tmp/client-web.key -subj "/CN=web" -out /tmp/client-web.csr -config /tmp/client-csr.conf
- 创建并提交K8s CertificateSigningRequest资源
export CLIENT_CSR_NAME=vault-client-web-csr cat <<EOF >/tmp/client-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: ${CLIENT_CSR_NAME} spec: groups: - system:authenticated request: $(cat /tmp/client-web.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - client auth EOF
kubectl create -f /tmp/client-csr.yaml
- 批准客户端CSR
kubectl certificate approve ${CLIENT_CSR_NAME}
- 导出签发后的客户端证书
clientCert=$(kubectl get csr ${CLIENT_CSR_NAME} -o jsonpath='{.status.certificate}') echo "${clientCert}" | openssl base64 -d -A -out /tmp/client-web.crt
CA证书仍使用你之前导出的vault.ca即可。
2. 配置Vault cert认证引擎
先使用root token或其他有权限的账号登录Vault,完成cert认证的基础配置:
- 开启cert认证引擎
vault auth enable cert
- 配置信任的CA证书,绑定登录角色
vault write auth/cert/certs/web \ display_name=web \ policies=default \ certificate=@/tmp/vault.ca \ allowed_common_names=web \ ttl=3600
参数说明:
policies可替换为你需要给该登录身份分配的权限策略allowed_common_names要和客户端证书的CN(当前为web)保持一致
3. 执行证书登录
使用新生成的客户端证书执行登录即可:
vault login \ -method=cert \ -ca-cert=/tmp/vault.ca \ -client-cert=/tmp/client-web.crt \ -client-key=/tmp/client-web.key \ name=web
内容的提问来源于stack exchange,提问作者Ana Franco
相关产品推荐
相关产品推荐

