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 ~/cfssl
cd ~/cfssl
cfssl print-defaults config > ca-config.json
cfssl 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.pem
ca.csr
ca.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.pem
server.csr
server.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.pem
member1.csr
member1.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.pem
client.csr
client.pem
TLDR(Too Long; Didn’t Read)总结
- 下载cfssl二进制文件
sudo curl -s -L -o /usr/local/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
sudo curl -s -L -o /usr/local/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
sudo chmod +x /usr/local/bin/cfssl*
- 创建存储证书的文件夹
mkdir ~/cfssl
cd ~/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.json
export ADDRESS=192.168.122.68,ext1.example.com,coreos1.local,coreos1
export NAME=server
echo '{"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
export ADDRESS=
export NAME=client
echo '{"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 -noout
openssl x509 -in server.pem -text -noout
openssl x509 -in client.pem -text -noout
注意点
- 不要将
ca-key.pem
放入容器Linux配置(Container Linux Config)中,建议将其存储在安全的地方。此密钥允许生成尽可能多的证书。 - 确保密钥文件安全。不要忘记设置适当的文件权限,即
chmod 0600 server-key.pem
。 - 此TLDR示例中的证书具有服务器身份验证和客户端身份验证X509 V3扩展,您可以将它们与服务器和客户端的身份验证一起使用。
- 您也可以自由为通配符
*
地址生成密钥和证书。他们可以在任何机器上工作。这将简化证书常规,但会增加安全风险。
更多信息
有关其他示例,请查看以下文档:
Golang 证书工具使用简介 - cfssl
https://fuwari.vercel.app/posts/golang/cfssl/