TLS 基础
docker swarm 集群间为了保证通信安全,使用TLS进行安全加固。分析TLS安全加固时需要一些网络安全背景知识。
数字签名:《数字证书及CA的扫盲介绍》、《数字签名是什么》
CA和证书:《数字证书(Digital Certificate)与数字签名(Digital Signature)》、《OpenSSL 与 SSL 数字证书概念贴》、《基于OpenSSL自建CA和颁发SSL证书》
SSL/TLS:《SSL/TLS原理详解》、《grpc tls认证传输》以及很全的关于TLS 证书的文档(英文)《Survival guides - TLS/SSL and SSL (X.509) Certificates》
数字签名过程
发送人将发送内容使用HASH算法生成一个内容摘要(digest) —> 内容摘要(digest)使用私钥进行加密—>生成数字签名(signature) —> 数字签名(signature)附在信件下面 —> 将信件发送给收件人 —-> 收件人收到信件,并使用发送人的公钥进行解密:证明信件来自于发件人 —> 收件人使用同种Hash算法计算发送内容的摘要(digest),并和解密得到的digest进行对比:一致则证明信件内容没有别修改
一次数字签名涉及到一个哈希函数、发送者的公钥、发送者的私钥(不在签名里)。
数字签名使用私钥对内容摘要用私钥进行加密;加密通信过程中,使用公钥加密,私钥进行解密
数字中心(CA)
验证公钥的正确性,为公钥做认证,使用自己的私钥为其他公钥和一些信息进行加密; —> 生成”数字证书”Digital Certificate。
签名证书
CA进行对公钥和其他一些内容进行数字签名的信件或消息。
证书常用扩展名
- .crt 证书文件 ,可以是DER(二进制)编码的,也可以是PEM( ASCII (Base64) )编码的 ,在类unix系统中比较常见
- .cer 也是证书 常见于Windows系统 编码类型同样可以是DER或者PEM的,windows 下有工具可以转换crt到cer
- .csr 证书签名请求 一般是生成请求以后发送给CA,然后CA会给你签名并发回证书.key 一般公钥或者密钥都会用这种扩展名,可以是DER编码的或者是PEM编码的 查看DER编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform DER -noout -text -in xxx
- .key 查看PEM编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform PEM -noout -text -in xxx.key
swarmkit TLS加固分析
概述
swarm 集群间个节点通信,先进行身份验证,再进行加密通信。
执行命令:docker swarm init --advertise-addr
在 ${docker-root}/ /swarm/certificates/ 目录下生成四个文件
[root@localhost certificates]# ls
swarm-node.crt swarm-node.key swarm-root-ca.crt swarm-root-ca.key
文件说明:
swarm-root-ca.crt:CA的自签名证书(执行docker swarm init 节点会启动CA(证书中心)线程,为其他节点颁发签名证书);
**swarm-root-ca.key:**CA的私钥;
swarm-node.crt:这个文件不是一个证书而是一个证书集合,包含:当前节点证书和证书中心CA的证书;包含CA的证书的目的是为了;
swarm-node.key:当前节点的私钥;
docker swarm (LINUX下)的证书使用pem格式,查看证书信息
[root@localhost certificates]# openssl x509 -in swarm-node.crt -inform pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
24:45:68:8a:07:b7:e2:e1:2c:51:c0:be:43:da:1f:54:fe:09:4e:47
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN=swarm-ca //证书颁发结构
Validity
Not Before: Feb 11 00:24:00 2018 GMT
Not After : May 12 01:24:00 2018 GMT
Subject: O=cvp2afdvt625g5ddhds5t9ldq, OU=swarm-manager, CN=83lp2qgjndo09mgpf96k4jkom //拥有者信息
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:9e:27:3c:81:2c:ea:99:f4:0c:45:c8:96:a4:7d:
94:5f:58:14:a9:98:61:a3:31:0a:ab:16:b5:7c:31:
31:a1:57:57:60:47:71:77:64:e6:99:53:25:63:02:
c0:b7:7f:1a:eb:78:92:9b:4b:94:a8:50:a2:f5:c2:
8a:1b:81:d1:77
ASN1 OID: prime256v1
由上信息,我们可以看出签名证书中保护多种信息,比如证书持有者、证书颁发者、证书的公钥的散列值等,具体证书格式和内容参考文章《OpenSSL 与 SSL 数字证书概念贴》;
一个swarm证书包含内容
//issueRenewCertificate 函数
CSR: csr,
CN: node.ID,
Role: node.Spec.Role,
Status: api.IssuanceStatus{
State: api.IssuanceStateRenew,}
node.ID在创建证书前被nodeID = identity.NewID()
创建并被包含在证书里面,所以docker swarm 集群里节点的nodeID是由leader节点创建。
docker swarm .key文件保留着当前节点的私钥,查看私钥