证书签名工具 CFSSL

31次阅读

共计 5440 个字符,预计需要花费 14 分钟才能阅读完成。

资源

https://blog.cloudflare.com/i… 官方博客
特性
概念
安装

下载安装
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

sudo cp cfssl_linux-amd64 /usr/local/bin/cfssl
sudo cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
sudo cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

cd /usr/local/bin/

chmod +x cfssl
chmod +x cfssljson
chmod +x cfssl-certinfo

初始化
mkdir ~/cfssl
cd ~/cfssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

创建自己的内部服务使用的 CA 认证中心

运行认证中心需要一个 CA 证书和相应的私钥。后者是极其敏感的数据。任何知道私钥的人都可以充当 CA 颁发证书。因此,私钥的保护至关重要
#配置 CA 的证书生成策略
cat << EOF > ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“server”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”
]
},
“client”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“client auth”
]
},
“peer”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
EOF
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth:服务端证书;表示 client 可以用该 CA 对 server 提供的证书进行验证;server 由服务器使用,并由客户端验证服务器身份
client auth:客户端证书;表示 server 可以用该 CA 对 client 提供的证书进行验证;client 用于通过服务器验证客户端。
peer 对等证书;就是 server auth、client auth 都有的。成员之间共用,供它们彼此之间通信使用

# 生成 CA 的证书和私钥
cat << EOF > ca-csr.json
{
“CN”: “dudu_ca”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “dudu_ca”,
“OU”: “dudu_ca”
}
]
}
EOF
#生成运行 CA 所必需的文件 ca-key.pem(私钥)和 ca.pem(证书),还会生成 ca.csr(证书签名请求),用于交叉签名或重新签名。
#请保持 ca-key.pem 文件的安全。此密钥允许在 CA 中创建任何类型的证书。*.csr 文件在整个过程中不会使用

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 生成如下文件
ca.csr ca-key.pem ca.pem

生成 kubernetes 的证书。
证书最重要的价值是通用名称(CN)和主机(hosts)

最重要的部分是 CN,这应该是您的主机名和 hosts 阵列,它必须包含所有的:您的本地主机名、127.0.0.1、服务器的私有 IP 地址(不是其面向公众的 IP)
#kubernetes 服务的生成策略
cat << EOF > kubernetes-csr.json
{
“CN”: “kubernetes”,
“hosts”: [
“127.0.0.1”,
“10.29.167.233”,
“169.169.0.1”,
“kubernetes”,
“kubernetes.default”,
“kubernetes.default.svc”,
“kubernetes.default.svc.cluster”,
“kubernetes.default.svc.cluster.local”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
#“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
#”CN”: 字段 kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法
#如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群和 kubernetes master 集群使用,所以上面分别指定了 etcd 集群、kubernetes master 集群的主机 IP 和 kubernetes 服务的服务 IP(一般是 kue-apiserver 指定的 service-cluster-ip-range 网段的第一个 IP,如 10.254.0.1。

# 对等证书 生成 kubernetes 的证书和私钥。使用 CA 认证中心的私钥和证书签名生成机构的证书和私钥。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes

# 子节点客户端证书
cat << EOF > kubernetes-proxy-csr.json
{
“CN”: “kube-proxy”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-proxy-csr.json | cfssljson -bare proxy

# master 主节点 api 服务管理客户端证书
cat << EOF > kubernetes-apiserver-client-csr.json
{
“CN”: “controllermanager”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-apiserver-client-csr.json | cfssljson -bare apiserver

# 生成如下文件
kubernetes.csr kubernetes-key.pem kubernetes.pem

# 服务端证书 -profile=server
cfssl print-defaults csr > server-csr.json
“CN”: “coreos1”,
“hosts”: [
“192.168.122.68”,
“ext.example.com”,
“coreos1.local”,
“coreos1”
],
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

# 客户端证书 -profile=client 客户端证书可以忽略 hosts,只设定 CN 通用名
cfssl print-defaults csr > client-csr.json
修改
“CN”: “client”,
“hosts”: [“”],
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client

验证证书
openssl x509 -in ca.pem -text -noout
openssl x509 -in server.pem -text -noout
openssl x509 -in client.pem -text -noout

cfssl-certinfo -cert kubernetes.pem

导入证书到系统,更新系统证书库
update-ca-trust check #检查是否启用
update-ca-trust enable #启用系统共享 CA 存储
cp foo.crt /etc/pki/ca-trust/source/anchors/ #将证书复制到此目录 具有高优先级,不会被覆盖
update-ca-trust extract #最后提取更新

cat foo.crt > /etc/pki/tls/certs/ca-bundle.crt #老版本的处理方式

注意事项
设置所有私钥文件权限 chmod 600 *-key.pem
不要把你的 ca-key.pem 放入容器的 Linux 配置,建议将其存放在安全的地方。该密钥允许生成尽可能多的证书
使用通配符 * 地址生成的密钥和证书。将在任何机器上工作。它将简化证书例程,但会增加安全风险。

常用操作命令
配置
功能
功能 1
功能 2
调试
优化
常见问题
实际应用
cat << EOF > kubernetes-csr.json
{
“CN”: “kubernetes”,
“hosts”: [
“127.0.0.1”,
“10.29.167.233”,
“169.169.0.1”,
“kubernetes”,
“kubernetes.default”,
“kubernetes.default.svc”,
“kubernetes.default.svc.cluster”,
“kubernetes.default.svc.cluster.local”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes

cat << EOF > kubernetes-client-csr.json
{
“CN”: “controllermanager”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-client-csr.json | cfssljson -bare apiserver

cat << EOF > kube-proxy-csr.json
{
“CN”: “kube-proxy”,
“hosts”: [],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “k8s”,
“OU”: “System”
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssljson -bare proxy

证书转为浏览器可用的 p12 证书
openssl pkcs12 -export -in apiserver.pem -out apiserver.p12 -inkey apiserver-key.pem

正文完
 0