- #下载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,差不多就这些了.......