cfssl自签证书

什么是cfssl?

CloudFlare SSL,是由美国的一个叫CloudFlare的公司开发的一款开源的工具包。与OpenSSL类似,但是相比OpenSSL而言,cfssl是一个更轻量化、易于使用和理解的 PKI/TLS 解决方案,但是功能丰富性方面不如OpenSSL

安装cfssl

https://github.com/cloudflare/cfssl/releases 下载二进制包,主要是如下三个:

  • cfssl_1.6.4_linux_amd64:用于签发证书
  • cfssljson_1.6.4_linux_amd64:将cfssl签发生成的证书(json格式)变成文件
  • cfssl-certinfo_1.6.4_linux_amd64:验证查看证书信息

由于下载的是可执行文件,直接重命名放到系统到的执行文件目录并加上执行权限即可,比如:/usr/local/bin

shell 复制代码
[root@k8s-master packages]# cp cfssl_1.6.4_linux_amd64 /usr/local/bin/cfssl
[root@k8s-master packages]# cp cfssljson_1.6.4_linux_amd64 /usr/local/bin/cfssljson
[root@k8s-master packages]# cp cfssl-certinfo_1.6.4_linux_amd64 /usr/local/bin/cfssl-certinfo
[root@k8s-master packages]# chmod +x /usr/local/bin/cfssl
[root@k8s-master packages]# chmod +x /usr/local/bin/cfssljson
[root@k8s-master packages]# chmod +x /usr/local/bin/cfssl-certinfo
[root@k8s-master packages]# which cfssl
/usr/local/bin/cfssl
[root@k8s-master packages]# which cfssljson
/usr/local/bin/cfssljson
[root@k8s-master packages]# which cfssl-certinfo
/usr/local/bin/cfssl-certinfo

使用cfssl创建证书

创建CA根证书及其私钥

根证书及其私钥,也就是CA证书和CA证书的私钥,后续创建的所有证书都由它签名。CA根证书创建后一般命名为ca.pem,CA跟证书的私钥创建后一般命名为ca-key.pem。

相当于定一个小范围的"权威机构", 小范围内大家都认为这个权威机构是可信的。类似于CA

创建CA根证书及其私钥有如下两个步骤:

创建CA根证书签名请求文件ca-csr.json

CSR,即Certificate Sinature Requests,"证书签名请求"。CSR是提交给CA(证书颁发机构)的东西,CA会返回一个证书。

cfssl官网的样例:

shell 复制代码
{
    "hosts": [
        "example.com",
        "www.example.com"
    ],
    "CN": "www.example.com",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
        "C": "US",
        "L": "San Francisco",
        "O": "Example Company, LLC",
        "OU": "Operations",
        "ST": "California"
    }]
}

释义

"host":证书应该对其有效的域名列表

"CN":"Common Name","CN" 值被某些 CA 用来确定证书应该为哪个域生成

"names":每个name对象应该至少包含一个"C"、"L"、"O"、"OU"或"ST"值(或这些值的任何组合)。

  • "C": country
  • "L": locality or municipality (such as city or town name)
  • "O": organisation
  • "OU": organisational unit, such as the department responsible for owning the key; it can also be used for a "Doing Business As" (DBS) name
  • "ST": the state or province

综上所述,生成ca根证书的csr文件:ca-csr.json

shell 复制代码
{
    "hosts": [],
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
        "C": "CN",
        "L": "ShenZhen",
        "ST": "ShenZhen/GuangDong"
    }]
}

使用cfssl、cfssljson命令生成ca根证书及其私钥文件

命令如下:

shell 复制代码
[root@k8s-master conf_file]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

如上命令会生产三个文件:

  • ca.pem:ca根证书文件
  • ca-key.pem:ca根证书的私钥文件
  • ca.csr:

注意:

  1. cfssl的输出为cfssljson的输入,直接生成ca根证书及其私钥
  2. "ca"是自定义文件命名
  3. "ca.pem"是ca根证书,"ca-key.pem"是ca根证书的私钥。使用这两个文件就可以用来签发其他证书文件了。

根据CA根证书及其私钥签名生成其它证书及其私钥

利用CA根证书及其私钥文件签发生成其它证书及其私钥,分为以下3个步骤执行操作:

创建CA根证书配置文件

CA根证书配置文件,一般命名为ca-config.json,它用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等),后续在签名其它证书时需要指定特定场景 (profile)。

ca-config.json的配置如下

shell 复制代码
{
  "signing":{
    "default":{
      "expiry":"175200h"
    },
    "profiles":{
      "kubernetes":{
        "expiry":"175200h",
        "usages":[
          "signing",
          "key encipherment",
          "server auth",
          "client auth"
        ]
      }
    }
  }
}

释义

