当咱们须要进行服务端认证,甚至双向认证时,咱们须要生成密钥对和服务信息,并使用ca对公钥和服务信息进行批准签发,生成一个证书。node
咱们简单描述下单向认证和双向认证的场景流程git
在单向认证场景中:web
在双向认证的场景中:算法
那么,咱们若是要开放本身的https服务,或者给kubelet建立可用的客户端证书,就须要:json
这里使用方能够是客户端(kubelet)或服务端(好比一个咱们本身开发的webhook server)api
k8s集群部署时会自动生成一个CA(证书认证机构),固然这个CA是咱们自动生成的,并不具备任何合法性。k8s还提供了一套api,用于对用户自主建立的证书进行认证签发。服务器
执行下面的命令,生成server.csr和server-key.pem。app
cat <<EOF | cfssl genkey - | cfssljson -bare server { "hosts": [ "my-svc.my-namespace.svc.cluster.local", "my-pod.my-namespace.pod.cluster.local", "192.0.2.24", "10.0.34.2" ], "CN": "kubernetes", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF
这里你能够修改文件里的内容,主要是:工具
CN
的内容视为正式使用者的User Name
ecdsa
算法和rsa
算法,rsa
算法的size通常是2048或1024O
视为证书使用者所在的Group
这一步生成的server-key.pem是服务端的私钥,而server.csr则含有公钥、组织信息、我的信息(域名)。jsonp
执行以下脚本:
cat <<EOF | kubectl apply -f - apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: my-svc.my-namespace spec: request: $(cat server.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - server auth EOF
在k8s集群中建立一个csr资源。注意要将第一步中建立的server.csr内容进行base64编码,去掉换行后填入spec.request
中。spec.usages
中填入咱们对证书的要求,包括数字签名、密钥加密、服务器验证。通常填这三个就够了。
以后咱们经过kubectl describe csr my-svc.my-namespace
能够看到:
Name: my-svc.my-namespace Labels: <none> Annotations: <none> CreationTimestamp: Tue, 21 Mar 2017 07:03:51 -0700 Requesting User: yourname@example.com Status: Pending Subject: Common Name: my-svc.my-namespace.svc.cluster.local Serial Number: Subject Alternative Names: DNS Names: my-svc.my-namespace.svc.cluster.local IP Addresses: 192.0.2.24 10.0.34.2 Events: <none>
注意到,csr的status是pending,说明尚未被CA认证。在k8s集群中,若是是node上kubelet建立的CSR,kube-controller-manager会自动进行认证,而咱们手动建立的证书,须要进行手动认证:kubectl certificate approve
也能够拒绝:kubectl certificate deny
以后咱们再检查csr,发现已是approved了:
kubectl get csr NAME AGE REQUESTOR CONDITION my-svc.my-namespace 10m yourname@example.com Approved,Issued
咱们能够经过
kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' | base64 --decode > server.crt
命令,获得server的证书。以后你就可使用server.crt和server-key.pem做为你的服务的https认证