Cert Manager 申请 SSL 证书流程及相关概念 - 三

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: Cert Manager 申请 SSL 证书流程及相关概念 - 三

中英文对照表

英文 英文 - K8S CRD 中文 备注
certificates Certificate 证书 certificates.cert-manager.io/v1
certificate issuers Issuer 证书颁发者 issuers.cert-manager.io
ClusterIssuer 集群证书颁发者 clusterissuers.cert-manager.io
certificate request CertificateRequest 证书申请 certificaterequests.cert-manager.io
order Order (证书)订单 orders.acme.cert-manager.io
challenge Challenge (证书)挑战 challenges.acme.cert-manager.io
SelfSigned 自签名 cert-manager Issuer 的一种
CA 证书颁发机构 Certificate Authority 的缩写;
cert-manager Issuer 的一种
Vault 金库 cert-manager Issuer 的一种,即 Hashicorp Vault
Venafi Venafi 在线证书办理服务,目前用的不多。
External 外部 cert-manager Issuer 的一种
ACME 自动证书管理环境 Automated Certificate Management Environment 的缩写;
cert-manager Issuer, 包括 HTTP01 和 DNS01

书接上回, 最后了解一下 cert-manager 的相关概念.

相关概念

cert-manager 相关 CRD

Issuer(证书颁发者)

IssuersClusterIssuers 是 Kubernetes CRD,代表证书颁发机构(CA),能够通过兑现证书签名请求来生成签名证书。所有 cert-manager 证书都需要一个被引用的签发者,该签发者处于准备就绪的状态,可以尝试兑现请求。

Issuer 类型的一个例子是 “CA”。一个简单的 CA Issuer 如下。

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: ca-issuer
  namespace: mesh-system
spec:
  ca:
    secretName: ca-key-pair
YAML

这是一个简单的 Issuer,将根据私钥(私钥存储在 Secret 的ca-key-pair 中)签署证书。

  • Issuer: 限定在一个 NameSpace 的资源;
  • ClusterIssuer: 可以用于在所有命名空间中颁发 “证书”。

Certificate(证书)

cert-manager 有 Certificate 的概念,定义了所需的 X.509 证书,它将被更新并保持最新。一个 Certificate 是一个 Kubernetes 的 CRD,它引用了一个 IssuerClusterIssuer,决定了什么将被授予证书请求。

当一个 Certificate 被创建时,一个相应的 CertificateRequest 资源由 cert-manager 创建,其中包含编码的 X.509 证书请求,Issuer reference,以及其他基于 证书 资源规范的选项。

这个 Certificate 将告诉 cert-manager 尝试使用哪个 Issuer 来获取域名的证书密钥对。如果成功,得到的 TLS 密钥和证书将被保存在一个 secret 中,Key 分别为 tls.keytls.crt。这个 Secret 将与Certificate CRD 在同一个命名空间。示例如下:

保存证书密钥对的 Secret

当证书由中间 CA 签发,并且 Issuer 可以提供签发的证书链时,tls.crt 的内容将是请求的证书,后面是证书链。

此外,如果证书颁发机构是已知的,相应的 CA 证书将被存储在 Secret 中,密钥为 ca.crt。例如,对于 ACME 发行者,CA 是不知道的,ca.crt 将不存在于 acme-crt-secret 中。

cert-manager 有意避免在 tls.crt 中添加根证书,因为在安全进行 TLS 的情况下,这些证书是无用的。

当配置一个客户端连接到具有由私人 CA 签署的服务证书的 TLS 服务器时,你需要向客户端提供 CA 证书,以便它验证服务器。

dnsNames字段指定了与证书相关的 SAN 的列表。

证书生命周期

这张图显示了使用 ACME/Let’s Encrypt Issuer 的名为 cert-1 的证书的生命周期。

证书生命周期

CertificateRequest(证书申请)

CertificateRequest是 cert-manager 中的一个 Kubernetes CRD,用于向 Issuer 申请 X.509 证书。该资源包含一个 Base64 编码的 PEM 编码的证书请求字符串,它被发送到被引用的签发者。一个成功的签发将返回一个基于证书签署请求的签名证书。CertificateRequests通常由控制器或其他系统消费和管理,不应该由人类使用 - 除非特别需要。