"expiry": 175200h表示生成的证书20年有效期

"profiles": 指定证书使用场景,下面的kubernetes是一个场景名称,后续签名生成证书及其私钥时需要指定该场景(profile)名称

"signing":表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE

"server auth":表示client可以用该证书对server提供的证书进行验证

"client auth":表示server可以用该证书对client提供的证书进行验证

创建目标证书签名请求文件

想要为www.zptest.com域名生成一个证书,需要先创建一个证书签名请求文件,由ca根证书及其私钥来签名生成。

证书签名请求文件:www.zptest.com-csr.json

shell 复制代码
{
    "hosts": [],
    "CN": "www.zptest.com",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
        "C": "CN",
        "L": "ShenZhen",
        "ST": "ShenZhen/GuangDong"
    }]
}

注意:

"CN": 不能错,如果要为某域名创建证书,则必须为某域名

根据CA根证书及其私钥签名生成目标证书和私钥

shell 复制代码
[root@k8s-master conf_file]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes www.zptest.com-csr.json | cfssljson -bare www.zptest.com
2023/10/10 17:57:56 [INFO] generate received request
2023/10/10 17:57:56 [INFO] received CSR
2023/10/10 17:57:56 [INFO] generating key: rsa-2048
2023/10/10 17:57:56 [INFO] encoded CSR
2023/10/10 17:57:56 [INFO] signed certificate with serial number 586881673865669754505692346946839988455819800365
2023/10/10 17:57:56 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").  #告警可忽略

注意:

"www.zptest.com-csr.json" 是证书的名称,可以自定义

校验证书

校验证书有多种方式,如下介绍2种:

使用openssl校验证书

shell 复制代码
[root@k8s-master conf_file]# openssl x509 -noout -text -in  www.zptest.com.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            66:cc:af:36:93:57:b9:54:64:c0:13:e0:43:a7:8d:7b:a4:59:6f:2d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=ShenZhen/GuangDong, L=ShenZhen, CN=kubernetes
        Validity
            Not Before: Oct 10 09:53:00 2023 GMT
            Not After : Oct  5 09:53:00 2043 GMT
        Subject: C=CN, ST=ShenZhen/GuangDong, L=ShenZhen, CN=www.zptest.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c0:44:b6:f5:b1:60:89:2f:31:d3:6c:7e:9f:dd:
                    3f:f7:b8:8f:d1:62:70:5d:4a:e8:66:c6:70:1f:9a:
                    54:c8:f5:d3:3c:f3:6c:ba:b1:10:97:72:36:91:88:
                    e3:77:f1:78:ab:3a:73:59:83:3f:ff:20:92:7a:3a:
                    1c:44:f9:c1:0a:07:e8:ee:96:9f:6d:70:27:03:c4:
                    71:b3:32:1f:16:90:3b:90:0d:b6:24:f9:82:e1:62:
                    0a:32:ed:2f:68:28:3c:72:a5:31:2c:b1:7d:f1:94:
                    a7:77:f8:10:b1:b5:83:3e:d8:c2:c7:1d:e5:fb:d6:
                    00:14:56:e6:e5:21:31:20:d1:99:5a:fc:63:54:8d:
                    fc:7d:af:cc:79:08:b8:fb:2a:14:0b:15:4d:df:e4:
                    c3:31:ce:9b:75:65:55:d6:a1:04:e4:31:98:2f:de:
                    ea:84:1e:09:11:54:36:eb:5a:40:f5:e4:ea:74:45:
                    e2:2e:8a:d9:c1:ac:49:a6:11:ca:01:c3:56:8c:b2:
                    a6:5c:3b:93:06:03:7b:d4:3f:0d:8c:b7:9e:46:b6:
                    93:04:2a:e1:24:63:e9:c3:84:c4:2f:14:25:f5:f9:
                    ce:2b:57:21:c5:c7:7f:f9:5b:cb:81:c2:ef:f2:33:
                    da:98:b4:63:9a:92:c7:a5:25:57:e9:54:bb:6c:49:
                    5a:d3
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                D7:D3:73:39:62:BF:B5:60:6E:8E:56:3B:67:76:15:C9:45:89:83:DD
            X509v3 Authority Key Identifier:
                keyid:41:21:49:3C:16:56:2A:E1:F8:9D:20:D6:32:B1:98:E0:C9:FD:5C:DD

    Signature Algorithm: sha256WithRSAEncryption
         0e:6a:a3:1f:cf:6f:c5:5e:49:29:06:89:8d:06:10:ab:bd:d2:
         ee:e2:e5:67:47:75:1b:d5:85:51:1a:fb:0e:6c:1b:4d:bf:3e:
         af:83:4f:3b:f0:3e:bd:ef:89:4b:a5:64:e6:9e:fd:b4:89:0a:
         ff:3e:ed:4f:99:0e:40:3c:8f:ee:ea:0e:07:23:d7:31:31:a9:
         10:99:da:b7:5d:ba:3f:9a:00:3c:01:53:15:60:bc:95:0c:cc:
         58:fe:b6:d8:a9:c7:99:88:ec:7e:d1:d9:a3:27:f5:f6:0d:28:
         96:b6:7e:6c:6a:ed:13:e9:45:ff:2f:c5:4d:f5:0c:6a:c4:c4:
         03:a3:bf:79:79:ec:21:70:82:66:d3:6b:88:18:3b:4d:be:f2:
         56:65:e0:b2:a7:01:ec:62:87:83:d4:98:4f:4f:f9:12:c8:f2:
         fd:6b:1b:cb:55:1e:e8:5e:ff:5f:2e:89:1c:2c:16:4d:fa:4e:
         8c:c5:90:b5:db:aa:f2:9c:58:fd:2c:82:56:3e:78:b8:2d:cd:
         75:d3:a6:bc:2b:cb:a0:84:40:65:ed:93:e4:da:9a:cb:38:3d:
         7c:53:04:68:e5:3a:f6:de:16:4c:56:81:be:12:2a:6d:67:e5:
         e6:91:49:cb:a5:06:b9:44:ae:5c:ea:66:d6:e6:8c:a8:98:d5:
         63:a7:00:af

