一、k8s集群中的证书
在k8s集群中各个组件之间通信时为了安全起见都是需要安全认证的(通过公、私钥)
1、证书
- 信任的证书颁发机构:CA机构(私钥+公钥)
- Client Certificate:用于服务端认证客户端,例如:ETCD、ETCD Proxy、Fleetctl、docker客户端
- Server Certificate:服务端使用,客户端以此验证服务端身份,例如docker服务端
- Peer Certificate: 双向证书,用于ETCD集群成员间通信
2、在kubernetes集群中需要的证书种类如下
- ETCD:节点需要标识自己服务的Server Cert,与需要Client Cert与ETCD集群其他节点交互,当然可以分别制定2个证书,也可以使用一个对等证书
- Master 节点需要标识 apiserver服务的server cert,也需要Client Cert连接ETCD集群,这里也使用一个对等证书
- kubectl、calico、kube-Proxy 只需要 client cert,因此证书请求中 hosts 字段可以为空
- kubelet 证书比较特殊,不是手动生成,它由node节点 TLS BootStrap向apiserver请求,由master节点的controller-manager 自动签收,包含一个 client cert 和一个 server cert
3、CFSSL
- CFSSL是CloudFlare开源的一款PKI/TLS工具。CFSSL包含一个命令行工具和一个用于签名,验证并且捆绑TLS证书的 HTTP API 服务
二、安装证书工具CFSSL
1、去官网下载cfssl-certinfo_linux-amd64
cfssljson_linux-amd64
cfssl_linux-amd64
这三个组件
-
下载核心组件
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64
-
授予执行权限
chmod +x cfssl*
-
批量重命名
for name in `ls cfssl*`; do mv $name ${name%_1.5.0_linux_amd64}; done
-
移动到文件
mv cfssl* /usr/bin
三、证书生成
1、创建ca配置文件(ca-config.json)
- 相当于证书颁发机构的工作规章制度
-
ca-config.json
:可以定义多个profiles,分别制定不同的过期时间、使用场景等参数;后续在签名证书时可以使用某个 profile -
signing
:表示该证书可用于签名其它证书;生成的ca.pem证书中CA=TRUE -
server auth
:表示Client可以用该CA对server提供的证书进行验证 -
lient auth
:表示server可以用该CA对Client提供的证书进行验证
2、 ca-config.json配置文件
vi ca-config.json
{
"signing": {
"default": {
"expiry": "43800h"
},
"profiles": {
"server": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"kubernetes": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
},
"etcd": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
3、csr.json:证书申请请求书。证书机构就会根据我们请求签发证书
cfssl print-defaults
cfssl print-defaults csr #使用这个命令打印模板
{
"CN": "example.net", //浏览器验证该字段是否合法,一般写域名,非常重要.
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"ST": "CA",
"L": "San Francisco"
}
]
}
4、创建ca证书签名(ca-csr.json)
-
CN
- Common Name,从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法
-
O
- Organization,从证书中提取该字段作为请求用户所属的组(Group);这两个参数在后面的kubernetes启用RBAC模式中很重要,因为需要设置kubelet、admin等角色权限,那么在配置证书的时候就必须配置对,
- 在etcd这两个参数没太大的重要意义
-
ca-csr.json
vi ca-csr.json
{
"CN": "SelfSignedCa",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "shanghai",
"O": "cfssl",
"ST": "shanghai",
"OU": "System"
}
]
}
5、生成ca证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
# ca.csr ca.pem(ca公钥) ca-key.pem(ca私钥,妥善保管)
6、创建etcd证书签名(etcd-csr.json)
- etcd-csr.json
{
"CN": "etcd",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "shanghai",
"O": "etcd",
"ST": "shanghai",
"OU": "System"
}
]
}
7、生成etcd证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-csr.json | cfssljson -bare etcd
#etcd.csr etcd-csr.json etcd-key.pem(etcd私钥) etcd.pem(etcd公钥)
8、创建kubernetes证书签名
- kubernetes-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "shanghai",
"O": "kubernetes",
"ST": "shanghai",
"OU": "System"
}
]
}
9、生成k8s证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
# kubernetes.csr kubernetes-key.pem kubernetes.pem
10、校验证书是否合法
openssl x509 -in ca.pem -text -noout
openssl x509 -in etcd.pem -text -noout
openssl x509 -in kubernetes.pem -text -noout
网友评论