什么是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:
注意:
- cfssl的输出为cfssljson的输入,直接生成ca根证书及其私钥
- "ca"是自定义文件命名
- "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"字段匹配
知识补充
两个通识
- 公钥加密的数据,私钥可以解密;私钥加密的数据,公钥无法解密。
- 公钥谁都可以拿,是公开的,私钥要server端安全保管,是私密的。
"CA",(Certificate Authority,证书颁发机构)是一个负责签署并颁发数字证书的实体。数字证书(也称为 SSL/TLS 证书)用于验证网站或服务的身份,确保网络传输的数据加密和安全。
"证书",certificate,是CA(证书颁发机构)经过认证证书申请者身份的合法性,利用其机构的权威性和公众信服力向第三方颁发的一种有效证,使一方凭借对CA的信任,进而对持有证书的另一方也持有信任 。
浏览器访问server的认证过程:
当用户通过浏览器访问网站时,网站的server会先将证书发送给用户的浏览器,浏览器会解析证书获取证书的颁发机构、是否有效等信息,浏览器或操作系统会内置一些公信力强的CA,浏览器会认为只要是这些CA颁发的证书,则会认为网站是经过合法认证的。相当于经过了第三方的权威认证。
加密和解密过程:
-
服务器具有一对公钥和私钥,公钥包含在证书中,私钥则妥善存储在服务器上。
-
当客户端(通常是浏览器)访问服务器时,服务器会将证书(包含公钥)发送给客户端。
-
客户端验证证书的有效性和 CA 的可信度,在确认证书安全之后进行下一步操作。
-
客户端使用证书中的公钥创建一个会话密钥(Session Key),这是一个临时用于对称加密的密钥。
-
客户端使用证书的公钥加密会话密钥并将其发送回服务器。
-
服务器使用证书的私钥对接收到的会话密钥进行解密,得到会话秘钥。
-
现在,客户端和服务器都具有相同的会话密钥。他们可以使用这个对称的会话密钥加密和解密之后发送的所有数据。
特别注意,客户端和服务端对数据进行加密和解密使用的协商后的会话秘钥而不是公钥或者私钥。
附录
参考: