cfssl使用方法重新整理说明

下载安装:

#下载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使用方法重新整理说明_第1张图片

1、cfssl 介绍                                                                                          

​​​​CFSSL是 CloudFlare 的 PKI 工具包,除此之外,它还可以​​​用于生成证书签名。

2、主要流程                                                                                            

  • 1、需要先创建根证书
  • 2、利用根证书,来颁发子证书
    • 如果将证书用在服务器端一侧,就可以称为服务器端证书
    • 如果将证书用在客户端一侧,就可以称为客户端证书
    • 依次类推

3、创建证书时,用到的配置文件简单介绍                                              

创建根证书时,需要两个配置文件,如

  • xxx-conf.json
    • 制作证书模板配置文件
    • 证书颁发机构,颁发证书时,需要参考不同模板的要求进行证书创建
  • xxx-csr.json
    • 申请证书配置文件
    • 证书申请者申请证书时,要填写的基本信息

4、证书模板配置文件ca-conf.json                                                         

根证书在创建自己的过程中或者利用根证书在创建子证书的过程中,

不是随便创建的,是根据模板来创建的,不同的模板可以出不同的特点的证书。

那么,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-config.json:可以定义多个场景,分别指定不同的过期时间、使用场景等参数,后续在签名证书时使用某个场景,需要在参数上指定即可。

这里注意,上面的配置文件,在真实使用的时候,是不准加注释的。回报如下错误:

所以,需要将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"
      }
    }
  }
}

5、证书申请文件ca-csr.json                                                                  

{
  "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)
  • key{}.algo:用于定义加密算法
  • key{}.size:长度
  • names[].C (Country):国家
  • names[].ST (State):州或省
  • names[].L  (Locality):地区或城市(如城市或城镇名称)
  • names[].O(Organization): 组织。一般apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
  • names[].OU (Organization Unit):组织单位,如负责拥有密钥的部门; 它也可以用于“做生意”(DBS)的名称

首先,明确一点:该​​"names"​​值实际上是名称对象的列表。每个名称对象应至少包含一个“C”,“L”,“O”,“OU”或“ST”值(或这些的任意组合。也就是说,不必要全部都得有。

其次,由于这里是 CA 证书,是签发其它证书的根证书,这个证书密钥不会分发出去作为 client 证书,所有组件使用的 client 证书都是由 CA 证书签发而来,所以 CA 证书的 CN 和 O 的名称并不重要,后续其它签发出来的证书的 CN 和 O 的名称才是有用的。

证书申请时,都要提供类似的信息,可以通过配置文件xxx-csr.json,也可以命令行创建时,通过参数设置。

6、cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 介绍

首先,这个命令,是用来造根证书,根秘钥的。然后,先把根证书和根秘钥造好之后,之后,才会使用根证书和根秘钥去给服务端,客户端去造认证证书。

命令: 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命令时,效果如下:

cfssl使用方法重新整理说明_第2张图片

 这样只是相当于打印到控制台,并不保存成文件。

再执行完整的命令,结果如下:

cfssl使用方法重新整理说明_第3张图片

 7、创建服务器端证书,证书密钥                                                           

 首先,先创建服务端的申请证书文件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 -

参数解释:

  • -ca: 根证书
  • -ca-key: 根秘钥
  • -config: 根证书的配置文件(里面定义了很多场景)
  • -profile: 选择根证书配置文件里的一个场景
  • server-csr.json : 申请证书的对象的相关信息配置文件
  • -bare:制造的证书文件的文件名称(或前缀)

执行结果如下:

cfssl使用方法重新整理说明_第4张图片

 8、制作客户端证书                                                                                 

一样的先造一个客户端的申请证书的配置文件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使用方法重新整理说明_第5张图片

 9、使用cfssl-certinfo来查看证书信息                                                   

命令:cfssl-certinfo -cert server.pem

cfssl使用方法重新整理说明_第6张图片

 ok,差不多就这些了.......

参考文档:grpc、https、oauth2等认证专栏实战7:使用cfssl来制作证书介绍_码二哥的博客-CSDN博客

CFSSL使用方法重新整理说明_51CTO博客_cfssl详解

你可能感兴趣的:(python)