如需转载,请根据 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 许可,附上本文作者及链接。
本文作者: 执笔成念
作者昵称: zbcn
本文链接: https://1363653611.github.io/zbcn.github.io/2021/01/18/HTTPS_04openSSL/
OpenSSL
OpenSSL 是一个开源的软件库,里面包含了SSL协议库、应用程序以及密码算法库。通过这个工具我们可以实现自签名证书,也可以更好的了解证书生成的过程。
OpenSSL 使用
安装环境
Linux 系统一般自带 OpenSSL 工具:
1 | [root@instance-fk6xgagd ~]# openssl version |
2 | OpenSSL 1.0.2k-fips 26 Jan 2017 |
Window 环境到官网下载 exe 应用工具,并将 exe 应用配置到系统环境变量 Path 路径中即可。
命令
OpenSSL 的命令可以分为以下3类
- Standard commands :一些标准的工具集合(ca证书工具等);
- Message Digest commands: 摘要生成的命令工具(哈希算法等);
- Cipher commands :加密工具(对称非对称算法等)。
1 | [root@instance-fk6xgagd ~]# openssl help |
2 | openssl:Error: 'help' is an invalid command. |
3 | |
4 | Standard commands |
5 | asn1parse ca ciphers cms |
6 | crl crl2pkcs7 dgst dh |
7 | dhparam dsa dsaparam ec |
8 | ecparam enc engine errstr |
9 | gendh gendsa genpkey genrsa |
10 | nseq ocsp passwd pkcs12 |
11 | pkcs7 pkcs8 pkey pkeyparam |
12 | pkeyutl prime rand req |
13 | rsa rsautl s_client s_server |
14 | s_time sess_id smime speed |
15 | spkac ts verify version |
16 | x509 |
17 | |
18 | Message Digest commands (see the `dgst' command for more details) |
19 | md2 md4 md5 rmd160 |
20 | sha sha1 |
21 | |
22 | Cipher commands (see the `enc' command for more details) |
23 | aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb |
24 | aes-256-cbc aes-256-ecb base64 bf |
25 | bf-cbc bf-cfb bf-ecb bf-ofb |
26 | camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb |
27 | camellia-256-cbc camellia-256-ecb cast cast-cbc |
28 | cast5-cbc cast5-cfb cast5-ecb cast5-ofb |
29 | des des-cbc des-cfb des-ecb |
30 | des-ede des-ede-cbc des-ede-cfb des-ede-ofb |
31 | des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb |
32 | des-ofb des3 desx idea |
33 | idea-cbc idea-cfb idea-ecb idea-ofb |
34 | rc2 rc2-40-cbc rc2-64-cbc rc2-cbc |
35 | rc2-cfb rc2-ecb rc2-ofb rc4 |
36 | rc4-40 rc5 rc5-cbc rc5-cfb |
37 | rc5-ecb rc5-ofb seed seed-cbc |
38 | seed-cfb seed-ecb seed-ofb zlib |
TLS服务认证案例
Kubernets 是一个开源的容器编排工具,它内部包含了多个职能组件。Kubernetes 提供了基于 CA 签名的双向认证和基于 HTTP BASE 或 TOKEN 的认证方式,其中 CA 是安全性最高的一种。(不了解 Kubernetes 的把他想成一个多组件服务的系统即可)
Kubernetes 有上图那么多组件,具体每个组件的用途我们这里不用去了解,其中 ApiServer 是一个核心服务。
图中服务需要的证书:
- Kube-APIserver对外提供服务,要有一套 kube-apiserver server 证书;
- kube-scheduler、kube-controller-manager、kube-proxy、kubelet;和其他可能用到的组件,需要访问 kube-APIserver,要有一套 kube-APIserver client 证书;
- kube-controller-manager 要生成服务的 service account,要有一对用来签署 service account 的证书(CA证书);
- kubelet 对外提供服务,要有一套 kubelet server 证书;
- kube-APIserver 需要访问 kubelet,要有一套 kubelet client 证书;
基于CA 的双向数字证书认证
各个服务都需要双向认证,所以每个服务都需要有自己的证书,证书是需要向 CA 申请的,所以我们要先制作 CA 根证书。
CA 证书的生成
先生成根证书,这个根证书后续将用于为每个组件生成属于他们的证书。
先生成 CA 私钥,长度为 2048。
1
openssl genrsa -out ca.key 2048
用私钥直接生成 CA 的根证书,证书的版本是 x509,过期时间 5000 天,使用者信息用的是主机名
/CN=k8s-master
1 | openssl req -x509 -new -nodes -key ca.key -sub "/CN=k8s-master" -days 5000 -out ca.crt |
ApiServer 证书生成
- 生成长度为 2048 的私钥
1 | openssl genrsa -out server.key 2048 |
- 通过配置文件创建 csr(证书请求文件)
1 | openssl req -new -key server.key -sub "/CN=k8s-master" -config master_ssl.cnf -out server.csr |
其中 master_ssl.cnf 文件主要包含了请求主体的一些基础信息,这边主要是服务器所在节点的主机名,IP 地址。这些信息后面也会生成到证书里面,像 IP 地址后续也可以作为校验使用。
- 通过 csr 文件生成最终的 crt 证书:
1 | openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt |
生成证书的时候都需要借助 CA ,CA用自己的私钥签名生成证书,把公钥开放出去,供验证者使用。
到此,我们已经总的已经生成了 5 个文件,回顾下它们的作用:
- ca.key:为了生成 CA 根证书;
- ca.crt:根证书,为了给后续的其它组件服务颁发证书用的;
- server.key:为了生成 apiServer 证书;
- server.csr:为了生成证书请求文件(这边没有直接通过私钥生成证书,而是多了一个 CSR 的环节);
- server.crt:最终 apiServer 的证书。
ApiServer 启动的时候有下面 3 个核心参数:
- 提供 TLS 安全服务所需的证书(让别人验证自己的);
tls-cert-file :apiServer 自己的证书文件;
tls-private-key-file :apiServer 的私钥; - apiServer 提供给很多客户端用,每个客户端都需要自己的证书,这边指定了根证书,客户端必须是从该证书申请的才认可;
client-ca-file string :CA 根证书。
某个访问 apiServer 客户端证书的生成
1 | openssl genrsa -out cs_client.key 2048 |
2 | openssl req -new -key cs_client.key -sub "/CN=k8s-master" -out cs_client.csr |
3 | openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out cs_client.crt |
依然是生成自己的私钥,证书请求CSR文件,后面生成最终的证书需要借助上面的 CA 私钥 和 CA 根证书。
这边一个组件的双向证书都生成了,其它组件就不一一举例。
小结
TLS 的整个认证还是比较复杂的,OpenSSL 帮我们封装了很多内置算法,即便这样这个过程下来流程还是比较多,需要我们抽丝剥茧慢慢了解。