下載安裝linux
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
初始化json
mkdir ~/cfssl cd ~/cfssl cfssl print-defaults config > ca-config.json cfssl print-defaults csr > ca-csr.json
運行認證中心須要一個CA證書和相應的私鑰。後者是極其敏感的數據。任何知道私鑰的人均可以充當CA頒發證書。所以,私鑰的保護相當重要api
#配置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
最重要的部分是CN ,這應該是您的主機名和hosts陣列,它必須包含全部的:您的本地主機名、127.0.0.一、服務器的私有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 #老版本的處理方式
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