• 【博客539】使用openssl手动为k8s集群签发证书


    使用openssl手动为k8s集群签发证书

    创建ca私钥和ca证书

    1、生成ca私钥:生成一个 2048 位的 ca.key 文件

    openssl genrsa -out ca.key 2048

    2、基于ca私钥,生成根(root)证书:在 ca.key 文件的基础上,生成 ca.crt 文件

    openssl req -x509 -new -nodes -key ca.key -subj “/CN=${MASTER_IP}” -days 10000 -out ca.crt

    生成应用的私钥和csr

    1、生成应用私钥:生成一个 2048 位的 server.key 文件:

    openssl genrsa -out server.key 2048

    2、基于应用私钥,创建一个用于生成证书签名请求(CSR)的配置文件。

    openssl req -new -key server.key -out server.csr -config csr.conf

    保存文件(例如:csr.conf)前,记得用真实值替换掉尖括号中的值(例如:)。 注意:MASTER_CLUSTER_IP 就像前一小节所述,它的值是 API 服务器的服务集群 IP。 下面的例子假定你的默认 DNS 域名为 cluster.local。

    csr.conf example:

    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    req_extensions = req_ext
    distinguished_name = dn
    
    [ dn ]
    C = 
    ST = 
    L = 
    O = 
    OU = 
    CN = 
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = kubernetes
    DNS.2 = kubernetes.default
    DNS.3 = kubernetes.default.svc
    DNS.4 = kubernetes.default.svc.cluster
    DNS.5 = kubernetes.default.svc.cluster.local
    IP.1 = 
    IP.2 = 
    
    [ v3_ext ]
    authorityKeyIdentifier=keyid,issuer:always
    basicConstraints=CA:FALSE
    keyUsage=keyEncipherment,dataEncipherment
    extendedKeyUsage=serverAuth,clientAuth
    subjectAltName=@alt_names
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    使用ca私钥和ca证书为应用的csr签发应用的证书

    基于 ca.key、ca.crt 和 server.csr 等三个文件生成服务端证书:

    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key
    -CAcreateserial -out server.crt -days 10000
    -extensions v3_ext -extfile csr.conf -sha256

    查看结果

    查看证书签名请求:

    openssl req -noout -text -in ./server.csr

    查看证书:

    openssl x509 -noout -text -in ./server.crt

    使用

    此时需要与apiserver通信的组件可以使用server.crt来验证自己的身份

    各类文件格式

    私钥文件通常以 .key 结尾,证书文件通常以 .crt 结尾,证书签名请求文件通常以 .csr 结尾。
    不论什么后缀的文件,其实都是文本格式的文件。

    证书文件的开头和结尾是这样子的:

    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    
    • 1
    • 2
    • 3

    私钥文件的开头和结尾是这样的:

    -----BEGIN RSA PRIVATE KEY-----
    ...
    -----END RSA PRIVATE KEY-----
    
    • 1
    • 2
    • 3

    证书签名请求文件的开头和结尾是这样的:

    -----BEGIN CERTIFICATE REQUEST-----
    ...
    -----END CERTIFICATE REQUEST-----
    
    • 1
    • 2
    • 3

    key,csr,crt文件的作用

    key:私钥,openssl格式,通常是rsa算法

    csr(Certificate Signing Request):证书请求文件,用于申请证书,含有公钥信息。在申请的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥

    crt:证书文件,是签署人用自己的 key 给你签署的凭证。可以自签署

    为什么生成密钥的时候只有私钥,没有公钥

    RSA密钥都是一对,可这里只生成了私钥,那公钥在哪呢?
    实际上公钥是根据私钥生成的,由于RSA非对称特性,私钥算出公钥很容易,公钥算出私钥就很难。

    生成公钥的指令为:

    openssl rsa -in ca.key -pubout -out ca.pub

    生成应用的csr的时候,为什么需要使用应用的私钥

    其实csr里需要的是公钥,创建证书请求时需要提供私钥,这个私钥的作用是为了提供公钥

    生成ca证书的时候,为什么需要使用ca私钥

    其实生成ca.crt里需要的也是公钥,创建ca证书时需要提供私钥,这个私钥的作用是为了提供公钥

    签发证书的时候,为什么要同时用到ca.key和ca.crt

    使用CA的证书,这用来宣示此服务器证书是谁签的;
    使用CA的私钥,这用来生成摘要保证签名内容不被篡改。

    创建所需条件整理

    • 1、创建证书需要:私钥(其实为了提取公钥)

    • 2、创建csr需要:私钥(其实为了提取公钥)+ csr请求配置文件

    • 3、签署csr需要:csr + ca私钥 + ca证书

    流程梳理

    • 1、生成ca的私钥

    • 2、利用ca的私钥(为了提取公钥)生成ca证书,证书包含了公钥信息和ca机构信息

    • 3、生成server的私钥

    • 4、利用server的私钥(为了提取公钥)生成server的csr,csr包含了server公钥信息和server的身份信息

    • 5、使用server的csr,还有ca私钥,ca证书来生成server证书,其实签名只需要ca私钥就可以,假设ca证书是为了加入ca证书里的ca机构信息,才知道证书是谁签署的

    证书自签署和认证原理

    证书自签署:

    我们手动生成ca私钥,然后使用ca私钥生成ca证书,证书里包含了从私钥中提取出来的公钥信息和ca机构的信息。再手动生成应用私钥,然后使用应用私钥和csr配置文件生成csr,csr里包含了应用的公钥信息和应用的身份信息。使用ca私钥和ca证书来签署csr,从而得到了server证书,里面包含了应用的公钥和身份信息,以及对应用的公钥和身份信息进行hash之后,使用ca私钥对hash的值进行签名后的一个签名值。

    认证原理:

    当需要验证对方身份的时候,拿到对方的证书,然后对签名值使用ca的公钥进行解密,得到加密前的内容,也就是对应用的公钥和身份信息进行hash后的hash值,此时再对证书里的应用的公钥和身份信息使用相同的hash算法,得到一个hash值,与前面那一步解密出来的hash值进行比较,如果一致,就证明身份可靠

    签名和认证原理图:
    在这里插入图片描述

  • 相关阅读:
    LeetCode刷题系列 -- 652. 寻找重复的子树
    【解锁未来】探索Web3的无限可能性-01
    探究 CoreData 使用索引(Index)机制加速查表究竟如何实现?
    【种类并查集】洛谷P1525 [NOIP2010 提高组] 关押罪犯
    JMSA(Jacobian Saliency Map Attack)算法源码解析
    记录工作过程中一次业务优化
    【JavaWeb从入门到实战】MySQL进阶上篇之约束&数据库设计
    Apollo配置更新通知
    【C++】继承- 赋值兼容转换、虚基表
    怎么用光碟重装系统
  • 原文地址:https://blog.csdn.net/qq_43684922/article/details/127941940