[转帖]PKI/TLS瑞士军刀之cfssl

pki,tls,瑞士军刀,cfssl · 浏览次数 : 0

小编点评

1. ** signing:表示该证书可用于签名其它证书;** 2. ** generated ca.pem 证书中CA=TRUEserver auth:表示client可以用该 CA 对server提供的证书进行验证;** 3. ** client auth:表示server可以用该CA对client提供的证书进行验证;** 4. ** note:标点符号,最后一个字段一般没有逗号的。** 5. ** copy2:初始化创建CA认证中心,将会生成ca-key.pem(私钥)和ca.pem(公钥)cfssl gencert -initca ca-csr.json | cfssljson -bare ca** 6. ** copy3:创建kubernetes证书创建kubernetes-csr.json证书请求文件{ \"CN\": \"kubernetes\", \"hosts\": [ \"127.0.0.1\", \"10.1.20.129\", \"10.1.20.128\", \"10.1.20.126\", \"10.1.20.127\", \"10.254.0.1\", \"*.kubernetes.master\", \"localhost\", \"kubernetes\", \"kubernetes.default\", \"kubernetes.default.svc\", \"kubernetes.default.svc.cluster\", \"kubernetes.default.svc.cluster.local\"] }, \"key\": { \"algo\": \"rsa\", \"size\": 2048 }, \"names\": [ { \"C\": \"CN\", \"ST\": \"BeiJing\", \"L\": \"BeiJing\", \"O\": \"k8s\", \"OU\": \"System\" } ]}** 7. ** copy6:生成admin证书和私钥cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin** 8. ** copy7:创建kubernetes证书和私钥cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin**

正文

https://cloud.tencent.com/developer/article/2020654?areaSource=&traceId=

 

CFSSL是CloudFlare公司提供的PKI/TLS工具,是一组使用Go语言开发的开源工具。CloudFlare公司的主营业务之一就是提供网络安全服务,在开源CFSSL的时候就宣称他们所有的TLS证书都使用了CFSSL工具。

证书的管理涉及很多方面比如证书链,对于很多运维管理者来说都是很繁琐的事情,CFSSL的目标之一就是为了解决证书管理在性能、兼容性以及安全性的问题。

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

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

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

PEM(Privacy Enhanced Mail),通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, 和 .key。内容为Base64编码的ASCII码文件,有类似的头尾标记服务器认证证书。

中级认证证书和私钥都可以储存为PEM格式(认证证书其实就是公钥)。Apache和nginx等类似的服务器使用PEM格式证书。

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

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

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

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

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: 从cert db 中的所有 OCSP 响应中生成一系列连贯的 OCSP 响应,供 ocspserve 使用
ocspsign: 为给定的CA、Cert和状态签署OCSP响应。返回一个base64编码的OCSP响应
info: 获取有关远程签名者的信息
sign: 签名一个客户端证书,通过给定的CA和CA密钥,和主机名
ocsprefresh: 用所有已知未过期证书的新OCSP响应刷新ocsp_responses表。
ocspserve: 设置一个HTTP服务器,处理来自文件或直接来自数据库的OCSP请求(见RFC 5019)。

常用命令

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

使用CFSSL创建CA认证步骤 1、创建认证中心(CA)

cfssl可以创建一个获取和操作证书的内部认证中心。运行认证中心需要一个CA证书和相应的CA私钥。任何知道私钥的人都可以充当CA来颁发证书。因此,私钥的保护至关重要,这里我们以k8s所需的证书来实践一下:

cfssl print-defaults config > config.json # 默认证书策略配置模板
cfssl print-defaults csr > csr.json #默认csr请求模板

结合自身的要求,修改证书请求文件csr.json,证书10年

{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
   ],
   "ca": {
    "expiry": "87600h"
  }
}

知识点:

"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name)
"O":Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组 (Group)
C: Country, 国家
L: Locality,地区,城市
O: Organization Name,组织名称,公司名称
OU: Organization Unit Name,组织单位名称,公司部门
ST: State,州,省

证书配置模板文件ca-config.json

{
  "signing": {
      "default": {
        "expiry": "87600h"
   },
  "profiles": {
    "kubernetes": {
      "usages": [
        "signing",
        "key encipherment",
        "server auth",
        "client auth"
      ],
      "expiry": "87600h"
    }
   }
  }
}

知识点:

config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;此实例只有一个kubernetes模板。
signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中CA=TRUE
server auth:表示client可以用该 CA 对server提供的证书进行验证;
client auth:表示server可以用该CA对client提供的证书进行验证;
注意标点符号,最后一个字段一般是没有逗号的。

2、初始化创建CA认证中心,将会生成ca-key.pem(私钥)和ca.pem(公钥)

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

3、创建kubernetes证书

创建kubernetes-csr.json证书请求文件

{
    "CN": "kubernetes",
    "hosts": [
        "127.0.0.1",
        "10.1.20.129",
        "10.1.20.128",
        "10.1.20.126",
        "10.1.20.127",
        "10.254.0.1",
        "*.kubernetes.master",
        "localhost",
        "kubernetes",
        "kubernetes.default",
        "kubernetes.default.svc",
        "kubernetes.default.svc.cluster",
        "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}

知识点:

这个证书目前专属于 apiserver,加了一个 *.kubernetes.master域名以便内部私有 DNS 解析使用(可删除); kubernetes 这几个能不能删掉,答案是不可以的;因为当集群创建好后,default namespace 下会创建一个叫 kubenretes 的svc,有一些组件会直接连接这个 svc 来跟 api 通信的,证书如果不包含可能会出现无法连接的情况; 其他几个 kubernetes 开头的域名作用相同 hosts包含的是授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误。 10.254.0.1是指kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP。

4、生成kubernetes证书和私钥

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

知识点:

-config 引用的是模板中的默认配置文件,
-profiles是指定特定的使用场景,比如config.json中的kubernetes区域

5、创建admin证书

创建admin证书请求文件admin-csr.json

 {
    "CN": "admin",
    "hosts": [],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
        "C": "CN",
        "ST": "BeiJing",
        "L": "BeiJing",
        "O": "system:masters",
        "OU": "System"
    }
    ]
}

6、生成admin证书和私钥

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

知识点: 这个admin 证书,是将来生成管理员用的kubeconfig 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN字段作为User, O 字段作为 Group

同样,我们也可以按照同样的方式来创建kubernetes中etcd集群的证书

与[转帖]PKI/TLS瑞士军刀之cfssl相似的内容:

[转帖]PKI/TLS瑞士军刀之cfssl

https://cloud.tencent.com/developer/article/2020654?areaSource=&traceId= CFSSL是CloudFlare公司提供的PKI/TLS工具,是一组使用Go语言开发的开源工具。CloudFlare公司的主营业务之一就是提供网络安全服务

[转帖]kubernetes 证书合集

https://cloud.tencent.com/developer/article/2020655?areaSource=&traceId= 文章目录 PKI 证书 一共有多少证书? 为什么同一个“套”内的证书必须是同一个CA签署的? TLS bootstrapping kubelet证书为何不

[转帖]公钥基础设施(PKI,Public Key Infrastructure)闲谈

https://zhuanlan.zhihu.com/p/384436119 背景 在现实空间中,人类的活动范围和接触人的范围有限,人和人最初的信任是建立在小团体或部落内部。随着全球化进展,人类的活动已经遍布全球,通信极度发达,能够低延迟的在地球的两端进行通话,甚至是太空与地面的通话(参考:卫星互联

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

[转帖]awk提取某一行某一列的数据

https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打