CFFLS安装和使用

xiaohai 2020-04-13 19:36:39 2654人围观 标签: CA 
简介CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。

CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。

项目地址: https://github.com/cloudflare/cfssl
下载地址: https://pkg.cfssl.org/

CFSSL包括:

  • 一组用于生成自定义 TLS PKI 的工具
  • cfssl程序,是CFSSL的命令行工具
  • multirootca程序是可以使用多个签名密钥的证书颁发机构服务器
  • mkbundle程序用于构建证书池
  • cfssljson程序,从cfsslmultirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘

PKI借助数字证书和公钥加密技术提供可信任的网络身份。通常,证书就是一个包含如下身份信息的文件:

  • 证书所有组织的信息
  • 公钥
  • 证书颁发组织的信息
  • 证书颁发组织授予的权限,如证书有效期、适用的主机名、用途等
  • 使用证书颁发组织私钥创建的数字签名
安装cfssl

这里我们只用到cfssl工具和cfssljson工具:

curl -s -L -o /bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o /bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
curl -s -L -o /bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x /bin/cfssl*

cfssl命令介绍:

  • bundle: 创建包含客户端证书的证书包
  • genkey: 生成一个key(私钥)和CSR(证书签名请求)
  • scan: 扫描主机问题
  • revoke: 吊销证书
  • certinfo: 输出给定证书的证书信息, 跟cfssl-certinfo 工具作用一样
  • gencrl: 生成新的证书吊销列表
  • selfsign: 生成一个新的自签名密钥和 签名证书
  • print-defaults: 打印默认配置,这个默认配置可以用作模板
  • serve: 启动一个HTTP API服务
  • gencert: 生成新的key(密钥)和签名证书
    • -ca:指明ca的证书
    • -ca-key:指明ca的私钥文件
    • -config:指明请求证书的json文件
    • -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息
  • ocspdump
  • ocspsign
  • info: 获取有关远程签名者的信息
  • sign: 签名一个客户端证书,通过给定的CA和CA密钥,和主机名
  • ocsprefresh
  • ocspserve

集群相关证书类型

  • client certificate: 用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
  • server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
  • peer certificate: 双向证书,用于etcd集群成员间通信

cfssl常用命令


使用CFSSL创建CA认证步骤

1、初始化json文件
[root@localhost ca]# cfssl print-defaults config > ca-config.json # 默认证书生产策略配置模板
[root@localhost ca]# cfssl print-defaults csr > ca-csr.json #默认csr请求模板
2、自签CA

修改ca-config.json文件:

  • profiles:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;指定了不同角色的配置信息服务端使用server auth(TLS Web Server Authentication X509 V3 extension),客户端使用client auth(TLS Web Server Authentication X509 V3 extension)
  • expiry:指定了证书的过期时间为175200小时(即20年)

内容如下:

{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {
            "server": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
	        }
        }
    }
}

自定义ca-csr.json,修改csr模板成如下内容:

{ "CN": "www.test.com", "hosts": [ "*.test.com", "www.test.net" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] }

说明:

  • CN: Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
  • O: Organization Name,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group),组织名称,公司名称
  • C: Country, 国家
  • L: Locality,地区,城市
  • OU: Organization Unit Name,组织单位名称,公司部门
  • ST: State,州,省
3、生成CA证书和私钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@localhost ca]# ll
总用量 20
-rw-r--r-- 1 root root 830 4月  13 16:03 ca-config.json
-rw-r--r-- 1 root root 505 4月  13 16:05 ca.csr
-rw-r--r-- 1 root root 287 4月  13 15:58 ca-csr.json
-rw------- 1 root root 227 4月  13 16:05 ca-key.pem
-rw-r--r-- 1 root root 745 4月  13 16:05 ca.pem

生成ca.pem、ca.csr、ca-key.pem(CA私钥,需妥善保管)

4、生成server端证书
[root@localhost ca]# cfssl print-defaults csr > server-csr.json [root@localhost ca]# cat server-csr.json { "CN": "example.net", "hosts": [ "example.net", "www.example.net" ], "key": { "algo": "ecdsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] } #修改server-csr.json内容如下: [root@localhost ca]# cat server-csr.json { "CN": "server.test.com", "hosts": [ "*.test.com", "server.test.com" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] }

然后使用刚才生成的CA来给服务器签署证书,运行如下命令来生成服务端证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

同理,这里去生成客户端的证书