cfssl自签证书工具使用
一、cfssl工具介绍
cfssl是CloudFlare公司提供的PKI/TLS工具,它是一个命令行工具和Go语言库,用于创建、签发、管理和验证X.509数字证书,官方地址https://pkg.cfssl.org。
生成自签证书的方式有多种,cfssl支持签发三种类型的证书:client证书、server证书以及集群成员之间的peer证书。推荐使用cfssl工具或者openssl工具来生成,openssl也是开源的证书生成工具。
二、安装cfssl工具
cfssl目前有三个二进制文件,分别为cfssl、cfssljson、cfssl-certinfo。访问cfssl源码地址查看最新稳定版本,下载对应的版本后解压到可执行文件目录即可运行,这三个二进制包作用如下:
- cfssl_1.6.5_linux_amd64:用于签发证书;
- cfssljson_1.6.5_linux_amd64:用于将cfssl签发生成的证书(json格式)变成文件;
- cfssl-certinfo_1.6.5_linux_amd64:用于验证查看证书信息;
1.Ubuntu系统用如下命令快速下载:
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl-certinfo_1.6.5_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64
2.下载完成后移动包到/usr/local/bin/可执行文件目录并重命名为cfssl、cfssljson、cfssl-certinfo:
mv cfssl_1.6.5_linux_amd64 /usr/local/bin/cfssl mv cfssljson_1.6.5_linux_amd64 /usr/local/bin/cfssljson mv cfssl-certinfo_1.6.5_linux_amd64 /usr/local/bin/cfssl-certinfo
3.给文件赋予权限:
chmod +x /usr/local/bin/cfssl chmod +x /usr/local/bin/cfssljson chmod +x /usr/local/bin/cfssl-certinfo
4.验证安装是否正确:
cfssl --help
三、cfssl创建证书的相关概念
1.CSR描述文件
向证书颁发机构CA申请证书时,需要提供一个叫做证书签名请求(CSR)的文件,他们会对其进行签名并生成证书返还。为了生成 CSR,您必须提供一个包含请求相关详细信息的 csr.json描述文件,格式如下:
- host:证书绑定的域名;
- CN:证书域;
- names:证书所属信息,C=国家、L=城市、O-组织、OU=组织单位、ST=州/省。
- keys:一些CA机构支持的默认值。
{
"hosts": [
"example.com",
"www.example.com"
],
"CN": "www.example.com",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "US",
"L": "San Francisco",
"O": "Example Company, LLC",
"OU": "Operations",
"ST": "California"
}]
}
2.CSR证书请求文件
证书请求文件是证书申请者在申请数字证书时由CSP(加密服务提供者)生成的,证书申请者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
csr.json文件准备好以后,可以通过API 或命令行界面生成 CSR 和私钥。两者都返回 JSON 响应,可以通过工具cfslljson将响应转换为文件。以下语句表示通过csr.json作为参数获取CSR和私钥,并将返回的json格式通过cfssljson工具转换为文件。
cfssl genkey csr.json | cfssljson -bare certificate
以上命令将生成一个“certificate.csr”和“certificate-key.pem”文件,前者是证书签名请求文件,后者是对应的私钥PEM,私钥需要进行安全保存。
3.CA证书
CA证书也叫根证书,是整个证书链的起点,它用于签发和验证其他证书。具体来说,CFSSL的根证书的作用包括:
- 签发证书:根证书具有签发其他证书的能力。当需要为某个服务或设备颁发证书时,可以使用根证书来签发。这样,被签发的证书就具有了根证书的信任度,从而被其他系统或服务所认可。
- 建立信任:根证书是建立信任的基础。它允许系统或服务之间通过证书进行身份验证和数据加密,确保通信的安全性和数据的完整性。
- 验证证书:除了签发证书外,根证书还可以用来验证其他证书的有效性。当某个证书需要被验证时,可以通过检查它是否由某个已知的根证书签发来进行验证。
- 安全性保障:通过使用根证书,可以确保只有经过授权的实体才能参与通信,从而防止中间人攻击等安全威胁。
- 管理证书生命周期:根证书还用于管理证书的生命周期,包括证书的颁发、续订、吊销等操作。
使用如下命令可以获取根证书及其密钥,其中入参ca-csr.json就是前面提到的csr描述文件:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
以上命令后会生成如下三个文件:
- ca.pem:ca根证书;
- ca-key.pem:ca根证书私钥;
- ca.csr:ca根证书请求文件。
4.证书配置文件
证书配置文件config.json用于配置证书的使用场景,格式如下:
- signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE;
- server auth:表示client可以用该证书对server提供的证书进行验证;
- client auth:表示server可以用该证书对client提供的证书进行验证;
- expiry:表示生成的证书有效期;
- profiles:表示证书的使用场景,生成目标证书时通过-profile=profilename来指定。
{ "signing":{ "default":{ "expiry":"175200h" }, "profiles":{ "etcd":{ "expiry":"175200h", "usages":[ "signing", "key encipherment", "server auth", "client auth" ] } } } }
以下是用配置文件生成一个证书的示例命令,其中-ca指定根证书公钥、-ca-key指定根证书私钥、-config指定证书配置文件、-profile指定证书应用场景、-csr.json提供描述信息。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
四、使用cfssl生成证书
1.创建根证书CSR描述文件ca-csr.json:
{ "hosts": [ "www.ca.com" ], "CN": "CA_CN", "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CA_CN", "L": "CA_L", "O": "CA_O", "OU": "CA_OU", "ST": "CA_ST" }] }
2.创建CA证书和CA私钥:运行如下命令将得到ca.csr、ca.pem、ca-key.pem三个文件。
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
3.创建ca-config.json证书配置文件:
{ "signing": { "default": { "expiry": "175200h" }, "profiles": { "profile_01": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] }, "profile_02": { "expiry": "175200h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } }
4.创建自签证书描述文件self-csr.json:
{ "hosts": [ "127.0.0.1", "10.10.1.3", "10.10.1.4", "10.10.1.5" ], "CN": "self_cn", "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "self_CN", "L": "self_L", "O": "self_O", "OU": "self_OU", "ST": "self_ST" }] }
5.创建自签证书:以下命令将生成self.csr(证书请求文件)、self.pem(证书)、self-key.pem(证书私钥)三个文件。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=profile_01 self-csr.json | cfssljson -bare self
6.查看已经生成的self证书信息:
cfssl certinfo -cert self.pem
五、CFSSL语法说明
version # 查看 cfssl 版本 selfsign # 生成一个新的自签名密钥和签名证书 certinfo # 输出给定证书的证书信息, 跟 cfssl-certinfo 工具作用一样 print-defaults # 打印json格式的模板-ca签名配置文件和客户端证书请求文件 # config:生成ca配置模板文件 # csr:生成证书请求模板文件 gencert # 生成新的key(密钥)和签名证书 # -initca:初始化一个新ca (默认false,需要指定ca证书用以前面其他证书) # -ca:ca的证书 # -ca-key:ca的私钥文件 # -config:请求证书的json文件 # -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息 sign # 签名一个客户端证书,通过给定的CA和CA密钥,和主机名 revoke # 吊销证书 info # 获取签名者信息 bundle # 创建包含客户端证书的证书包 serve # 启动一个HTTP API服务 genkey # 生成一个key(私钥)和csr(证书签名请求) gencsr # 生成新的证书请求文件 gencrl # 生成新的证书吊销列表