尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Infisical 如何用 cert-manager 让 Kubernetes 集群通过 ACME 自动向私有 CA 申请证书?

Infisical 如何用 cert-manager 让 Kubernetes 集群通过 ACME 自动向私有 CA 申请证书? Infisical 如何用 cert-manager 让 Kubernetes 集群通过 ACME 自动向私有 CA 申请证书【免费下载链接】infisicalInfisical is the open-source platform for secrets, certificates, and privileged access management.项目地址: https://gitcode.com/GitHub_Trending/in/infisical如果你的目标是在 Kubernetes 集群里为工作负载签发 TLS 证书、并把续期这件事交给自动化流程Infisical 的 PKI 可以作为私有 CA配合集群内的 cert-manager 通过 ACME 协议完成这件事cert-manager 以 External Account BindingEAB身份向 Infisical 的 ACME 服务器申请证书证书和私钥写入 Kubernetes Secret到期前由 cert-manager 自动续期。这条路径适用于已有 Kubernetes 集群、Infisical 中已有一个 Application并且愿意用标准 ACME 客户端而非 Infisical 机器身份认证来拉取证书。需要说明的是Infisical 的 ACME 注册目前只支持 HTTP-01 域名验证DNS-01 在后续版本规划中。准备条件配置 ACME 注册并获取 EAB 凭据前置要求在 Infisical 侧完成一次 ACME enrollment 配置。具体操作路径见 ACME 注册文档要点如下进入Certificate Manager → Applications选择你的 Application。Application 上需要先由 Product Admin 附加 Certificate Profile如果看不到任何 profile需要找 Product Admin 附加一个。在Settings标签页找到Certificate Profiles区域对目标 profile 点击Configure在弹窗中选择Add enrollment method→ACME。配置域名验证方式两个选项HTTP-01 ChallengeACME 客户端通过在/.well-known/acme-challenge/提供文件来证明域名归属Skip Validation关闭域名归属验证文档警告仅对信任所有证书请求方的内网域名使用。保存后点击Reveal ACME EAB得到三项凭据ACME Directory URLACME 客户端连接的服务器地址该 URL 对 Application Profile 这一组合唯一经它申请的证书会关联到该 Application 并遵循所选 profile 的策略EAB Key Identifier (KID)标识 ACME 账户EAB Secret用于认证 ACME 客户端的密钥。当前 ACME enrollment 使用专用 EAB 凭据Kubernetes Auth 方式尚在规划中。安装 cert-manager在集群中安装 cert-manager文档给出的直接方式是应用 v1.19.1 的发布清单kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.1/cert-manager.yaml也可以按 cert-manager 官方安装文档选择其他安装方式。创建存放 EAB Secret 的 Kubernetes Secretcert-manager 需要一个 Kubernetes Secret 来存放上一步拿到的EAB SecretHMAC 密钥用它向 Infisical ACME 服务器认证。二选一方式一kubectl 命令。把namespace换成你要签发证书所在命名空间eab_secret换成 Reveal ACME EAB 得到的 EAB Secretkubectl create secret generic infisical-acme-eab-secret \ --namespace namespace \ --from-literaleabSecreteab_secret方式二配置文件的 YAML 版本文中namespace与eab_secret替换方式同上apiVersion: v1 kind: Secret metadata: name: infisical-acme-eab-secret namespace: namespace data: eabSecret: eab_secretkubectl apply -f acme-eab-secret.yaml创建连接 Infisical ACME 服务器的 Issuer创建 cert-manager 的Issuer或ClusterIssuer配置 cert-manager 使用你 Application 的 ACME 服务器签发证书。配置中需要替换的占位符namespace为 Issuer 所在命名空间acme_server_url为 ACME Directory URLyour_email为任意合法邮箱文档说明该字段目前被 Infisical 忽略但 ACME 协议要求提供acme_eab_kid为 EAB Key ID。apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: issuer-infisical namespace: namespace spec: acme: # ACME server URL from your Infisical Applications ACME enrollment server: acme_server_url # Email address for ACME account (any valid email works; currently ignored by Infisical) email: your_email # Required to honor the duration field in Certificate resources enableDurationFeature: true externalAccountBinding: # EAB Key ID from Infisical keyID: acme_eab_kid # Reference to the Kubernetes Secret containing the EAB HMAC key keySecretRef: name: infisical-acme-eab-secret key: eabSecret privateKeySecretRef: name: issuer-infisical-account-key solvers: - http01: ingress: # Replace with your actual ingress class if different className: nginx其中enableDurationFeature: true是必填项不加它时 cert-manager 会忽略 Certificate 资源里的duration字段证书统一按 47 天签发cert-manager 默认关闭该特性因为 Lets Encrypt 等公共 ACME 服务器不支持自定义有效期而 Infisical 支持。solvers里写的是 http01对应文档说明 Infisical ACME 当前只支持 HTTP-01 challenge如果你的域名不需要归属验证可以在 ACME 注册配置里启用Skip DNS ownership validation关闭验证。应用并检查 Issuer 是否创建成功kubectl apply -f issuer-infisical.yaml kubectl get issuers.cert-manager.io -n namespace -o wide文档示例输出NAME AGE issuer-infisical 21h注意Issuer是命名空间级资源Certificate 只能使用与它同一命名空间内的Issuer。如果需要用一份配置跨多个命名空间签发把kind改为ClusterIssuer并去掉metadata.namespace其余配置相同。创建 Certificate 资源创建 cert-manager 的Certificate资源向 Infisical ACME 服务器发起证书申请。以下 YAML 是文档给出的示例dnsNames需要换成你的实际域名namespace换成签发证书的目标命名空间apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: certificate-by-issuer namespace: namespace spec: dnsNames: - certificate-by-issuer.example.com # name of the resulting Kubernetes Secret secretName: certificate-by-issuer # total validity period of the certificate duration: 48h # cert-manager will attempt renewal 12 hours before expiry renewBefore: 12h # set to true to issue a CA certificate (policy must allow/require CA) isCA: false privateKey: algorithm: ECDSA # uses NIST P-256 curve size: 256 issuerRef: name: issuer-infisical该示例表示签发一个域名certificate-by-issuer.example.com、使用 ECDSA P-256 私钥、有效期 48 小时的证书cert-manager 会在到期前 12 小时尝试续期签出的证书与私钥存入名为certificate-by-issuer的 Secret。Certificate支持的完整字段列表以 cert-manager 的 API 参考为准文档同时提示 Infisical 的 PKI ACME 服务器目前并非支持所有字段。一个边界条件cert-manager 的Certificate资源无法指定pathLen。如果你用isCA: true签发 CA 证书请确保 Infisical 的证书策略没有设置Maximum Allowed Path Length限制否则请求会在策略校验阶段失败。验证证书结果签发状态用下面命令检查文档示例输出如下READY为 True、STATUS 显示证书未过期即成功kubectl get certificates -n namespace -o wideNAME READY SECRET ISSUER STATUS AGE certificate-by-issuer True certificate-by-issuer issuer-infisical Certificate is up to date and has not expired 20h然后确认证书和私钥确实落到了 Kubernetes Secret。ACME 方式下默认只生成tls.crt和tls.key两个数据项文档示例kubectl get secret certificate-by-issuer -n namespaceNAME TYPE DATA AGE certificate-by-issuer kubernetes.io/tls 2 26h如需查看证书内容可以用 openssl 解码后打印kubectl get secret certificate-by-issuer -n default -o jsonpath{.data.tls\.crt} | base64 --decode | openssl x509 -text -noout到这里证书已经可以作为 Kubernetes Secret 被集群内资源引用了续期由 cert-manager 按renewBefore阈值自动处理。限制与常见问题签出的有效期与预期不符先检查 Issuer 的acme块是否设置了enableDurationFeature: true。没有它无论duration写多少证书都按 47 天签发。域名验证方式当前只支持 HTTP-01 challengeDNS-01 在规划中不需要归属验证时应在 Infisical 的 ACME 注册配置中启用Skip DNS ownership validation。Secret 里没有 ca.crtcert-manager 的 ACME issuer 默认不会在生成的 Secret 中填充ca.crt字段。应用本身不依赖 CA 证书时不受影响确实需要时见下一节的可选分支。Issuer 作用域Issuer是命名空间级的跨命名空间签发请改用ClusterIssuer。可选分支用 trust-manager 向 Secret 注入 ca.crt如果工作负载需要ca.crt例如 mTLS文档给出的方案是叠加 cert-manager 生态的 trust-manager 自动注入安装 trust-managerhelm repo add jetstack https://charts.jetstack.io --force-update helm upgrade trust-manager jetstack/trust-manager \ --install \ --namespace cert-manager \ --wait \ --set secretTargets.enabledtrue \ --set secretTargets.authorizedSecretsAlltrue在 Infisical 中下载 CA 证书链Certificate Manager → Certificate Authorities选择你的 CA 后点击Download CA Certificate Chain创建 CA 证书 Secretpaste_the_downloaded_certificate_chain_here替换为下载到的证书链apiVersion: v1 kind: Secret metadata: name: infisical-ca-cert namespace: cert-manager type: Opaque stringData: ca.crt: | -----BEGIN CERTIFICATE----- paste_the_downloaded_certificate_chain_here -----END CERTIFICATE-----创建 trust-manager 的Bundle把ca.crt注入到目标命名空间的证书 Secret。metadata.name必须与 Certificate 的secretName一致namespaceSelector改成你的目标命名空间apiVersion: trust.cert-manager.io/v1alpha1 kind: Bundle metadata: name: certificate-by-issuer spec: sources: - secret: name: infisical-ca-cert key: ca.crt target: secret: key: ca.crt namespaceSelector: matchLabels: kubernetes.io/metadata.name: default验证kubectl get secret certificate-by-issuer -o yaml此时 Secret 的 data 中应能看到ca.crt、tls.crt和tls.key三项。另一种接入方式如果你更倾向用 Infisical 机器身份Universal Auth 或 Kubernetes Auth认证、而不是 ACME/EAB并希望 CA 链自动写入 Secret可以使用 Infisical Issuer 的方案配置思路不同见 Infisical Issuer 指南。本文的 ACME 路径与之互斥按集群内认证条件选一种即可。【免费下载链接】infisicalInfisical is the open-source platform for secrets, certificates, and privileged access management.项目地址: https://gitcode.com/GitHub_Trending/in/infisical创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表