使用 Vault 签发证书

证书管理器签发者支持使用 HashiCorp Vault 在新选项卡中打开 服务器来创建和签发证书。要使用 Vault 签发者,您必须已设置可供证书管理器访问的 Vault 服务器。

重要说明:使用 Vault 签发者时,证书管理器会尝试创建有效期为 90 天的证书,因此 max_ttl 必须至少为 90 天(2160 小时)。请勿使用小于 30 天的 max_ttl,因为这会导致证书不到 30 天就到期,证书管理器随即会尝试对其进行更新。

配置 Vault 中的证书引擎

请在 Vault 服务器上完成以下配置:

  1. 通过运行以下命令,启用 PKI(证书)私钥引擎:

    vault secrets enable pki
    
  2. 运行以下命令以微调私钥引擎,使证书满足证书管理器的 90 天持续时间请求:

     vault secrets tune -max-lease-ttl=8760h pki
    
  3. 运行以下命令,以创建具有定制到期时间的自签名 CA 证书和密钥对。

     vault write pki/root/generate/internal common_name=ibm.com ttl=8760h
    

    上一条命令适用于根 CA,但是可扩展为使用中间 CA。HashiCorp Vault 产品文档提供了有关此方案的更多信息。

  4. 使用以下命令来配置用于创建证书的 URL,其中,vault_server 是 Vault 服务器 IP 地址。运行以下命令:

      vault write pki/config/urls issuing_certificates="http://<vault_server>:8200/v1/pki/ca" crl_distribution_points="http://<vault_server>:8200/v1/pki/crl"
    
  5. 创建可处理证书签名请求的角色。运行以下命令:

    vault write pki/roles/my-role allowed_domains=ibm.com allow_subdomains=true allow_any_name=true allow_localhost=true enforce_hostnames=false max_ttl=8760h
    

将 Vault 服务器配置为签发证书后,可以创建引用 Vault 服务器以创建证书的 Kubernetes 资源。

向 Vault 服务器进行认证

证书管理器中的 Vault 服务器支持可支持两种认证方法。证书管理器签发者必须使用下列其中一种认证方法。

使用令牌认证来创建签发者

要将 Vault 与令牌认证配合使用,需要一个包含 Vault 认证令牌的 Kubernetes 私钥。存储在私钥中时,认证令牌必须采用 Base64 编码。请在需要签发者的名称空间中创建此资源。如果要使用集群签发者,您必须在 kube-system 名称空间中创建此私钥。

可以使用 Vault API 来创建令牌。请注意,您需要更新已到期的令牌,因为证书管理器不知道令牌到期。HashiCorp Vault 在新选项卡中打开 文档包含有关令牌认证的更多详细信息。

请在 Vault 服务器上完成以下配置:

  1. 创建启用 PKI Vault API 的策略。该策略必须包括以下功能:createreadupdatedeletelistsudo

    • 创建策略文件,并命名为类似于 pki_policy.hcl 的名称。请将以下内容添加到策略文件中:

      path "pki*" {  capabilities = ["create", "read", "update", "delete", "list", "sudo"]}
      
    • 运行以下命令以创建策略,其中 pki_policy 是策略名称,pki_policy.hcl 是文件名:

      vault policy write pki_policy pki_policy.hcl
      
  2. 创建一个使用您刚刚创建的策略的令牌。请运行以下命令,其中 pki_policy 是刚刚创建的策略的名称。请确保 ttl 设置不超过针对您所创建的令牌发出更新的周期:

     vault write /auth/token/create policies=<"pki_policy"> no_parent=true no_default_policy=true renewable=true ttl=767h num_uses=0
    
  3. 创建一个包含 Base64 编码认证令牌的 Kubernetes 私钥。您可使用以下命令将该令牌编码,其中 abe02917-7494-c94c-a4f1-99890caf06d7 是您的令牌:

     echo abe02917-7494-c94c-a4f1-99890caf06d7 | base64
    

    请参阅以下 YAML 样本,它使用 Vault 令牌来定义私钥:

     apiVersion: v1
     kind: Secret
     type: Opaque
     metadata:
       name: my-vault-token
       namespace: default
     data:
       token: "YWJlMDI5MTctNzQ5NC1jOTRjLWE0ZjEtOTk4OTBjYWYwNmQ3Cg=="
    

    重要说明:Vault 中的令牌会到期。证书管理器不会刷新令牌以避免其到期,请确保处理令牌更新事宜。根令牌不会到期,但是只应用于开发或测试环境。

    要更新令牌,请运行类似如下的 Vault 命令,其中 abe02917-7494-c94c-a4f1-99890caf06d7 是您的令牌:

    vault write /auth/token/renew token=abe02917-7494-c94c-a4f1-99890caf06d7
    
  4. 创建使用 Vault 令牌私钥的 Vault 签发者。Vault 签发者引用您刚刚创建的私钥、Vault 服务器 URL 以及角色路径:

     apiVersion: certmanager.k8s.io/v1alpha1
     kind: Issuer
     metadata:
       name: my-vault-issuer
       namespace: default
     spec:
       vault:
         path: pki/sign/my-role
         server: http://192.168.44.241:8200
         auth:
           tokenSecretRef:
             name: my-vault-token
             key: token
    
  5. 创建使用该 Vault 签发者的证书。以下示例定义一个证书,它使用上一步中引用的签发者:

     apiVersion: certmanager.k8s.io/v1alpha1
     kind: Certificate
     metadata:
       name: my-cert1-com
       namespace: default
     spec:
       secretName: my-cert1-tls
       issuerRef:
         name: my-vault-issuer
         commonName: myhostname.ibm.com
       dnsNames:
       - myhostname.ibm.com
    

