使用cfssl生成自签证书
安装ssl
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 chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64 mv cfssl_linux-amd64 /usr/bin/cfssl mv cfssljson_linux-amd64 /usr/bin/cfssljson mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo cfssl version
证书类型
client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
peer certificate: 双向证书,用于etcd集群成员间通信
初始化json文件
生成json模板文件
cfssl print-defaults config > ca-config.json cfssl print-defaults csr > ca-csr.json
自签CA
编辑 ca-config.json
profiles:指定了不同角色的配置信息
服务端使用server auth(TLS Web Server Authentication X509 V3 extension),客户端使用client auth(TLS Web Server Authentication X509 V3 extension)
expiry:指定了证书的过期时间为87600小时(即10年)
{ "signing": { "default": { "expiry": "87600h" }, "profiles": { "client": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "client auth" ] }, "server": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth" ] }, "peer": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
自定义ca-csr.json
CN即common name,hosts可以指定多个(泛)域名以及多个IP地址
key:指定了加密算法,一般使用rsa(size:2048)
{ "CN": "example.net", "hosts": [ "example.net", "www.example.net", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] }
生成CA证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
生成ca.pem、ca.csr、ca-key.pem(CA私钥,需妥善保管)
生成服务器和客户端证书
同样,首先生成默认配置文件:
cfssl print-defaults csr > server.json
修改如下部分:
"CN": "test.coreos.com", "hosts": [ "server.coreos.org", "*.coreos.org" ],
cfssl支持SAN(Subject Alternative Name),它是X.509中定义的一个扩展,使用了SAN字段的SSL证书,可以扩展此证书支持的域名,即一个证书可以支持多个不同域名的解析。
然后使用刚才生成的CA来给服务器签署证书,运行如下命令来生成服务端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=server json/server.json | cfssljson -bare server
-profile指定了使用ca-config.json中的profile
最后的server给定了生成的文件名,将得到如下三个文件:server.csr、server-key.pem和server.pem
类似的,可以生成客户端证书,配置文件的hosts字段指定为空即可
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=client json/client.json | cfssljson -bare client
参考:https://blog.****.net/sujosu/article/details/101520260