OpenSSL
1. OpenSSL 使用
1.1 安装环境
Linux 系统一般自带 OpenSSL 工具:
[root@instance-fk6xgagd ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
Window 环境到官网下载 exe 应用工具,并将 exe 应用配置到系统环境变量 Path 路径中即可。
1.2 命令
OpenSSL 的命令可以分为以下3类
[root@instance-fk6xgagd ~]# openssl help
openssl:Error: 'help' is an invalid command.
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 rc5 rc5-cbc rc5-cfb
rc5-ecb rc5-ofb seed seed-cbc
seed-cfb seed-ecb seed-ofb zlib
2. 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 证书;
2.1 基于CA 的双向数字证书认证
各个服务都需要双向认证,所以每个服务都需要有自己的证书,证书是需要向 CA 申请的,所以我们要先制作 CA 根证书。
CA 证书的生成
- 先生成 CA 私钥,长度为 2048。
# openssl genrsa -out ca.key 2048
- 用私钥直接生成 CA 的根证书,证书的版本是 x509,过期时间 5000 天,使用者信息用的是主机名
/CN=k8s-master
openssl req -x509 -new -nodes -key ca.key -sub "/CN=k8s-master" -days 5000 -out ca.crt
ApiServer 证书生成
- 生成长度为 2048 的私钥
openssl genrsa -out server.key 2048
openssl req -new -key server.key -sub "/CN=k8s-master" -config master_ssl.cnf -out server.csr
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
ApiServer 启动的时候有下面 3 个核心参数:
- 提供 TLS 安全服务所需的证书(让别人验证自己的);
tls-cert-file :apiServer 自己的证书文件;
tls-private-key-file :apiServer 的私钥; - apiServer 提供给很多客户端用,每个客户端都需要自己的证书,这边指定了根证书,客户端必须是从该证书申请的才认可;
client-ca-file string :CA 根证书。
某个访问 apiServer 客户端证书的生成
openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -sub "/CN=k8s-master" -out cs_client.csr
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
3. 小结
TLS 的整个认证还是比较复杂的,OpenSSL 帮我们封装了很多内置算法,即便这样这个过程下来流程还是比较多,需要我们抽丝剥茧慢慢了解。