使用openssl手动为k8s集群签发证书

创建ca私钥和ca证书

1、生成ca私钥:生成一个 2048 位的 ca.key 文件

openssl genrsa -out ca.key 2048

2、基于ca私钥,生成根(root)证书:在 ca.key 文件的基础上,生成 ca.crt 文件

openssl req -x509 -new -nodes -key ca.key -subj “/CN=${MASTER_IP}” -days 10000 -out ca.crt

生成应用的私钥和csr

1、生成应用私钥:生成一个 2048 位的 server.key 文件:

openssl genrsa -out server.key 2048

2、基于应用私钥,创建一个用于生成证书签名请求(CSR)的配置文件。

openssl req -new -key server.key -out server.csr -config csr.conf

保存文件(例如:csr.conf)前,记得用真实值替换掉尖括号中的值(例如:<MASTER_IP>)。 注意:MASTER_CLUSTER_IP 就像前一小节所述,它的值是 API 服务器的服务集群 IP。 下面的例子假定你的默认 DNS 域名为 cluster.local。

csr.conf example:

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = <country>
ST = <state>
L = <city>
O = <organization>
OU = <organization unit>
CN = <MASTER_IP>

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = <MASTER_IP>
IP.2 = <MASTER_CLUSTER_IP>

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

使用ca私钥和ca证书为应用的csr签发应用的证书

基于 ca.key、ca.crt 和 server.csr 等三个文件生成服务端证书:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key
-CAcreateserial -out server.crt -days 10000
-extensions v3_ext -extfile csr.conf -sha256

查看结果

查看证书签名请求:

openssl req -noout -text -in ./server.csr

查看证书:

openssl x509 -noout -text -in ./server.crt

使用

此时需要与apiserver通信的组件可以使用server.crt来验证自己的身份

各类文件格式

私钥文件通常以 .key 结尾,证书文件通常以 .crt 结尾,证书签名请求文件通常以 .csr 结尾。
不论什么后缀的文件,其实都是文本格式的文件。

证书文件的开头和结尾是这样子的:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

私钥文件的开头和结尾是这样的:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

证书签名请求文件的开头和结尾是这样的:

-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----

key,csr,crt文件的作用

key:私钥,openssl格式,通常是rsa算法

csr(Certificate Signing Request):证书请求文件,用于申请证书,含有公钥信息。在申请的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥

crt:证书文件,是签署人用自己的 key 给你签署的凭证。可以自签署

为什么生成密钥的时候只有私钥,没有公钥

RSA密钥都是一对,可这里只生成了私钥,那公钥在哪呢?
实际上公钥是根据私钥生成的,由于RSA非对称特性,私钥算出公钥很容易,公钥算出私钥就很难。

生成公钥的指令为:

openssl rsa -in ca.key -pubout -out ca.pub

生成应用的csr的时候,为什么需要使用应用的私钥

其实csr里需要的是公钥,创建证书请求时需要提供私钥,这个私钥的作用是为了提供公钥

生成ca证书的时候,为什么需要使用ca私钥

其实生成ca.crt里需要的也是公钥,创建ca证书时需要提供私钥,这个私钥的作用是为了提供公钥

签发证书的时候,为什么要同时用到ca.key和ca.crt

使用CA的证书,这用来宣示此服务器证书是谁签的;
使用CA的私钥,这用来生成摘要保证签名内容不被篡改。

创建所需条件整理

  • 1、创建证书需要:私钥(其实为了提取公钥)

  • 2、创建csr需要:私钥(其实为了提取公钥)+ csr请求配置文件

  • 3、签署csr需要:csr + ca私钥 + ca证书

流程梳理

  • 1、生成ca的私钥

  • 2、利用ca的私钥(为了提取公钥)生成ca证书,证书包含了公钥信息和ca机构信息

  • 3、生成server的私钥

  • 4、利用server的私钥(为了提取公钥)生成server的csr,csr包含了server公钥信息和server的身份信息

  • 5、使用server的csr,还有ca私钥,ca证书来生成server证书,其实签名只需要ca私钥就可以,假设ca证书是为了加入ca证书里的ca机构信息,才知道证书是谁签署的

证书自签署和认证原理

证书自签署:

我们手动生成ca私钥,然后使用ca私钥生成ca证书,证书里包含了从私钥中提取出来的公钥信息和ca机构的信息。再手动生成应用私钥,然后使用应用私钥和csr配置文件生成csr,csr里包含了应用的公钥信息和应用的身份信息。使用ca私钥和ca证书来签署csr,从而得到了server证书,里面包含了应用的公钥和身份信息,以及对应用的公钥和身份信息进行hash之后,使用ca私钥对hash的值进行签名后的一个签名值。

认证原理:

当需要验证对方身份的时候,拿到对方的证书,然后对签名值使用ca的公钥进行解密,得到加密前的内容,也就是对应用的公钥和身份信息进行hash后的hash值,此时再对证书里的应用的公钥和身份信息使用相同的hash算法,得到一个hash值,与前面那一步解密出来的hash值进行比较,如果一致,就证明身份可靠

签名和认证原理图:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