输出释义

Issuer:是证书签发机构(即CA)相关的信息,应该和ca-csr.json的"names"字段和"CN"字段匹配

Validity:该证书的有效期

Subject:是本证书相关的信息,应该和www.zptest.com-csr.json中"names"字段和"CN"字段匹配

使用cfssl-centinfo校验证书

shell 复制代码
[root@k8s-master conf_file]# cfssl-certinfo -cert www.zptest.com.pem
{
  "subject": {
    "common_name": "www.zptest.com",
    "country": "CN",
    "locality": "ShenZhen",
    "province": "ShenZhen/GuangDong",
    "names": [
      "CN",
      "ShenZhen/GuangDong",
      "ShenZhen",
      "www.zptest.com"
    ]
  },
  "issuer": {
    "common_name": "kubernetes",
    "country": "CN",
    "locality": "ShenZhen",
    "province": "ShenZhen/GuangDong",
    "names": [
      "CN",
      "ShenZhen/GuangDong",
      "ShenZhen",
      "kubernetes"
    ]
  },
  "serial_number": "586881673865669754505692346946839988455819800365",
  "not_before": "2023-10-10T09:53:00Z",
  "not_after": "2043-10-05T09:53:00Z",
  "sigalg": "SHA256WithRSA",
  "authority_key_id": "41:21:49:3C:16:56:2A:E1:F8:9D:20:D6:32:B1:98:E0:C9:FD:5C:DD",
  "subject_key_id": "D7:D3:73:39:62:BF:B5:60:6E:8E:56:3B:67:76:15:C9:45:89:83:DD",
  "pem": "-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIUZsyvNpNXuVRkwBPgQ6eNe6RZby0wDQYJKoZIhvcNAQEL\nBQAwUjELMAkGA1UEBhMCQ04xGzAZBgNVBAgTElNoZW5aaGVuL0d1YW5nRG9uZzER\nMA8GA1UEBxMIU2hlblpoZW4xEzARBgNVBAMTCmt1YmVybmV0ZXMwHhcNMjMxMDEw\nMDk1MzAwWhcNNDMxMDA1MDk1MzAwWjBWMQswCQYDVQQGEwJDTjEbMBkGA1UECBMS\nU2hlblpoZW4vR3VhbmdEb25nMREwDwYDVQQHEwhTaGVuWmhlbjEXMBUGA1UEAxMO\nd3d3LnpwdGVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA\nRLb1sWCJLzHTbH6f3T/3uI/RYnBdSuhmxnAfmlTI9dM882y6sRCXcjaRiON38Xir\nOnNZgz//IJJ6OhxE+cEKB+julp9tcCcDxHGzMh8WkDuQDbYk+YLhYgoy7S9oKDxy\npTEssX3xlKd3+BCxtYM+2MLHHeX71gAUVublITEg0Zla/GNUjfx9r8x5CLj7KhQL\nFU3f5MMxzpt1ZVXWoQTkMZgv3uqEHgkRVDbrWkD15Op0ReIuitnBrEmmEcoBw1aM\nsqZcO5MGA3vUPw2Mt55GtpMEKuEkY+nDhMQvFCX1+c4rVyHFx3/5W8uBwu/yM9qY\ntGOakselJVfpVLtsSVrTAgMBAAGjfzB9MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUE\nFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU\n19NzOWK/tWBujlY7Z3YVyUWJg90wHwYDVR0jBBgwFoAUQSFJPBZWKuH4nSDWMrGY\n4Mn9XN0wDQYJKoZIhvcNAQELBQADggEBAA5qox/Pb8VeSSkGiY0GEKu90u7i5WdH\ndRvVhVEa+w5sG02/Pq+DTzvwPr3viUulZOae/bSJCv8+7U+ZDkA8j+7qDgcj1zEx\nqRCZ2rdduj+aADwBUxVgvJUMzFj+ttipx5mI7H7R2aMn9fYNKJa2fmxq7RPpRf8v\nxU31DGrExAOjv3l57CFwgmbTa4gYO02+8lZl4LKnAexih4PUmE9P+RLI8v1rG8tV\nHuhe/18uiRwsFk36TozFkLXbqvKcWP0sglY+eLgtzXXTprwry6CEQGXtk+Tamss4\nPXxTBGjlOvbeFkxWgb4SKm1n5eaRSculBrlErlzqZtbmjKiY1WOnAK8=\n-----END CERTIFICATE-----\n"
}

