#下载cfssl、cfssl-json、cfssl-certinfo文件
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo
#把可执行权限授予cfssl、cfssljson、cfssl-certinfo
chmod +x /usr/bin/cfssl*
cfssl -h
CFSSL是 CloudFlare 的 PKI 工具包,除此之外,它还可以用于生成证书签名。
创建根证书时,需要两个配置文件,如
根证书在创建自己的过程中或者利用根证书在创建子证书的过程中,
不是随便创建的,是根据模板来创建的,不同的模板可以出不同的特点的证书。
那么,ca-conf.json是用来存储不同模板的。
如下,内容:
{
"signing": {
"default": { # 默认配置
"expiry": "876000h" # 签名的有效期
},
"profiles": { # 由于每个证书造出来,至少都得有一个应用场景,那么profiles参数,就是来定义这些场景的
"server": { # server,只是一个名称,可根据业务场景自行设定名称
"usages": [
"signing", # 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
"key encipherment", # 表示该证书用于秘钥加密
"server auth", # 表示该证书是服务器端证书, client可以用该 CA 对server提供的证书进行验证
],
"expiry": "876000h"
},
"client": { # client,只是一个名称,可根据业务场景自行设定名称
"usages": [
"signing",
"key encipherment",
"client auth" # 表示该证书是客户端证书, server可以用该CA对client提供的证书进行验证
],
"expiry": "876000h"
},
"peer": { # peer,只是一个名称,可根据业务场景自行设定名称
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth" # 由于这里设定了2个,所以该证书服务端和客户端都能用
],
"expiry": "876000h"
}
}
}
}
这里注意,上面的配置文件,在真实使用的时候,是不准加注释的。回报如下错误:
所以,需要将ca-conf.json 文件所有注释去掉:
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"server": {
"usages": [
"signing",
"key encipherment",
"server auth"
],
"expiry": "876000h"
},
"client": {
"usages": [
"signing",
"key encipherment",
"client auth"
],
"expiry": "876000h"
},
"peer": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "876000h"
}
}
}
}
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "China",
"ST": "ShanXi",
"L": "XiAn",
"O": "Kubernetes",
"OU": "CA"
}
]
}
一般来说,申请证书的文件就是长这样子的。
csr 文件字段解释:
CN
(Common Name): apiserver 从证书中提取该字段作为请求的用户名 (User Name)首先,明确一点:该
"names"
值实际上是名称对象的列表。每个名称对象应至少包含一个“C”,“L”,“O”,“OU”或“ST”值(或这些的任意组合。也就是说,不必要全部都得有。
其次,由于这里是 CA 证书,是签发其它证书的根证书,这个证书密钥不会分发出去作为 client 证书,所有组件使用的 client 证书都是由 CA 证书签发而来,所以 CA 证书的 CN 和 O 的名称并不重要,后续其它签发出来的证书的 CN 和 O 的名称才是有用的。
证书申请时,都要提供类似的信息,可以通过配置文件xxx-csr.json,也可以命令行创建时,通过参数设置。
首先,这个命令,是用来造根证书,根秘钥的。然后,先把根证书和根秘钥造好之后,之后,才会使用根证书和根秘钥去给服务端,客户端去造认证证书。
命令: cfssl gencert -initca ca-csr.json | cfssljson -bare ca
命令: cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
是一样的效果,这里注意下,参数:cfssljson只是整理json格式,-bare主要的意义在于命名。具体来说,-bare后面给啥内容,那么生成的证书的名字就叫啥内容。
ca-csr.json, 申请证书时,需要向证书颁发机构,提交证书拥有者的一些信息。
单独执行cfssl gencert -initca ca-csr.json命令时,效果如下:
这样只是相当于打印到控制台,并不保存成文件。
再执行完整的命令,结果如下:
首先,先创建服务端的申请证书文件server-csr.json:
{
"CN": "service",
"hosts": [
"127.0.0.1",
"127.0.0.2",
"127.0.0.3",
"*.youku.com"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "China",
"ST": "ShanXi",
"L": "XiAn",
"O": "Kubernetes",
"OU": "CA"
}
]
}
注意,这里比上面的ca-csr.json多了一个字段hosts。
hosts包含的是授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误。另外,hosts也可配置区域,即一个证书的网站可以是*.youku.com也是可以是*.google.com。
接下来,生成证书的命令为:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-conf.json -profile=server server-csr.json | cfssljson -bare server -
参数解释:
执行结果如下:
一样的先造一个客户端的申请证书的配置文件client-csr.json:
{
"CN": "mytest1",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "China",
"ST": "ShanXi",
"L": "XiAn",
"O": "Kubernetes",
"OU": "CA"
}
]
}
和制作服务端证书类似,只需要改个别参数即可,命令如下:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-conf.json -profile=client client-csr.json | cfssljson -bare client -
执行结果如下:
命令:cfssl-certinfo -cert server.pem
ok,差不多就这些了.......
参考文档:grpc、https、oauth2等认证专栏实战7:使用cfssl来制作证书介绍_码二哥的博客-CSDN博客
CFSSL使用方法重新整理说明_51CTO博客_cfssl详解