阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

公钥基础设施(PKI)/CFSSL证书生成工具的使用

138次阅读
没有评论

共计 4304 个字符,预计需要花费 11 分钟才能阅读完成。

公钥基础设施 (PKI)

基础概念

CA(Certification Authority) 证书,指的是权威机构给我们颁发的证书。

密钥就是用来加解密用的文件或者字符串。密钥在非对称加密的领域里,指的是私钥和公钥,他们总是成对出现,其主要作用是加密和解密。常用的加密强度是 2048bit。

RSA 即非对称加密算法。非对称加密有两个不一样的密码,一个叫私钥,另一个叫公钥,用其中一个加密的数据只能用另一个密码解开,用自己的都解不了,也就是说用公钥加密的数据只能由私钥解开。

证书的编码格式

PEM(Privacy Enhanced Mail),通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, 和 .key。内容为 Base64 编码的 ASCII 码文件,有类似 ”—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–“ 的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为 PEM 格式(认证证书其实就是公钥)。Apache 和 nginx 等类似的服务器使用 PEM 格式证书。

DER(Distinguished Encoding Rules),与 PEM 不同之处在于其使用二进制而不是 Base64 编码的 ASCII。扩展名为.der,但也经常使用.cer 用作扩展名,所有类型的认证证书和私钥都可以存储为 DER 格式。Java 使其典型使用平台。

证书签名请求 CSR

CSR(Certificate Signing Request),它是向 CA 机构申请数字×××书时使用的请求文件。在生成请求文件前,我们需要准备一对对称密钥。私钥信息自己保存,请求中会附上公钥信息以及国家,城市,域名,Email 等信息,CSR 中还会附上签名信息。当我们准备好 CSR 文件后就可以提交给 CA 机构,等待他们给我们签名,签好名后我们会收到 crt 文件,即证书。

注意:CSR 并不是证书。而是向权威证书颁发机构获得签名证书的申请。

把 CSR 交给权威证书颁发机构, 权威证书颁发机构对此进行签名, 完成。保留好 CSR, 当权威证书颁发机构颁发的证书过期的时候, 你还可以用同样的 CSR 来申请新的证书,key 保持不变.

数字签名

数字签名就是 ” 非对称加密 + 摘要算法 ”,其目的不是为了加密,而是用来防止他人篡改数据。

其核心思想是:比如 A 要给 B 发送数据,A 先用摘要算法得到数据的指纹,然后用 A 的私钥加密指纹,加密后的指纹就是 A 的签名,B 收到数据和 A 的签名后,也用同样的摘要算法计算指纹,然后用 A 公开的公钥解密签名,比较两个指纹,如果相同,说明数据没有被篡改,确实是 A 发过来的数据。假设 C 想改 A 发给 B 的数据来欺骗 B,因为篡改数据后指纹会变,要想跟 A 的签名里面的指纹一致,就得改签名,但由于没有 A 的私钥,所以改不了,如果 C 用自己的私钥生成一个新的签名,B 收到数据后用 A 的公钥根本就解不开。

常用的摘要算法有 MD5、SHA1、SHA256。

使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。

数字证书和公钥

数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用 CA 的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。实际上,数字证书就是经过 CA 认证过的公钥,除了公钥,还有其他的信息,比如 Email,国家,城市,域名等。

CFSSL 工具

CFSSL 介绍

项目地址:https://github.com/cloudflare/cfssl

下载地址:https://pkg.cfssl.org/

参考链接:https://blog.cloudflare.com/how-to-build-your-own-public-key-infrastructure/

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

CFSSL 包括:

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

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

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

安装 cfssl

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

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

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

创建认证中心 (CA)

CFSSL 可以创建一个获取和操作证书的内部认证中心。

运行认证中心需要一个 CA 证书和相应的 CA 私钥。任何知道私钥的人都可以充当 CA 颁发证书。因此,私钥的保护至关重要。

生成 CA 证书和私钥 (root 证书和私钥)

创建一个文件 ca-csr.json:

{
  “CN”: “www.linuxidc.com”,
  “key”: {
    “algo”: “rsa”,
    “size”: 2048
  },
  “names”: [
    {
      “C”: “CN”,
      “ST”: “BeiJing”,
      “L”: “BeiJing”,
      “O”: “linuxidc”,
      “OU”: “ops”
    }
  ]
}

术语介绍:

CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法

C: Country,国家

L: Locality,地区,城市

O: Organization Name,组织名称,公司名称

OU: Organization Unit Name,组织单位名称,公司部门

ST: State,州,省

生成 CA 证书和 CA 私钥和 CSR(证书签名请求):

# cfssl gencert -initca ca-csr.json | cfssljson -bare ca  ## 初始化 ca
# ls ca*
ca.csr  ca-csr.json  ca-key.pem  ca.pem

该命令会生成运行 CA 所必需的文件 ca-key.pem(私钥)和 ca.pem(证书),还会生成 ca.csr(证书签名请求),用于交叉签名或重新签名。

小提示:

使用现有的 CA 私钥,重新生成:

cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca

使用现有的 CA 私钥和 CA 证书,重新生成:

cfssl gencert -renewca -ca cert.pem -ca-key key.pem

查看 cert(证书信息):

# cfssl certinfo -cert ca.pem

查看 CSR(证书签名请求) 信息:

# cfssl certinfo -csr ca.csr

配置证书生成策略

配置证书生成策略,让 CA 软件知道颁发什么样的证书。

# vim ca-config.json
{
  “signing”: {
    “default”: {
      “expiry”: “8760h”
    },
    “profiles”: {
      “etcd”: {
        “usages”: [
            “signing”,
            “key encipherment”,
            “server auth”,
            “client auth”
        ],
        “expiry”: “8760h”
      }
    }
  }
}

这个策略,有一个默认的配置,和一个 profile,可以设置多个 profile,这里的 profile 是 etcd。

默认策略,指定了证书的有效期是一年 (8760h)

etcd 策略,指定了证书的用途

signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE

server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证

client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证

cfssl 常用命令:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca ## 初始化 ca

cfssl gencert -initca -ca-key key.pem ca-csr.json | cfssljson -bare ca ## 使用现有私钥, 重新生成

cfssl certinfo -cert ca.pem

cfssl certinfo -csr ca.csr

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计4304字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中