CertificateRequestspec 内的所有字段,以及任何管理的 cert-manager 注释,都是不可改变的,创建后不能修改。

成功签发证书签署请求将导致对资源的更新,用签署的证书、证书的 CA(如果可用)设置状态,并将 Ready 条件设置为 True。如下图:

Status

无论证书签署请求的签发是否成功,签发的重试都 不会 发生。管理 CertificateRequests 的逻辑和生命周期是其他控制器的责任。

条件

CertificateRequests 有一组强定义的条件,控制器或服务应该使用和依赖这些条件来决定下一步对资源采取什么行动。

Ready

每个准备好的条件由一对Ready–一个布尔值,和Reason–一个字符串组成。这组值和含义如下:

Ready Reason 条件含义
False Pending CertificateRequest目前正处于等待状态,等待其他操作的发生。这可能是由于Issuer' 还不存在,或者Issuer’正在签发证书。
False Failed 证书未能被签发–要么是返回的证书未能被解码,要么是用于签名的参考签发者的实例失败。它的控制器将不会对 CertificateRequest 采取进一步行动。
True Issued 被引用的 Issuer 已成功签发了一份经签名的证书。

ACME Orders 和 Challenges

cert-manager 支持从 ACME 服务器请求证书,包括从 Let’s Encrypt,使用 ACME Issuer。这些证书通常在公共互联网上被大多数计算机所信任。为了成功申请证书,cert-manager 必须解决 ACME challenge,完成这些 challenge 是为了证明客户拥有被申请的 DNS 地址。

为了完成这些 challenge,cert-manager 引入了两种 CRD 类型:OrdersChallenges

Orders (订单)

Orders资源被 ACME 发行者用来管理 ACME ‘订单’ 的生命周期,以获得签名的 TLS 证书。关于 ACME 订单和域名验证的更多细节可以在 Let’s Encrypt 网站 这里 找到。一个订单代表了一个单一的证书请求,一旦一个新的 CertificateRequest 资源引用 ACME 发行人,该订单就会自动创建。一旦 Certificate 资源被创建、规格改变或需要更新,CertificateRequest 资源将由 cert-manager 自动创建。

作为终端用户,您将永远不需要手动创建一个 Order 资源。一旦创建,Order 不能被改变。相反,必须创建一个新的 Order资源。

Order 资源封装了该 “订单” 的多个 ACME Challenge,因此,将管理一个或多个 Challenge 资源。

Challenges (挑战)

Challenges 资源被 ACME 发行者用来管理 ACME challenge 的生命周期,为了完成对一个 DNS 名称 / 标识的 “认证”,必须完成 challenge。

当一个 Order 资源被创建时,order 控制器将为每个正在被 ACME 服务器认证的 DNS 名称创建 Challenge资源。

作为终端用户,你永远不需要手动创建一个 Challenge 资源。一旦创建,Challenge就不能被改变。相反,必须创建一个新的 Challenge资源。

Challenge 生命周期

Challenges 资源被创建后,它最初将被排队处理。在 challenge 被 “安排” 开始之前,处理将不会开始。这种调度过程可以防止一次尝试太多的 challenge,或一次尝试对同一 DNS 名称的多个 challenge。

一旦 challenge 被安排,它将首先与 ACME 服务器进行 “同步”,以确定其当前状态。如果 challenge 已经有效,它的 status 将被更新为 valid,并且还将设置 status.processing = false 以 “取消计划”。

如果 challenge 仍然 “pending”,challenge 控制器将使用配置的解决方法(HTTP01 或 DNS01 之一)“present” challenge。一旦 challenge 被 “present”,它将设置status.presented = true

一旦 “present”,challenge 控制器将执行 “self check”,以确保 challenge 已经 “propagated(已传播)”(即权威的 DNS 服务器已被更新以作出正确响应,或 ingress 资源的变化已被 ingress controller 观察到并正在使用)。

