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描述文件,格式如下:

  1. host:证书绑定的域名;
  2. CN:证书域;
  3. names:证书所属信息,C=国家、L=城市、O-组织、OU=组织单位、ST=州/省。
  4. 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

  以上命令后会生成如下三个文件:

  1. ca.pem:ca根证书;
  2. ca-key.pem:ca根证书私钥;
  3. 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 # 生成新的证书吊销列表   
posted @ 2024-07-09 14:42  我若安好,便是晴天  阅读(192)  评论(0编辑  收藏  举报