“活着,已经是最深厚的福报了,因为没死,才能偿还往昔的债业”
CFSSL is CloudFlare's PKI toolkit, and, among other things, it's useful for generating Certificate Signature Requests, or CSRs. A CSR is what you give to a Certificate Authority; they'll sign it and give you back a certificate that you install on your webserver. CFSSL can generate both a private key and certificate request.
这就是最官方的解释了,本想从wiki上获取一些cfssl的前世今生,可惜wiki上还没有这个词条,既然没有太多的历史背景,就直接从使用上看看这个工具的能力:
cfssl是通过go语言写就,通过读取json文件配置的证书生成时所需的各种参数,这就是对cfssl的最基本了解,下面看两段配置文件定义:
config.json - config.json可以理解为证书功能性的配置,例如这里主要添加了3个profile,每个profile下面定义了证书的过期时间和使用范围。在这里放置ca,server和client三份profile,是为了后面更好的对比生成证书的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
{ "signing": { "default": { "expiry": "168h" }, "profiles": { "ca": { "expiry": "5000h", "usages": [ "signing", "Certificate Sign", "CRL Sign" ] }, "server": { "expiry": "2000h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "1000h", "usages": [ "signing", "key encipherment", "client auth" ] } } } } |
ca.json - ca.json和server.json都可以看作是证书内容性的配置,例如这里面主要是一些字段值的定义,当然了还有很重要的私钥属性配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "CN": "mowblogRooter", "hosts": [ "mowblog.com" ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "OU": "mowblogRootTester" } ] } |
server.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "_comment":"hosts: list of the domain names which the certificate should be valid for", "hosts": [ "www.mowblog.com", "65.49.216.91" ], "_comment":"CN: used by some CAs to determine which domain the certificate is to be generated for instead", "CN": "mowblog.com", "key": { "algo": "rsa", "size": 2048 }, "_comment":"names: a list of name objects. Each name object should contain at least one C, L, O, OU, or ST value (or any combination of these)", "names": [ { "OU": "Mowblog Studio" } ] } |
配置完成了,下面看看实际生成证书的效果,首先生成根证书:
cfssl gencert -initca ca.json | cfssljson -bare ca
接着生成服务端证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=config.json -profile=server server.json | cfssljson -bare server
(cfssljson,这个工具官方的说明是将cfssl生成的json格式的结果,提取出来保存为文件)
上面生成了ca和server两份证书,来看一下两者的内容,ca证书,关注一些红框里面的证书生效时间为5年
server证书,生效时间是2000个小时,说明我们config.json中server profile的设定是有效的。
对比ca.pem证书固定的5年有效期,如果在创建ca的时候也指定config和profile会是什么结果,用下面的这段语句测试一下:
cfssl gencert -initca --config=config.json --profile=ca ca.json | cfssljson -bare ca
发现ca的时间一成不变永远是5年的期限,在官网内也没有找到相关的说明,难道是代码内固化了吗?不管怎样,至少所有证书的开始时间都是当前的UTC时间,这就足够了,如果证书即将到期,如法再生成一次,将旧的文件替换掉就可以接着使用了,不是吗。