kubernetes-guide/content/trick/certs/sign-certs-with-cfssl.md

121 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 使用 cfssl 生成证书
搭建各种云原生环境的过程中,经常需要生成证书,比如最常见的 etcd本文记录使用 cfssl 快速生成证书的方法。
## 安装 cfssl
**方法1**: 去 [release](https://github.com/cloudflare/cfssl/releases) 页面下载,然后解压安装。
**方法2**: 使用 go install 安装:
```bash
go install github.com/cloudflare/cfssl/cmd/cfssl@latest
go install github.com/cloudflare/cfssl/cmd/cfssljson@latest
```
## 创建 CA 证书
由于各个组件都需要配置证书,并且依赖 CA 证书来签发证书,所以我们首先要生成好 CA 证书以及后续的签发配置文件:
``` bash
cat > ca-csr.json <<EOF
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "SiChuan",
"L": "ChengDu",
"O": "Kubernetes",
"OU": "CA"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
}
}
}
EOF
```
生成的文件中有下面三个后面会用到:
* `ca-key.pem`: CA 证书密钥
* `ca.pem`: CA 证书
* `ca-config.json`: 证书签发配置,用 CA 证书来签发其它证书时需要用
csr 文件字段解释:
* `CN`(Common Name): apiserver 从证书中提取该字段作为请求的用户名 (User Name)
* `names[].O`(Organization): apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
> 由于这里是 CA 证书,是签发其它证书的根证书,这个证书密钥不会分发出去作为 client 证书,所有组件使用的 client 证书都是由 CA 证书签发而来,所以 CA 证书的 CN 和 O 的名称并不重要,后续其它签发出来的证书的 CN 和 O 的名称才是有用的。
## 为 ETCD 签发证书
这里证书可以只创建一次,所有 etcd 实例都共用这里创建的证书:
``` bash
cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"*.karmada-system.svc",
"*.karmada-system.svc",
"*.karmada-system.svc.cluster",
"*.karmada-system.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "SiChuan",
"L": "Chengdu",
"O": "etcd",
"OU": "etcd"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
etcd-csr.json | cfssljson -bare etcd
```
> hosts 需要包含 etcd 被访问时用到的地址,可以用 IP ,域名或泛域名。
会生成下面两个重要的文件:
* `etcd-key.pem`: etcd 密钥。
* `etcd.pem`: etcd 证书。