证书管理工具 cfssl 浅尝

简介: 证书管理工具 cfssl 浅尝

一、cfssl概述

CFSSL是CloudFlare公司提供的PKI/TLS工具,使用Go语言开发。开源并支持Windows、Linux、macos系统。

官网: https://cfssl.org/

源码: https://github.com/cloudflare/cfssl

二进制: http://pkg.cfssl.org/

  • 工具集:
    • multirootca:管理多个签名密钥的情形;使用多个签名密钥的证书颁发机构服务器
    • mkbundle:构建证书池;
    • cfssljson:将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
    • cfssl-certinfo:可显示CSR或证书文件的详细信息;可用于证书校验。
  • 文件说明

ca-config.json:配置文件

ca-csr.json:证书请求文件

han-ca.csr:证书签名请求文件

han-ca.pem:公钥

han-key.pem:私钥

ca-config.json解析
可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;

{
   
   "signing": {
   
      "default": {
   
         "expiry": "168h"
      },
      "profiles": {
   
         "www": {
   
            "expiry": "8760h",
            "usages": [
              "signing",
              "key encipherment",
              "server auth"
              ]
           },
           "client": {
   
              "expiry": "8760h",
              "usages": [
              "signing",
              "key encipherment",
              "client auth"
              ]
           }
        }
    }
}
  • signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;

expiry:证书有效期限(单位:小时),8760h=1年;指定了证书的过期时间。
usage:用法;
key encipherment:密钥加密;
profiles:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile。
server auth:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证;

ca-csr.json解析

{
   
     "CN": "example.net",
     "hosts": [
         "example.net",
         "www.example.net"
     ],
     "key": {
   
         "algo": "rsa",
         "size": 204
     },
     "names": [
        {
   
           "C": "US",
           "ST": "CA",
           "L": "San Francisco"
           “O“:”kubernetes”
           “OU”:”system”
        }
     ]
 }

CN: Common Name
hosts:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误。kubernetes 开头的域名作用:集群创建好后,default namespace 下会创建一个叫 kubenretes 的 svc,有一些组件会直接连接这个 svc 来跟 api 通讯的,证书如果不包含可能会出现无法连接的情况;
Key: 指定使用的加mi算法,一般使用rsa非对称加mi算法(algo:rsa;size:)。“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

.csr文件解析
CA机构不会凭空创建一个证书,他们需要一个公钥和一些元数据来填入证书之中,而这些信息就是存放在CSR文件之中,

Csr文件需要包含:

申请者的公钥信息
使用申请者私钥产生的数字签名
申请者机构相关的信息

二、命令语法格式

使用 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
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
域名解析 监控 网络协议
分享40个主机域名PHP源码,总有一款适合你
分享40个主机域名PHP源码,总有一款适合你
536 1
|
消息中间件 Kubernetes Docker
「译」在 Kubernetes 1.16 上启用和使用 Ephemeral(临时)容器
「译」在 Kubernetes 1.16 上启用和使用 Ephemeral(临时)容器
|
编解码 网络协议 开发工具
GB/T28181-2022协议版本标识X-GB-Ver解读
GB28181-2022相对2016,其中有个变化是:报文中携带协议版本标识 X-GB-Ver:3.0(3.0-2022 2.0-2016)
372 0
|
Ubuntu 开发工具
Ubuntu更换阿里云软件源
Ubuntu更换阿里云软件源
141278 0
|
消息中间件 微服务
MQTT X连接阿里云微服务消息队列MQTT
MQTT X 是 EMQ 开源的一款优雅的跨平台 MQTT 5.0 桌面客户端,它支持 macOS, Linux, Windows。MQTT X 的 UI 采用了聊天界面形式,简化了页面操作逻辑,用户可以快速创建连接,允许保存多个客户端,方便用户快速测试 MQTT/MQTTS 连接,及 MQTT 消息的订阅和发布。本文演示如何使用该工具快速连接阿里云微服务消息队列MQTT,并进行消息的发布和订阅测试。
4518 0
MQTT X连接阿里云微服务消息队列MQTT
|
缓存 Linux 开发工具
CentOS 7- 配置阿里镜像源
阿里镜像官方地址http://mirrors.aliyun.com/ 1、点击官方提供的相应系统的帮助 :2、查看不同版本的系统操作: 下载源1、安装wget yum install -y wget2、下载CentOS 7的repo文件wget -O /etc/yum.
255424 0
|
存储 Linux Docker
在Docker中,如何更改Docker的默认存储设置?
在Docker中,如何更改Docker的默认存储设置?
|
7月前
|
人工智能 弹性计算 IDE
你用AI编程用到什么深度了?
你用AI编程用到什么深度了?
你用AI编程用到什么深度了?
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
477 4
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
Kubernetes Cloud Native 网络协议
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
云原生|kubernetes部署和运行维护中的错误汇总(不定时更新)
3129 0