前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kubebuilder Webhook 开发之创建 TLS 证书

Kubebuilder Webhook 开发之创建 TLS 证书

原创
作者头像
blazehu
发布于 2022-08-16 09:22:47
发布于 2022-08-16 09:22:47
2K0
举报
文章被收录于专栏:小千世界小千世界

在编写一个准入 Webhook 服务时,需要配置相关证书,k8s 提供了 api 用于对用户自主创建的证书进行认证签发。以下部分演示为 Webhook 服务创建 TLS 证书。

创建 TLS 证书

创建你的证书

通过运行以下命令生成私钥:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
  "hosts": [
    "my-svc.my-namespace.svc.cluster.local",
    "my-pod.my-namespace.pod.cluster.local",
    "192.0.2.24",
    "10.0.34.2"
  ],
  "CN": "my-pod.my-namespace.pod.cluster.local",
  "key": {
    "algo": "ecdsa",
    "size": 256
  }
}
EOF

此命令生成两个文件;它生成包含 PEM 编码 PKCS#10 证书请求的 server.csr, 以及 PEM 编码密钥的 server-key.pem,用于待生成的证书。

创建证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: example
spec:
  request: $(cat server.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF

你能看到的输出类似于:

代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example created

Warning: certificates.k8s.io/v1beta1 CertificateSigningRequest is deprecated in v1.19+, unavailable in v1.22+; use certificates.k8s.io/v1 CertificateSigningRequest

CSR 处于 Pending 状态。执行下面的命令你将可以看到:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME                     REQUESTOR                 CONDITION
example   17s   kubernetes.io/legacy-unknown   100015926370-1650441195   Pending
批准证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
kubectl certificate approve example
代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example approved

你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE    SIGNERNAME                     REQUESTOR                 CONDITION
example   5m4s   kubernetes.io/legacy-unknown   100015926370-1650441195   Approved,Issued
下载证书并使用它
代码语言:shell
AI代码解释
复制
kubectl get csr example -o jsonpath='{.status.certificate}' | base64 --decode > server.crt

现在你可以将 server.crtserver-key.pem 作为你的服务的 https 认证了。

例如 kubebuilder 中使用 TLS 证书,将 server.crtserver-key.pem 放在 cert 目录中并修改名称为 tls.crttls.key,然后指定证书目录:

代码语言:go
AI代码解释
复制
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
		Scheme:                 scheme,
		MetricsBindAddress:     metricsAddr,
		Port:                   9443,
		HealthProbeBindAddress: probeAddr,
		LeaderElection:         enableLeaderElection,
		LeaderElectionID:       "27e1b0af.blazehu.com",
		CertDir:                "./cert/",
	})

从 v1beta1 迁移到 v1

上述例子使用 certificates.k8s.io/v1beta1 API 版本的 CertificateSigningRequest 不在 v1.22 版本中继续提供。官方迁移指南点这里。 我们可以使用 certificates.k8s.io/v1 API 版本,此 API 从 v1.19 版本开始可用。

  • certificates.k8s.io/v1 中需要额外注意的变更:
    • 对于请求证书的 API 客户端而言:
      • spec.signerName 现在变成必需字段(参阅 已知的 Kubernetes 签署者), 并且通过 certificates.k8s.io/v1 API 不可以创建签署者为 kubernetes.io/legacy-unknown 的请求
      • spec.usages 现在变成必需字段,其中不可以包含重复的字符串值, 并且只能包含已知的用法字符串
创建你的证书

通过运行以下命令生成私钥:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl genkey - | cfssljson -bare server
{
  "hosts": [
    "my-svc.my-namespace.svc.cluster.local",
    "my-pod.my-namespace.pod.cluster.local",
    "192.0.2.24",
    "10.0.34.2"
  ],
  "CN": "my-pod.my-namespace.pod.cluster.local",
  "key": {
    "algo": "ecdsa",
    "size": 256
  }
}
EOF
创建证书签名请求(CSR)

这里 csr signerName 不能是 kubernetes.io/legacy-unknown,演示我们随便指定一个为 example.com/serving,v1beta1 版本默认是 kubernetes.io/legacy-unknown

代码语言:shell
AI代码解释
复制
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: example
spec:
  request: $(cat server.csr | base64 | tr -d '\n')
  signerName: example.com/serving
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF
批准证书签名请求(CSR)
代码语言:shell
AI代码解释
复制
kubectl certificate approve example
代码语言:shell
AI代码解释
复制
certificatesigningrequest.certificates.k8s.io/example approved

你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME            REQUESTOR                 CONDITION
example   11s   example.com/serving   100015926370-1650441195   Approved

这里可以看到证书请求已被批准,但是没有自动签名,正在等待请求的签名者对其签名。

签名证书签名请求(CSR)

我们扮演证书签署者的角色,颁发证书并将其上传到 API 服务器。

创建证书颁发机构

通过运行以下命令创建签名证书:

代码语言:shell
AI代码解释
复制
cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
  "CN": "example.com/serving",
  "key": {
    "algo": "rsa",
    "size": 2048
  }
}
EOF

这会产生一个证书颁发机构密钥文件(ca-key.pem)和证书(ca.pem)。

颁发证书

创建文件 server-signing-config.json 内容如下:

代码语言:json
AI代码解释
复制
{
  "signing": {
    "default": {
      "usages": [
        "digital signature",
        "key encipherment",
        "server auth"
      ],
      "expiry": "876000h",
      "ca_constraint": {
        "is_ca": false
      }
    }
  }
}

使用 server-signing-config.json 签名配置、证书颁发机构密钥文件和证书来签署证书请求:

代码语言:shell
AI代码解释
复制
kubectl get csr example -o jsonpath='{.spec.request}' | \
  base64 --decode | \
  cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
  cfssljson -bare ca-signed-server

这会生成一个签名的服务证书文件,ca-signed-server.pem

上传签名证书
代码语言:shell
AI代码解释
复制
kubectl get csr example -o json | \
  jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
  kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/example/status -f -

批准 CSR 并上传签名证书后,你现在应该能看到如下输出:

代码语言:shell
AI代码解释
复制
kubectl get csr
代码语言:shell
AI代码解释
复制
NAME      AGE   SIGNERNAME            REQUESTOR                 CONDITION
example   10m   example.com/serving   100015926370-1650441195   Approved,Issued

这是你可以正常下载证书并使用它了。

