使用kubernetes证书保护工作负载
由于稳定版的CertificateSigningRequest
API(certificates.k8s.io/v1
)不允许将.spec.signerName
设置为kubernetes.io/legacy-unknown
,
为了使用kubernetes证书保护工作负载,
参考kube-controller-manager中的certificate controller
实现一个自定义证书签署者。
cms.io/app-serving
:
该服务证书被API服务器视为有效的服务端证书,
但没有其他保证。certificate-controller
不会自动批准该证书
- 信任分发: 没有。这个签名者在 Kubernetes 集群中没有标准的信任或分发
- 许可的主体: 全部
- 允许的x509扩展: 允许subjectAltName和key usage扩展,并弃用其他扩展
- 允许的密钥用法:
必须包含
["server auth"]
,但不能包含["digital signature", "key encipherment", "server auth"]
之外的键 - 过期时间/证书有效期: 1年(默认值和最大值)
- 允许/不允许CA位: 不允许
使用singerName[cms.io/app-serving
]签发证书
- 创建私有
1
2openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=apiserver-proxy" - 创建CertificateSigningRequest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: apiserver-proxy
labels:
k8s-app: apiserver-proxy
spec:
groups:
- system:authenticated
request: $(cat server.csr | base64 -w 0 | tr -d "\n")
signerName: cms.io/app-serving
expirationSeconds: 86400 # one day, default is one year
usages:
- server auth
- digital signature
- key encipherment
EOF - 批准CertificateSigningRequest
1
kubectl certificate approve apiserver-proxy
- 取得证书
1
kubectl get csr apiserver-proxy -o jsonpath='{.status.certificate}'| base64 -d > server.crt