如果自检失败,cert-manager 将以固定的 10 秒重试时间间隔重试自检。没有完成自检的 challenge 将继续重试,直到用户通过重试 “订单”(通过删除 " 订单 " 资源)或修改相关的 " 证书 " 资源来解决任何配置错误进行干预。

一旦自检通过,与此 challenge 相关的 ACME "authorization(认证) " 将被 “accepted(接受)”。

接受认证后的最终状态将被复制到 challenge 的status.state 字段,如果 ACME 服务器试图验证 challenge 时发生错误,也会复制 “error reason(错误原因)”。

一旦 challenge 进入 validinvalidexpiredrevoked (撤销)状态,它将设置 status.processing = false,以防止 ACME challenge 的任何进一步处理,如果有积压的 challenge 要完成,允许安排另一个 challenge。

Challenge 调度

cert-manager 并不试图一次处理所有的 challenge ,而是对 challenge 进行 “调度”。

这个调度器对同时进行的 challenge 的最大数量设置了上限,并且不允许对同一 DNS 名称和解算器类型(HTTP01DNS01)的两个 challenge 同时完成。

一次可以处理的最大 challenge 数量是 60 个,原因是 ddff78

系列文章

📚️ 参考文档

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
262136 0
|
Kubernetes 网络协议 网络安全
使用cert-manager给阿里云的DNS域名授权SSL证书
背景介绍cert-manager是Kubernetes上一个管理SSL证书的插件,配合nginx-ingress可以对网站配置https访问,在加上letsencrypt提供免费的SSL证书,所有就产生了cert-manager+nginx-ingress+letsencrypt的免费套餐。
8913 0
|
3月前
|
人工智能 JSON 前端开发
Agentic AI崛起:九大核心技术定义未来人机交互模式​
本文系统梳理AI智能体架构设计的九大核心技术,涵盖智能体基础、多智能体协作、知识增强、模型优化、工具调用、协议标准化及人机交互等关键领域,助力构建高效、智能、协同的AI应用体系。建议点赞收藏,持续关注AI架构前沿技术。
984 1
|
5月前
|
Linux Windows
Windows 10/11从官网下载ISO的方法
本文介绍了两种从微软官网下载Windows 10/11 ISO镜像的方法。一是通过修改浏览器User Agent为Linux系统,使官网提供ISO下载链接;二是使用UUPDUMP工具,从官网下载并转换为ISO格式,支持最新开发版,操作简便。
|
存储 开发者 Docker
|
运维 供应链 前端开发
开发一个 ERP
【9月更文第5天】开发一个 ERP (Enterprise Resource Planning) 系统是一项复杂的工程,涉及到多个业务流程的集成与优化。ERP 系统旨在帮助企业整合财务、人力资源、采购、销售、库存管理和生产计划等多个部门的数据,从而提高运营效率和决策质量。本文将带你一起体验从零开始开发一个简单的 ERP 系统,并通过示例代码来说明关键组件的设计与实现。
821 3
|
缓存 NoSQL 数据库
高性能Web服务器架构设计
【8月更文第28天】在当今互联网时代,网站的响应速度直接影响用户体验和业务成功率。因此,构建一个高性能的Web服务器架构至关重要。本文将从硬件配置、软件架构以及网络设置三个方面探讨如何提高Web服务器的性能,并提供一些实际的代码示例。
701 0
|
SQL 关系型数据库 MySQL
【Go语言专栏】使用Go语言连接MySQL数据库
【4月更文挑战第30天】本文介绍了如何使用Go语言连接和操作MySQL数据库,包括选择`go-sql-driver/mysql`驱动、安装导入、建立连接、执行SQL查询、插入/更新/删除操作、事务处理以及性能优化和最佳实践。通过示例代码,展示了连接数据库、使用连接池、事务管理和性能调优的方法,帮助开发者构建高效、稳定的Web应用。
2041 0
|
安全 Java 程序员
Java中的异常处理:深入理解try-catch-finally
在Java编程的海洋中,异常处理如同航行中的避风港,为程序的安全运行提供保障。本文将带你领略try-catch-finally结构的风采,从浅入深地探索异常处理的奥秘,让你在面对程序中的风浪时,能稳握舵盘,驾驭异常。
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装:
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装: