k8s webhook生成ssl证书

当我们使用k8swebhook机制时,webhook服务必须是https服务。如果不是https服务 ,则会报如下错误。
http: server gave HTTP response to HTTPS client

记录下证书生成的步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config san.cnf

###
openssl req 命令用于为服务器生成一个新的证书签名请求 (CSR)。该命令中指定的选项如下:

-new:该选项指定要生成一个新的 CSR。
-newkey rsa:2048:该选项指定要生成一个新的 RSA 密钥对,密钥长度为 2048 位。
-nodes:该选项指定私钥不应该使用密码加密。
-keyout server.key:该选项指定私钥应该写入的文件名。
-out server.csr:该选项指定 CSR 应该写入的文件名。
-config san.cnf:该选项指定生成 CSR 时要使用的配置文件。在本例中,配置文件是 san.cnf,其中包含有关证书主体的信息和应包含在证书中的任何主题备用名称 (SANs)。


# ca.crt, ca.key 为k8s集群中的文件, 在/etc/kubenetes/pki目录下
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile san.cnf


###
openssl x509 命令用于将证书签名请求 (CSR) 签名为一个 SSL/TLS 证书。该命令中指定的选项如下:

-req:该选项指定输入文件是一个证书请求。
-days 365:该选项指定证书的有效期限,以天为单位。在本例中,证书的有效期限为 365 天。
-in server.csr:该选项指定输入文件是一个证书请求,该请求应该签名为一个 SSL/TLS 证书。在本例中,输入文件是 server.csr。
-CA ca.crt:该选项指定用于签名证书的 CA 证书。在本例中,CA 证书是 ca.crt。
-CAkey ca.key:该选项指定用于签名证书的 CA 私钥。在本例中,CA 私钥是 ca.key。
-CAcreateserial:该选项指定在签名证书时创建一个新的序列号文件。在本例中,序列号文件将被创建并用于签名证书。
-out server.crt:该选项指定输出文件是签名后的 SSL/TLS 证书。在本例中,输出文件是 server.crt。
-extensions v3_req:该选项指定证书应包含的证书扩展。在本例中,证书扩展是 v3_req。
-extfile san.cnf:该选项指定证书扩展应该包含的信息。在本例中,证书扩展信息包含在 san.cnf 文件中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# san.cnf
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]
countryName = US
stateOrProvinceName = California
localityName = San Francisco
organizationName = Example Corp
organizationalUnitName = IT Department
commonName = example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 192.0.2.1

san.cnf 文件是一个 OpenSSL 配置文件,用于指定要在 SSL/TLS 证书中包含的主题备用名称 (SANs)。
在上面的示例中,[req] 段指定了一些请求相关的选项,例如不提示用户输入信息 (prompt = no)。[req_distinguished_name] 段指定了证书请求的主题信息,例如国家、州、城市和组织名。[v3_req] 段指定了证书扩展信息,其中 subjectAltName 指定了一个名为 alt_names 的部分,该部分列出了所有的 SANs。在 [alt_names] 段中,DNS.1 指定了一个 DNS 名称 example.com,IP.1 指定了一个 IP 地址 192.168.1.1。

在实际使用中,可以根据需要添加、修改或删除 san.cnf 文件中的 SANs,以便生成适合特定环境的证书请求。

1
2
3
4
5
// 证书生成
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=hysyeah CA/O=hysyeah/C=CN"
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -config san.cnf
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extensions v3_req -extfile san.cnf