使用 AppRole 认证创建签发者

Vault 支持 AppRole 认证,这允许证书管理器使用 AppRole 私钥标识代替令牌来连接到 Vault。请在 Vault 服务器上完成以下配置,以配置 AppRole 认证。

请参阅 HashiCorp Vault 在新选项卡中打开 文档,以获取更多信息。

  1. 使用以下命令启用 AppRole 认证:

    vault auth enable approle
    
  2. 创建启用 PKI Vault API 的策略。该策略必须包括以下功能:createreadupdatedeletelistsudo

    • 创建策略文件,并命名为类似于 pki_policy.hcl 的名称。请将以下内容添加到策略文件中:

      path "pki*" {  capabilities = ["create", "read", "update", "delete", "list", "sudo"]}
      
    • 运行以下命令以创建策略,其中 pki_policy 是策略名称,pki_policy.hcl 是文件名:

      vault policy write pki_policy pki_policy.hcl
      
  3. 运行以下命令,以创建一个使用已创建的策略的具名角色:

     vault write auth/approle/role/my-role secret_id_ttl=8760h token_num_uses=0 token_ttl=20m token_max_ttl=30m secret_id_num_uses=0 policies=pki_policy
    

    重要说明:secret_id_ttl 到期类似于令牌到期,只不过 secret_id 无法更新。

  4. 使用以下命令获取 AppRole 的 role_id

     vault read auth/approle/role/my-role/role-id
    
  5. 使用以下命令获取 AppRole 的 secret_id

     vault write -f auth/approle/role/my-role/secret-id
    
  6. 接下来,需要创建一个包含 Base64 编码 AppRole secret_id 的 Kubernetes 私钥。要将 Vault 与 AppRole 认证配合使用,需要一个包含 Vault AppRole secret_id 的 Kubernetes 私钥。

    存储在私钥中时,AppRole secret_id 必须采用 Base64 编码。请在需要签发者的名称空间中创建此资源。如果要使用集群签发者,您必须在 kube-system 名称空间中创建此私钥。

    echo abe02917-7494-c94c-a4f1-99890caf06d7 | base64
    

    请参阅以下 YAML 样本,它定义一个包含 Base64 编码 AppRole secret_id 的 Kubernetes 私钥:

    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
     name: cm-vault-approle
     namespace: default
    data:
     secretId: "ZmNlODI5OWUtNjlkNi1hZjY1LWRhYTItYWYxODI4OWZkYjVjCg=="
    
  7. 接下来,创建使用 AppRole 私钥的 Vault 签发者。请编辑以下 YAML 样本。

    apiVersion: certmanager.k8s.io/v1alpha1
    kind: Issuer
    metadata:
     name: cm-vault-issuer
     namespace: default
    spec:
     vault:
       path: pki/sign/my-role
       server: http://192.168.230.158:8200
       auth:
         appRole:
           path: approle
           roleId: "92b6d857-6917-b2cf-6a51-94a44989d2b2"
           secretRef:
             name: cm-vault-approle
             key: secretId
    

    此处,证书管理器 Vault 签发者引用刚刚创建的私钥,该私钥中包含 AppRole 认证的 secret_id。签发者指定 role_id。此外,还会提供用于处理证书签名请求的 Vault 服务器和 URL 路径。

    重要说明:在使用 AppRole 认证时,请注意避免混淆这两个角色。其中一个角色用于证书签名,在签发者 vault path 中指定。另一个角色用于授权 AppRole 中的特定功能。

  8. 创建使用该 Vault 签发者的证书。

    以下样本定义一个证书,它使用上一步中引用的签发者:

    apiVersion: certmanager.k8s.io/v1alpha1
    kind: Certificate
    metadata:
     name: vault-approle-aludel1-cert
     namespace: default
    spec:
     secretName: vault-approle-aludel1-cert-secret
     issuerRef:
       name: cm-vault-issuer
     commonName: myhostname.ibm.com
     dnsNames:
     - myhostname.ibm.com
    

如果 secret_id_ttl 设置得过小,而且该值到期,那么必须创建新的 secret_id。必须编辑签发者以及所引用的私钥,以配置新的 secret_id

请参阅使用 IBM Cloud Private 证书管理器 (cert-manager),以获取更多证书管理器主题。