一、k8s集群中的證書
在k8s集群中各個(gè)組件之間通信時(shí)為了安全起見都是需要安全認(rèn)證的(通過公籽懦、私鑰)
1、證書
- 信任的證書頒發(fā)機(jī)構(gòu):CA機(jī)構(gòu)(私鑰+公鑰)
- Client Certificate:用于服務(wù)端認(rèn)證客戶端氛魁,例如:ETCD暮顺、ETCD Proxy厅篓、Fleetctl、docker客戶端
- Server Certificate:服務(wù)端使用拖云,客戶端以此驗(yàn)證服務(wù)端身份贷笛,例如docker服務(wù)端
- Peer Certificate: 雙向證書应又,用于ETCD集群成員間通信
2宙项、在kubernetes集群中需要的證書種類如下
- ETCD:節(jié)點(diǎn)需要標(biāo)識自己服務(wù)的Server Cert,與需要Client Cert與ETCD集群其他節(jié)點(diǎn)交互株扛,當(dāng)然可以分別制定2個(gè)證書尤筐,也可以使用一個(gè)對等證書
- Master 節(jié)點(diǎn)需要標(biāo)識 apiserver服務(wù)的server cert,也需要Client Cert連接ETCD集群洞就,這里也使用一個(gè)對等證書
- kubectl盆繁、calico、kube-Proxy 只需要 client cert旬蟋,因此證書請求中 hosts 字段可以為空
- kubelet 證書比較特殊油昂,不是手動生成,它由node節(jié)點(diǎn) TLS BootStrap向apiserver請求倾贰,由master節(jié)點(diǎn)的controller-manager 自動簽收冕碟,包含一個(gè) client cert 和一個(gè) server cert
3、CFSSL
- CFSSL是CloudFlare開源的一款PKI/TLS工具匆浙。CFSSL包含一個(gè)命令行工具和一個(gè)用于簽名安寺,驗(yàn)證并且捆綁TLS證書的 HTTP API 服務(wù)
二、安裝證書工具CFSSL
1首尼、去官網(wǎng)下載cfssl-certinfo_linux-amd64
cfssljson_linux-amd64
cfssl_linux-amd64
這三個(gè)組件
-
下載核心組件
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
-
授予執(zhí)行權(quán)限
chmod +x cfssl*
-
批量重命名
for name in `ls cfssl*`; do mv $name ${name%_1.5.0_linux_amd64}; done
-
移動到文件
mv cfssl* /usr/bin
三挑庶、證書生成
1、創(chuàng)建ca配置文件(ca-config.json)
- 相當(dāng)于證書頒發(fā)機(jī)構(gòu)的工作規(guī)章制度
-
ca-config.json
:可以定義多個(gè)profiles软能,分別制定不同的過期時(shí)間迎捺、使用場景等參數(shù);后續(xù)在簽名證書時(shí)可以使用某個(gè) profile -
signing
:表示該證書可用于簽名其它證書查排;生成的ca.pem證書中CA=TRUE -
server auth
:表示Client可以用該CA對server提供的證書進(jìn)行驗(yàn)證 -
lient auth
:表示server可以用該CA對Client提供的證書進(jìn)行驗(yàn)證
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:證書申請請求書雹嗦。證書機(jī)構(gòu)就會根據(jù)我們請求簽發(fā)證書
cfssl print-defaults
cfssl print-defaults csr #使用這個(gè)命令打印模板
{
"CN": "example.net", //瀏覽器驗(yàn)證該字段是否合法范舀,一般寫域名,非常重要.
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"ST": "CA",
"L": "San Francisco"
}
]
}
4了罪、創(chuàng)建ca證書簽名(ca-csr.json)
-
CN
- Common Name锭环,從證書中提取該字段作為請求的用戶名(User Name);瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法
-
O
- Organization泊藕,從證書中提取該字段作為請求用戶所屬的組(Group)辅辩;這兩個(gè)參數(shù)在后面的kubernetes啟用RBAC模式中很重要,因?yàn)樾枰O(shè)置kubelet、admin等角色權(quán)限玫锋,那么在配置證書的時(shí)候就必須配置對蛾茉,
- 在etcd這兩個(gè)參數(shù)沒太大的重要意義
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撩鹿、創(chuàng)建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、創(chuàng)建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键思、校驗(yàn)證書是否合法
openssl x509 -in ca.pem -text -noout
openssl x509 -in etcd.pem -text -noout
openssl x509 -in kubernetes.pem -text -noout