tls即安全传输层协议,一般用于在两个通信应用程序之间提供保密性和数据完整性,由于在工作项目中系统内部需要安全认证,google一下发现了一个好用的自签证书的开源工具cfssl。cfssl是由CoreOS提供的(用GO实现,直接使用go get就可以安装),简单安全。
cfssl用来为etcd提供tls证书,因此它支持签三种类型的证书:client证书、server证书以及peer证书(即etcd集群成员之间的tls认证)。cfssl采用使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,cfssl提供了方便的命令行生成配置文件
为了便于管理,我将配置文件都放在了单独的目录,certs用来防置证书,json文件夹用来存放配置文件:
mkdir certs && cd certs
mkdir json
一、自签CA
-
如下为自签CA生成相应的配置文件和请求文件
cfssl print-defaults config > json/ca-config.jsoncfssl print-defaults csr > json/ca-csr.json
-
根据自己的需要自定义ca-config.json,修改为如下配置:
-
profiles:指定了不同角色的配置信息
服务端使用server auth(TLS Web Server Authentication X509 V3 extension),客户端使用client auth(TLS Web Server Authentication X509 V3 extension) -
expiry:指定了证书的过期时间为8760小时(即1年)
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"server": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "8760h",
"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"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
}
-
接下来,就可以根据ca-csr.json来自签CA了,通过gencert -initca来生成私钥和公钥,然后使用cfssljson命令将它们分别保存:
cfssl gencert -initca json/ca-csr.json | cfssljson -bare self-ca -
-
会得到如下三个文件:私钥self-ca-key.pem、证书请求self-ca.csr、公钥self-ca.pem
二、生成服务器和客户端证书
同样,首先生成默认配置文件:cfssl print-defaults csr > json/server.json
- 主要修改如下部分:
"CN": "test.coreos.com",
"hosts": [
"server.coreos.org",
"*.coreos.org"
],
-
cfssl支持SAN(Subject Alternative Name),它是X.509中定义的一个扩展,使用了SAN字段的SSL证书,可以扩展此证书支持的域名,即一个证书可以支持多个不同域名的解析。
-
然后使用刚才生成的CA来给服务器签署证书,运行如下命令来生成服务端证书:
- -profile指定了使用ca-config.json中的profile
- 最后的server给定了生成的文件名,将得到如下三个文件:server.csr、server-key.pem和server.pem
-
-
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=server json/server.json | cfssljson -bare server -
类似的,可以生成客户端证书,配置文件的hosts字段指定为空即可
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=client json/client.json | cfssljson -bare client
CFSSL 工具还是很强大的,在这里只是简单介绍一下如何自签CA和相关证书。