参考文档

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解计算机系统(3.1)------汇编语言和机器语言
IT可乐
2018/01/04
2K0
深入理解计算机系统(3.1)------汇编语言和机器语言
肝了一上午的Golang之Plan9入门
机器语言一堆的0/1代码确实反人类,汇编语言指令繁杂 不同机器设备还有较大差异。比如x86架构的汇编指令一般有两种格式:
用户3904122
2022/06/29
9400
肝了一上午的Golang之Plan9入门
计算机基础(5)——编程语言与跨平台
程序设计语言是人们为了描述解题步骤(即编程序)而设计的一种具有语法语义描述的记号。计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。
绿水长流z
2025/01/03
1040
计算机基础(5)——编程语言与跨平台
汇编语言的不同
汇编语言是一种低级编程语言,与计算机硬件直接相关。相比其他高级编程语言,如Java、Python或C++,汇编语言在语法、规则和表达方式上有着显著的不同。下面我们将探讨汇编语言与其他语言的不同以及汇编语言的作用,并给出一些汇编语言的示例。
为了伟大的房产事业
2024/03/15
1450
as - 汇编语言编译器
as是一款常用的汇编语言编译器,在软件开发和系统编程等领域应用广泛,以下是关于它的详细介绍:
是山河呀
2025/02/02
660
【汇编语言】转移指令的原理(一) —— 新手必看:3步掌握汇编语言中的跳转
可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制 CPU 执行内存中某处代码的指令。
Crossoads
2024/11/21
2970
5.1 汇编语言:汇编语言概述
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。
微软技术分享
2023/08/22
4290
汇编语言 手记9
使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件 用连接程序(LINK.EXE)对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。 可执行文件中包含两部分
用户1154259
2018/01/18
7370
汇编语言 手记9
为什么C / C++编译要要先完成汇编?
在学习或使用 C/C++ 编程语言时,我们会注意到编译过程通常分为多个阶段,其中一个重要阶段是将代码转换为汇编语言。为什么 C/C++ 的编译需要先完成汇编?本文将从历史、技术和实践三个方面进行探讨。
DevKevin
2024/12/31
950
Go语言调度器之调度main goroutine(14)
上一节我们通过分析main goroutine的创建详细讨论了goroutine的创建及初始化流程,这一节我们接着来分析调度器如何把main goroutine调度到CPU上去运行。本节需要重点关注的问题有:
阿波张
2019/06/24
8240
Go语言调度器之调度main goroutine(14)
Go: 与汇编的结合, 系统与驱动开发的完美搭档
Go语言,以其简单和高效的特性广受欢迎。然而,随着系统和驱动程序开发需求的增加,纯Go语言的性能和底层控制能力可能无法完全满足高性能计算的要求。这时,汇编语言的高效和底层硬件控制特性,恰好弥补了这一不足。本文将详细探讨如何将Go语言与汇编结合用于系统和驱动程序开发,及其在多种CPU架构下的支持情况。
运维开发王义杰
2024/05/10
1390
Go: 与汇编的结合, 系统与驱动开发的完美搭档
【汇编语言】[BX]和loop指令(四)—— 汇编语言中的段前缀与内存保护:原理与应用解析
指令“mov ax,[bx]”中,内存单元的偏移地址由bx给出,而段地址默认在 ds中。我们可以在访问内存单元的指令中显式地给出内存单元的段地址所在的段寄存器。比如:
Crossoads
2024/11/13
960
【汇编语言】[BX]和loop指令(四)—— 汇编语言中的段前缀与内存保护:原理与应用解析
【汇编语言】--- 正式学习汇编语言前所需要的一些基础知识
在讲汇编语言之前,先来说一说机器语言,机器语言使机器指令的集合。对于电子计算机来说,它的机器指令是一列二进制数字。然后计算机将其转为一列高低电平,来使得其中的电子器件受到驱动。
Crossoads
2024/10/22
2930
【汇编语言】--- 正式学习汇编语言前所需要的一些基础知识
汇编语言(1)- 计算机基础[通俗易懂]
机器语言是机器指令的集合,机器指令就是一台机器可以正确执行的命令。电子计算机的机器指令就是一列二进制数据,计算机将其转换为一列高低电平,使计算机的电子器件受到驱动,进行运算。
全栈程序员站长
2022/09/27
1.5K0
汇编语言(1)- 计算机基础[通俗易懂]
1.汇编语言零基础入门学习笔记(1)
例: 机器语言 01010000 (指令 PUSH AX) 其中 AX 表示堆栈,而在CPU中工作原理则是电平脉冲的形式;
全栈工程师修炼指南
2022/09/28
6870
1.汇编语言零基础入门学习笔记(1)
go语言调度器源代码情景分析之六:go汇编语言
go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也需要经过汇编器转换成机器指令才能被CPU执行。需要注意的是,用go汇编语言编写的代码一旦经过汇编器转换成机器指令之后,再用调试工具反汇编出来的代码已经不是go语言汇编代码了,而是跟平台相关的汇编代码。
阿波张
2019/06/24
1.4K0
go语言调度器源代码情景分析之六:go汇编语言
学习 Go 的 Plan 9 汇编
seth-shi
2023/12/18
2920
汇编语言之GNU ARM
GNU最开始其实是一个操作系统,旨为打造一个开源免费自由的操作系统,目前操作系统还在完善中
乱码三千
2021/08/24
2.2K0
Golang 汇编入门知识总结
作者:ivansli,腾讯 IEG 运营开发工程师 在深入学习 Golang 的 runtime 和标准库实现的时候发现,如果对 Golang 汇编没有一定了解的话,很难深入了解其底层实现机制。在这里整理总结了一份基础的 Golang 汇编入门知识,通过学习之后能够对其底层实现有一定的认识。 0. 为什么写本文 平时业务中一直使用 PHP 编写代码,但是一直对 Golang 比较感兴趣,闲暇、周末之余会看一些 Go 底层源码。 近日在分析 go 的某些特性底层功能实现时发现:有些又跟 runtime
腾讯技术工程官方号
2020/09/07
2.6K0
走进Golang之运行与Plan9汇编
通过上一篇走进Golang之汇编原理,我们知道了目标代码的生成经历了那些过程。今天我们一起来学习一下生成的目标代码如何在计算机上执行。以及通过查阅 Golang 的 Plan9 汇编来了解Golang的一些内部秘密。
大愚
2019/12/04
1.1K0
推荐阅读
相关推荐
深入理解计算机系统(3.1)------汇编语言和机器语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文