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

CFSSL包括:

  • 1.一组用于生成自定义 TLS PKI 的工具
  • 2.cfssl程序,是CFSSL的命令行工具

multirootca程序是可以使用多个签名密钥的证书颁发机构服务器
mkbundle程序用于构建证书池
cfssljson程序,从cfssl和multirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘

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

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

1.github

https://github.com/cloudflare/cfssl

2.下载

wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 
wget https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 
chmod +x cfssl*
for x in cfssl*; do mv $x ${x%*_1.5.0_linux_amd64};  done
mv cfssl* /usr/bin

3.生成ca证书

  • 1.建立集群CA keys与Certificates
  • 2.创建认证中心(CA)
  • 3.CFSSL可以创建一个获取和操作证书的内部认证中心。
  • 4.运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要
  • 5.生成CA证书和私钥(root证书和私钥)

4.初始化

cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json
  • 默认生成的模板文件如下:
{
    "signing": {  //签名
        "default": {
            "expiry": "168h"  //默认过期时间
        },
        "profiles": {
            "www": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}

这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。
默认策略,指定了证书的有效期是一年(8760h)。
etcd策略,指定了证书的用途。
signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE。
server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证。
client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证。

{
    "CN": "example.net",  //标识具体的域
    "hosts": [  //使用该证书的域名
        "example.net",
        "www.example.net"
    ],
    "key": {  //加密方式,一般RSA 2048
        "algo": "ecdsa",
        "size": 256
    },
    "names": [  //证书包含的信息,例如国家、地区等
        {
            "C": "US",
            "L": "CA",
            "ST": "San Francisco"
        }
    ]
}

CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
C: Country, 国家
L: Locality,地区,城市
O: Organization Name,组织名称,公司名称
OU: Organization Unit Name,组织单位名称,公司部门
ST: State,州,省

  • 生成配置模板及证书信息
cat > ca-config.json <<EOF
{
    "signing":{
        "default":{
            "expiry":"87600h"
        },
        "profiles":{
            "kubernetes":{
                "expiry":"87600h",
                "usages":[
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF
cat > ca-csr.json <<EOF
{
    "CN":"kubernetes",
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Hebei",
            "ST":"Zhangjiakou",
            "O":"k8s",
            "OU":"System"
        }
    ]
}
EOF

5.使用证书信息文件生成证书

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

6.生成服务端的配置模板及证书信息

cat > server-csr.json << EOF
{
    "CN":"kubernetes",
    "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

7.使用证书信息生成证书

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

8.集群管理员通过该证书访问集群

cat > admin-csr.json <<EOF
{
    "CN":"admin",
    "hosts":[],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Hebei",
            "ST":"Zhangjiakou",
            "O":"system:masters",
            "OU":"System"
        }
    ]
}
EOF

9.生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
cat > kube-proxy-csr.json <<EOF
{
    "CN":"system:kube-proxy",
    "hosts":[],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"Hebei",
            "ST":"Zhangjiakou",
            "O":"k8s",
            "OU":"System"
        }
    ]
}
EOF

10.生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

参考链接:
https://www.linux78.com/index.php?title=Cfssl#github
https://kulong0105.cn/linux/2017/06/10/an-intorduction-about-cert

posted on 2022-11-14 19:32  jiayou111  阅读(1563)  评论(0编辑  收藏  举报