使用 OpenSSL 吊销 Kubernetes(k8s)的 kubeconfig 里的用户证书
一.用 OpenSSL 依据已有的自签名 CA 注销签发的证书的步骤
1. 准备工作 你得有自签名 CA 的私钥(通常是 .key 文件)、CA 证书(通常是 .crt 文件)以及证书吊销列表(CRL)文件。若还没有 CRL 文件,就需要创建一个。
2. 创建初始 CRL 文件
要是还没有 CRL 文件,就用以下命令创建一个:
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
ca.key
:这是自签名 CA 的私钥文件。ca.crt
:这是自签名 CA 的证书文件。crl.pem
:这是生成的证书吊销列表文件
3.吊销证书
你要吊销某个证书时,得知道该证书的序列号。可以用以下命令查看证书序列号:
openssl x509 -noout -serial -in certificate.crtopenssl ca -revoke certificate.crt -keyfile ca.key -cert ca.crt
certificate.crt
:你要吊销的证书文件。ca.key
:自签名 CA 的私钥文件。ca.crt
:自签名 CA 的证书文件。
4.更新 CRL 文件
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
ca.key
:自签名 CA 的私钥文件。ca.crt
:自签名 CA 的证书文件。crl.pem
:更新后的证书吊销列表文件。
二.要使用 OpenSSL 吊销 Kubernetes(k8s)的 kubeconfig 里的用户证书
1. 确定相关文件和信息
CA 私钥:一般存储在 Kubernetes 集群的控制平面节点上,通常路径为 /etc/kubernetes/pki/ca.key。 • CA 证书:同样位于控制平面节点,路径通常是 /etc/kubernetes/pki/ca.crt。 • 用户证书:能从 kubeconfig 文件里提取。kubeconfig 文件一般在 ~/.kube/config,你可以用下面的命令提取用户证书:
kubectl config view --raw -o jsonpath='{.users[?(@.name=="<USER_NAME>")].user.client-certificate-data}' | base64 -d > user.crt
这里的 <USER_NAME>
要替换成 kubeconfig 里实际的用户名.
2. 查看证书序列号
使用 OpenSSL 查看要吊销的用户证书的序列号:
openssl x509 -noout -serial -in user.crt
此命令会输出证书的序列号,后续吊销证书时会用到。
3. 检查并创建 CRL 文件
如果还没有证书吊销列表(CRL)文件,就需要创建一个。若已有,可跳过此步骤。
openssl ca -gencrl -keyfile /etc/kubernetes/pki/ca.key -cert /etc/kubernetes/pki/ca.crt -out crl.pem
这里的 crl.pem
就是生成的 CRL 文件。
4. 吊销证书
利用 OpenSSL 的 ca
命令吊销用户证书:
openssl ca -revoke user.crt -keyfile /etc/kubernetes/pki/ca.key -cert /etc/kubernetes/pki/ca.crt
运行此命令后,用户证书就会被标记为已吊销.
5. 更新 CRL 文件
吊销证书后,需要更新 CRL 文件以包含新吊销的证书:
openssl ca -gencrl -keyfile /etc/kubernetes/pki/ca.key -cert /etc/kubernetes/pki/ca.crt -out crl.pem
6.查看 CRL 的基本信息
openssl crl -noout -text -in crl.pem
openssl crl:这是 OpenSSL 用于处理 CRL 的命令。
• -noout:表示不输出 CRL 的二进制内容。 • -text:将 CRL 的内容以文本形式输出。 • -in crl.pem:指定要查看的 CRL 文件,这里假设 CRL 文件名为 crl.pem,你可根据实际情况替换
查看 CRL 的详细吊销条目
openssl crl -noout -revoked -in crl.pem
-revoked
:此选项用于只输出 CRL 中的吊销条目信息
8. 在 Kubernetes 中使用 CRL
要让 Kubernetes 集群使用更新后的 CRL 来验证客户端证书,需要在 API Server 的配置里添加 CRL 文件的路径。
修改 API Server 配置
编辑 API Server 的静态 Pod 配置文件,通常位于 /etc/kubernetes/manifests/kube-apiserver.yaml
。在 spec.containers[].command
部分添加以下参数:
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --crl-file=/path/to/crl.pem
重启 API Server
保存配置文件后,Kubernetes 会自动重启 API Server 以应用新配置。
9.重新生成新的 CRL 且不包含已吊销证书
要保证 OpenSSL 配置文件(通常是 /etc/pki/tls/openssl.cnf
)的 dir
参数指向 CA 工作目录
手动修改索引文件
OpenSSL 借助 index.txt
文件来记录证书状态。你可以手动编辑该文件,把要恢复的证书状态从 R
(已吊销)改成 V
(有效)。
vim /etc/pki/CA/index.txt
找到要恢复的证书条目,将开头的 R
改成 V
,并删除与吊销相关的时间等信息。
重新生成 CRL
openssl ca -gencrl -keyfile ca.key -cert ca.crt -out new_crl.pem
ca.key
是 CA 私钥文件。ca.crt
是 CA 证书文件。new_crl.pem
是新生成的 CRL 文件。
替换旧的 CRL 把新生成的 CRL 文件替换掉旧的 CRL 文件,这样在验证证书时就不会再把这些证书当作已吊销。
10. 废弃当前 CRL 并使用新的 CRL 管理
备份当前的 index.txt
文件,然后清空该文件:
sudo cp /etc/pki/CA/index.txt /etc/pki/CA/index.txt.bak
sudo truncate -s 0 /etc/pki/CA/index.txt
重置序列号和 CRL 编号
重置 serial
和 crlnumber
文件
echo "01" | sudo tee /etc/pki/CA/serial
echo "01" | sudo tee /etc/pki/CA/crlnumber
生成新的 CRL
将新生成的 CRL 文件应用到证书验证环境中
7. 在吊销证书的过程中出现的问题
问题1:Using configuration from /etc/pki/tls/
openssl.cnf /etc/pki/CA/index.txt: No such file or directory
问题2:Using configuration from /etc/pki/tls/
openssl.cnf /etc/pki/CA/crlnumber: No such file or directory error while loading CRL number
解决方式
1)创建 CA 目录
首先,确保 CA 工作目录存在,通常是 /etc/pki/CA
:
mkdir -p /etc/pki/CA
2)创建索引文件
创建 index.txt
文件,该文件用于记录证书的状态信息,初始为空:
touch /etc/pki/CA/index.txt
3) 创建 crlnumber
文件
echo "01" | sudo tee /etc/pki/CA/crlnumber
4)创建序列号文件
创建 serial
文件,并为其设置一个初始的序列号,例如 01
echo "01" | sudo tee /etc/pki/CA/serial
5) 确认文件权限
要保证 OpenSSL 命令有足够的权限来访问和修改 /etc/pki/CA
目录下的文件,你可以通过以下命令修改文件和目录的权限:
sudo chmod -R 700 /etc/pki/CA
5)调整 OpenSSL 配置文件,可以不变
确保 /etc/pki/tls/openssl.cnf
配置文件中的相关设置无误,尤其是 dir
参数,它应指向 CA 工作目录。你可以通过以下命令编辑该文件。
在文件中找到 [ CA_default ]
部分,确认 dir
参数如下:
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept