8.4. 使用 ACME 签发者管理证书
Red Hat OpenShift 的 cert-manager Operator 支持使用 ACME CA 服务器(如 Let 的 Encrypt)来发布证书。
8.4.1. 关于 ACME 签发者
Red Hat OpenShift 的 cert-manager Operator 的 ACME 签发者类型代表自动的证书颁发机构 (ACME) 证书颁发机构 (CA) 服务器。ACME CA 服务器依赖于一个 质询(challenge) 来验证客户端是否拥有请求证书的域名。如果质询成功,Red Hat OpenShift 的 cert-manager Operator 可以发布证书。如果失败,Red Hat OpenShift 的 cert-manager Operator 不会发布证书。
8.4.1.1. 支持的 ACME 质询类型
Red Hat OpenShift 的 cert-manager Operator 支持 ACME 签发者的以下质询类型:
8.4.1.2. 支持的 DNS-01 供应商
Red Hat OpenShift 的 cert-manager Operator 支持以下 ACME 签发者的 DNS-01 供应商:
- Amazon Route 53
Azure DNS
注意Red Hat OpenShift 的 cert-manager Operator 不支持使用 Azure Active Directory (Azure AD) pod 身份为 pod 分配受管身份。
Google Cloud DNS
注意Red Hat OpenShift 的 cert-manager Operator 不支持使用 Google 工作负载身份联邦。
8.4.2. 配置 ACME 签发者以解决 HTTP-01 质询
您可以使用 cert-manager Operator for Red Hat OpenShift 设置 ACME 签发者来解决 HTTP-01 质询。此流程使用 Let 的 Encrypt 作为 ACME CA 服务器。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您有一个要公开的服务。在此过程中,该服务名为
sample-workload
。
流程
创建 ACME 集群签发者。
创建定义
ClusterIssuer
对象的 YAML 文件:acme-cluster-issuer.yaml
文件示例apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging 1 spec: acme: preferredChain: "" privateKeySecretRef: name: <secret_for_private_key> 2 server: https://acme-staging-v02.api.letsencrypt.org/directory 3 solvers: - http01: ingress: class: openshift-default 4
运行以下命令来创建
ClusterIssuer
对象:$ oc create -f acme-cluster-issuer.yaml
创建一个 Ingress 来公开用户工作负载的服务。
创建定义
Namespace
对象的 YAML 文件:namespace.yaml
文件示例apiVersion: v1 kind: Namespace metadata: name: my-ingress-namespace 1
- 1
- 指定 Ingress 的命名空间。
运行以下命令来创建
Namespace
对象:$ oc create -f namespace.yaml
创建定义
Ingress
对象的 YAML 文件:ingress.yaml
文件示例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: sample-ingress 1 namespace: my-ingress-namespace 2 annotations: cert-manager.io/cluster-issuer: letsencrypt-staging 3 acme.cert-manager.io/http01-ingress-class: openshift-default 4 spec: ingressClassName: openshift-default 5 tls: - hosts: - <hostname> 6 secretName: sample-tls 7 rules: - host: <hostname> 8 http: paths: - path: / pathType: Prefix backend: service: name: sample-workload 9 port: number: 80
- 1
- 指定 Ingress 的名称。
- 2
- 指定您为 Ingress 创建的命名空间。
- 3
- 指定您创建的集群签发者。
- 4
- 指定 Ingress 类。
- 5
- 指定 Ingress 类。
- 6
- 将
<hostname>
替换为要与证书关联的 Subject Alternative Name。此名称用于在证书中添加 DNS 名称。 - 7
- 指定要存储创建证书的 secret。
- 8
- 将
<hostname>
替换为主机名。您可以使用<host_name>.<cluster_ingress_domain>
语法来利用*.<cluster_ingress_domain>
通配符 DNS 记录并为集群提供证书。例如,您可以使用apps.<cluster_base_domain>
。否则,您必须确保为所选主机名存在 DNS 记录。 - 9
- 指定要公开的服务名称。本例使用名为
sample-workload
的服务。
运行以下命令来创建
Ingress
对象:$ oc create -f ingress.yaml
8.4.3. 配置 ACME 签发者以解决 DNS-01 质询
您可以使用 cert-manager Operator for Red Hat OpenShift 设置 ACME 签发者来解决 DNS-01 质询。此流程使用 Let’s Encrypt 作为 ACME CA 服务器,并演示了如何解决 Amazon Route 53 的 DNS-01 质询。
不支持私有 DNS 区域。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问 OpenShift Container Platform 集群。 您已为 Amazon Route 53 设置了一个 IAM 角色。如需更多信息,请参阅上游 cert-manager 文档中的 Route53。
注意如果您的集群没有配置为使用 AWS 安全令牌服务(STS),您必须提供显式
accessKeyID
和secretAccessKey
凭证。如果集群使用 AWS STS,您可以使用隐式 ambient 凭证。
流程
可选:覆盖 DNS-01 自我检查的名称服务器设置:
只有在目标公共托管区与集群的默认私有托管区重叠时才需要这一步。
运行以下命令来编辑
CertManager
资源:$ oc edit certmanager cluster
使用以下覆盖参数添加
spec.controllerConfig
部分:apiVersion: operator.openshift.io/v1alpha1 kind: CertManager metadata: name: cluster ... spec: ... controllerConfig: 1 overrideArgs: - '--dns01-recursive-nameservers=1.1.1.1:53' 2 - '--dns01-recursive-nameservers-only' 3
- 保存文件以使改变生效。
可选:为签发者创建一个命名空间。
创建定义
Namespace
对象的 YAML 文件:namespace.yaml
文件示例apiVersion: v1 kind: Namespace metadata: name: my-issuer-namespace 1
- 1
- 指定签发者的命名空间。
运行以下命令来创建
Namespace
对象:$ oc create -f namespace.yaml
运行以下命令,创建一个 secret 来存储 AWS 凭证:
$ oc create secret generic aws-secret --from-literal=awsSecretAccessKey=<aws_secret_access_key> \ 1 -n my-issuer-namespace
- 1
- 将
<aws_secret_access_key>
替换为您的 AWS secret 访问密钥。
创建签发者。
创建定义
Issuer
对象的 YAML 文件:issuer.yaml
文件示例apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: letsencrypt-staging 1 namespace: my-issuer-namespace 2 spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory 3 email: "<email_address>" 4 privateKeySecretRef: name: <secret_private_key> 5 solvers: - dns01: route53: accessKeyID: <aws_key_id> 6 hostedZoneID: <hosted_zone_id> 7 region: us-east-1 secretAccessKeySecretRef: name: "aws-secret" 8 key: "awsSecretAccessKey" 9
- 1
- 为签发者提供名称。
- 2
- 指定您为签发者创建的命名空间。
- 3
- 指定用于访问 ACME 服务器的
directory
端点 URL。这个示例使用 Let’s Encrypt staging 环境。 - 4
- 将
<email_address>
替换为您的电子邮件地址。 - 5
- 将
<secret_private_key>
替换为要存储 ACME 帐户私钥的 secret 名称。 - 6
- 将
<aws_key_id>
替换为您的 AWS 密钥 ID。 - 7
- 将
<hosted_zone_id>
替换为您的托管区 ID。 - 8
- 指定您创建的 secret 的名称。
- 9
- 指定您创建的 secret 中的密钥,用于存储 AWS secret 访问密钥。
运行以下命令来创建
Issuer
对象:$ oc create -f issuer.yaml
创建证书。
创建用于定义
Certificate
对象的 YAML 文件:certificate.yaml
文件示例apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: my-tls-cert 1 namespace: my-issuer-namespace 2 spec: isCA: false commonName: '<common_name>' 3 secretName: my-tls-cert 4 dnsNames: - '<domain_name>' 5 issuerRef: name: letsencrypt-staging 6 kind: Issuer
运行以下命令来创建
Certificate
对象:$ oc create -f certificate.yaml