输出释义

Issuer:是证书签发机构(即CA)相关的信息,应该和ca-csr.json的"names"字段和"CN"字段匹配

Subject:是本证书相关的信息,应该和www.zptest.com-csr.json中"names"字段和"CN"字段匹配

知识补充

两个通识

  1. 公钥加密的数据,私钥可以解密;私钥加密的数据,公钥无法解密。
  2. 公钥谁都可以拿,是公开的,私钥要server端安全保管,是私密的。

"CA",(Certificate Authority,证书颁发机构)是一个负责签署并颁发数字证书的实体。数字证书(也称为 SSL/TLS 证书)用于验证网站或服务的身份,确保网络传输的数据加密和安全。

"证书",certificate,是CA(证书颁发机构)经过认证证书申请者身份的合法性,利用其机构的权威性和公众信服力向第三方颁发的一种有效证,使一方凭借对CA的信任,进而对持有证书的另一方也持有信任 。

浏览器访问server的认证过程

当用户通过浏览器访问网站时,网站的server会先将证书发送给用户的浏览器,浏览器会解析证书获取证书的颁发机构、是否有效等信息,浏览器或操作系统会内置一些公信力强的CA,浏览器会认为只要是这些CA颁发的证书,则会认为网站是经过合法认证的。相当于经过了第三方的权威认证。

加密和解密过程:

  1. 服务器具有一对公钥和私钥,公钥包含在证书中,私钥则妥善存储在服务器上。

  2. 当客户端(通常是浏览器)访问服务器时,服务器会将证书(包含公钥)发送给客户端。

  3. 客户端验证证书的有效性和 CA 的可信度,在确认证书安全之后进行下一步操作。

  4. 客户端使用证书中的公钥创建一个会话密钥(Session Key),这是一个临时用于对称加密的密钥。

  5. 客户端使用证书的公钥加密会话密钥并将其发送回服务器。

  6. 服务器使用证书的私钥对接收到的会话密钥进行解密,得到会话秘钥。

  7. 现在,客户端和服务器都具有相同的会话密钥。他们可以使用这个对称的会话密钥加密和解密之后发送的所有数据。

    特别注意,客户端和服务端对数据进行加密和解密使用的协商后的会话秘钥而不是公钥或者私钥。

附录

参考:

  1. https://segmentfault.com/a/1190000038276488#item-3-4
  2. https://github.com/cloudflare/cfssl/wiki/Creating-a-new-CSR
相关推荐
hotlinhao2 天前
阿里云IIS虚拟主机部署ssl证书
阿里云·云计算·ssl
技术-hxy2 天前
由于centos停更,yum、docker等不支持,采用阿里云仓库搭建K8S
centos·k8s
白竹2 天前
【pip install报SSL类错误】
python·ssl·pip
鸠摩智首席音效师2 天前
如何在 Elasticsearch 中配置 SSL / TLS ?
elasticsearch·ssl
网安-轩逸3 天前
网络安全协议之比较(SSH、PKI、SET、SSL)
web安全·ssh·ssl
腾科张老师4 天前
握手协议是如何在SSL VPN中发挥作用的?
网络·网络协议·ssl
KubeSphere 云原生4 天前
云原生周刊:Kubernetes v1.32 要来了
云计算·k8s·容器平台·kubesphere
luciferau4 天前
Bufferevent and SSL
网络·网络协议·ssl
JaneJiazhao4 天前
HTTPSOK ---助力阿里云免费 SSL 证书自动续期
阿里云·https·ssl
帅崽qwq5 天前
给网站免费升级https协议
https·ssl·网站安全