蓝易云

CloudFlare 开源证书管理工具 cfssl 详细使用教程

862次阅读
没有评论

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

一、cfssl 是什么

阿蛮君在看很多视频的时候都看见过 cfssl 这个工具,所有抽时间了解了下。

在实际的工作中经常遇到制作自定义的服务器证书的场景,目前能够制作 CA 根证书及服务器证书有 openssl 及 cfssl 两种常用工具,之前介绍过 openssl 的 v3版 ssl 证书制作和 nginx 配置证书

下面了解一下 cfssl 和它的使用。

cfssl 是 CloudFlare 开源的一款 PKI/TLS 工具。 cfssl 包含一个命令行工具 和一个用于签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。(目前常被用做 k8s 集群生成证书)

CloudFlare 开源证书管理工具 cfssl 详细使用教程

二、安装 cfssl

1. 直接安装

  • 下载安装
curl -s -L -o /usr/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 && \
curl -s -L -o /usr/bin/cfssljson https://pkg.cfssl.org/R1.2/ cfssljson_linux-amd64 && \
curl -s -L -o /usr/bin/cfssl-certinfo https://pkg.cfssl.org/R1.2/ cfssl-certinfo_linux-amd64 && \
chmod +x /bin/cfssl*
  • 从 docker 容器拷贝
cat > entrypoint.sh<<EOF
#!/bin/sh
tail -f /dev/null
EOF
chmod +x entrypoint.sh
docker run -d --name cfssl -v $PWD:/workdir --entrypoint "/workdir/entrypoint.sh" cfssl/cfssl && \
docker cp cfssl:/usr/bin/cfssl . && \
docker cp cfssl:/usr/bin/cfssljson . && \
docker cp cfssl:/usr/bin/cfssl-certinfo . && \
mv cfssl* /usr/bin

2. docker 安装

docker pull cfssl/cfssl

docker 安装方式与直接安装不同的是使用方式不同。

cfssl/cfssl 镜像使用 /workdir 作为工作目录,为了使用方便可以使用宿主机当前目录映射到 /workdir。所以说需要的文件都应放在当前目录下,过程生成的文件也会输出在当前目录。

例如:docker run --rm -v $PWD:/workdir cfssl/cfssl certinfo -cert ca.crt,ca.crt 证书文件需要放在当前目录下,否则提示没有这个文件。

三、cfssl 命令

使用 cfssl --help 可以看见 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 # 生成新的证书吊销列表

1. cfssl selfsign

用于生成一个自签名证书,即自己颁发给自己的证书。

提示自签名证书很危险,使用此自签名证书风险自负,强烈建议不要使用这些证书在生产中。

# 1. 生成证书请求文件
cat > server-csr.json<<EOF
{
    "CN":"www.amjun.com",
    "hosts":[
        "127.0.0.1",
        "192.168.1.1",
        "amjun.com",
        "www.amjun.com"
    ],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "OU":"iot",
            "O":"unipower",
            "ST":"GuangZhou",
            "L":"GuangDong",
            "C":"CN"
        }
    ]
}
EOF

# 2. 生成私钥和证书
# 使用方式 cfssl selfsign HOSTNAME CSRJSON
cfssl selfsign www.amjun.com server-csr.json | cfssljson -bare  server
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl selfsign www.amjun.com server-csr.json | cfssljson -bare server

# 3. 查看证书
cfssl certinfo -cert server.pem

2. cfssl gencert

使用证书请求文件生成证书。

2.1 生成 CA 证书

与自签名证书类似,生成 CA 证书也需要证书请求文件。

# 1. 生成证书请求文件
cat > ca-csr.json <<EOF
{
    "CN":"kubernetes",
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Hebei",
            "ST":"Zhangjiakou",
            "O":"k8s",
            "OU":"System"
        }
    ]
}
EOF

# 2. 生成证书
# -initca 指定这个生成 ca 证书,否则需要指定 ca 证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl gencert -initca ca-csr.json | cfssljson -bare ca

2.2 生成 CA 签名的证书

# 1. 生成证书配置文件(CA 进行签名时需要的配置)
cat > ca-config.json <<EOF
{
    "signing":{
        "default":{
            "expiry":"87600h"
        },
        "profiles":{
            "kubernetes":{
                "expiry":"87600h",
                "usages":[
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF
# 这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。
# 默认策略,指定了证书的有效期是一年(8760h)
# etcd策略,指定了证书的用途
# signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
# server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证
# client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证

# 2. 生成服务端证书请求文件
cat > server-csr.json <<EOF
{
    "CN":"server",
    "hosts":[
        "127.0.0.1",
        "192.168.0.211",
        "192.168.0.212",
        "192.168.0.213",
        "10.10.10.1",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluste.local"
    ],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Hebei",
            "ST":"Zhangjiakou",
            "O":"k8s",
            "OU":"System"
        }
    ]
}
EOF

# 3. 基于之前生成的ca证书生成证书
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
server-csr.json | cfssljson -bare server
# docker方式:
docker run --rm -v $PWD:/workdir cfssl/cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server

# 3. 查看证书
cfssl certinfo -cert server.pem

常用的就上面两个命令,基本满足日常使用

下面讲讲其他的命令,有部分是前面的命令的其中一步。比如,下面cfssl genkey 就是只生成 key 文件和证书请求文件,并不会生成证书。

3. cfssl genkey

# 1. 生成证书配置文件
cat > ca-config.json <<EOF
{
    "signing":{
        "default":{
            "expiry":"87600h"
        },
        "profiles":{
            "kubernetes":{
                "expiry":"87600h",
                "usages":[
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF

# 2. 生成密钥文件
cfssl genkey ca-config.json | cfssljson -bare ca

提醒:本文发布于703天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2023-01-05发表,共计4062字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock