1036 字
5 分钟
Golang 证书工具使用简介 - cfssl
cfssl配置分类
- client certificate(客户端证书): 用于通过服务器对客户端进行身份验证。例如etcdctl,etcd代理或Docker客户端。
- server certificate(服务端证书): 由服务器使用,并由客户端验证服务器身份。例如docker服务器或kube-apiserver。
- peer certificate(对等证书): etcd集群成员以两种方式相互通信时使用对等证书。
安装
> go get github.com/cloudflare/cfssl/cmd/...如何使用
初始化CA(certificate authority)
mkdir ~/cfsslcd ~/cfsslcfssl print-defaults config > ca-config.jsoncfssl print-defaults csr > ca-csr.json配置CA选项
现在,我们可以在ca-config.json配置文件中配置签名选项。默认选项包含以下预配置字段:
profiles:www具有server auth(服务器身份验证)(TLS Web服务器身份验证)X509 V3扩展名的www和具有客户机身份验证(TLS Web客户端身份验证)X509 V3扩展名的客户端- expiry: 具有默认值8760h(或365天)
为了达到合规性,让我们将www的profiles重命名为server,使用server auth(服务器身份验证)和client auth(客户端身份验证)扩展名创建peer其他对等配置文件,并将有效期设置为43800h(5年):
{ "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" ] } } }}您还可以修改ca-csr.json证书签名请求(CSR
{ "CN": "My own CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "O": "My Company Name", "ST": "San Francisco", "OU": "Org Unit 1", "OU": "Org Unit 2" } ]}使用以上参数生成CA:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca你将获取以下文件:
ca-key.pemca.csrca.pem- 请妥善保管ca-key.pem文件。使用此密钥可以在您的CA中创建任何种类的证书。
* .csr文件未在我们的示例中使用。
生成服务器证书
cfssl print-defaults csr > server.json服务器证书最重要的值是Common Name(公用名: CN)和Hosts(主机)。我们必须替换它们,例如:
"CN": "coreos1", "hosts": [ "192.168.122.68", "ext.example.com", "coreos1.local", "coreos1" ],现在我们准备生成server certificate(服务器证书)和private key(私钥):
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server您将获得以下文件:
server-key.pemserver.csrserver.pem生成对等证书
cfssl print-defaults csr > member1.json替换CN和hosts的值, 如:
"CN": "member1", "hosts": [ "192.168.122.101", "ext.example.com", "member1.local", "member1" ],现在我们准备生成member1证书和私钥:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer member1.json | cfssljson -bare member1你可以得到以下文件:
member1-key.pemmember1.csrmember1.pem对每个etcd成员主机名重复这些步骤。
生成客户端证书
cfssl print-defaults csr > client.json对于客户端证书,我们可以忽略主机值,而仅将通用名称(CN)设置为客户端值:
... "CN": "client", "hosts": [""],...生成客户端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client您将得到以下文件:
client-key.pemclient.csrclient.pemTLDR(Too Long; Didn’t Read)总结
- 下载cfssl二进制文件
sudo curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64sudo curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64sudo chmod +x /usr/local/bin/cfssl*- 创建存储证书的文件夹
mkdir ~/cfsslcd ~/cfssl- 生成CA和证书
echo '{"CN":"CA","key":{"algo":"rsa","size":2048}}' | cfssl gencert -initca - | cfssljson -bare ca -echo '{"signing":{"default":{"expiry":"43800h","usages":["signing","key encipherment","server auth","client auth"]}}}' > ca-config.jsonexport ADDRESS=192.168.122.68,ext1.example.com,coreos1.local,coreos1export NAME=serverecho '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAMEexport ADDRESS=export NAME=clientecho '{"CN":"'$NAME'","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -config=ca-config.json -ca=ca.pem -ca-key=ca-key.pem -hostname="$ADDRESS" - | cfssljson -bare $NAME- 验证数据
openssl x509 -in ca.pem -text -nooutopenssl x509 -in server.pem -text -nooutopenssl x509 -in client.pem -text -noout注意点
- 不要将
ca-key.pem放入容器Linux配置(Container Linux Config)中,建议将其存储在安全的地方。此密钥允许生成尽可能多的证书。 - 确保密钥文件安全。不要忘记设置适当的文件权限,即
chmod 0600 server-key.pem。 - 此TLDR示例中的证书具有服务器身份验证和客户端身份验证X509 V3扩展,您可以将它们与服务器和客户端的身份验证一起使用。
- 您也可以自由为通配符
*地址生成密钥和证书。他们可以在任何机器上工作。这将简化证书常规,但会增加安全风险。
更多信息
有关其他示例,请查看以下文档:
Golang 证书工具使用简介 - cfssl
https://ihsiao.com/posts/golang/cfssl/