1. CA是什么?
- CA是Certificate Authority的简写,从字面意思翻译过来是凭证管理中心,认证授权。
- 它有点类似我们生活中的身份证颁发机构,这里的CA就相当于生活中颁发身份证的机构。
- 不同于生活中的颁发机构,这里的CA是给服务器颁发证书。颁发证书的目的同生活中的办理身份证的目的类似,都是为了证明一件事,生活中的身份证可以证明我们是一个合法的公民,而服务器颁发证书的目的也是证明我们服务是一个合法的服务器,
换句话说就是有了证书我们就可以清楚知道我们访问的服务器到底是不是我们真正想访问的服务器。从而识别我们访问的服务器的真假。
2.CA证书的作用
- 证书的作用就是为了验证其服务器的真实合法性,以及传输服务端的公钥的作用。
而服务器的公钥就是用来客户端向服务端发送随机密码,用来加密随机密码的作用,从而实现,只有服务端可以拿到这个随机密码的作用,实现安全加密通信。
3.openssl 简介
- 在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
- openssl是web安全通信的基石,没有openssl,可以说我们的信息都是在裸奔。要想了解openssl,有几个前置的概念需要先熟悉一下。
4.SSL
- SSL的全名叫做secure socket layer(安全套接字层),最开始是由一家叫网景的互联网公司开发出来,主要是防止信息在互联网上传输的时候不被窃听或者篡改,后来网景公司提交SSL给ISOC组织做标准化,改名为TLS。
- SSL如何保护数据
SSL保护数据的原理可以分为三部分
1)认证用户和服务器,确保数据发送到正确的客户端和服务器;
2)加密数据以防止数据中途被窃取;
3)维护数据的完整性,确保数据在传输过程中不被改变。
CA证书
- 服务端==ca密钥(ca-key.pem) 》》ca证书 (ca.pem )
》》—服务器私钥(server-key.pem)》》服务器私钥签名(server.csr)》》最后通过ca密钥、ca证书、服务端私钥签名-生成服务端证书(server-cert.pem) - 客户端==私钥(key.pem )》》私钥签名(client.csr)》》ca 密钥》》ca密钥证书》》客户端签名证书(cert.pem)
- 服务端签名证书server-cert.pem----(ca 密钥 、 ca 证书、服务端签名)
- 客户端签名证书cert.pem --------(ca 密钥 、 ca 证书、服务端签名)
5.Docker-TLS 加密通讯
- 为了防止链路劫持、会话劫持等问题导致Docker通信时被中间人攻击,c/s两端应该通过加密方式通讯。
5.1 服务端配置
yum install openssl -y
mkdir tls
cd /tls
hostnamectl set-hostname master
su
vim /etc/hosts
127.0.0.1 master
//创建ca密钥
openssl genrsa -aes256 -out ca-key.pem 4096 //输入123123
#4096 是密钥长度
//创建ca证书
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem //输入123123
#req 是指一个请求,这里的意思是指发送一个请求
#-new 是指一个新的请求 一般搭配 x509,输出一个x509结构,而不是一个cert. req。
#-subj 添加附加信息到证书里
# /CN* 指任意IP地址
#sha256 是单向加密算法 SHA256算法使用的哈希值长度是256位。这是一个抽象类。此类的唯一实现是SHA256Managed。
如果看命令详情后面加--help
//创建服务器私钥
openssl genrsa -out server-key.pem 4096
//签名私钥
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr
//使用ca证书与签名私钥和ca密钥生成服务器端证书,输入123123
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
## x509 标准
##-days 1000 :证书有效期1000天
##-req : 生产证书的命令
##-sha256 一种哈希密码
//生成客户端私钥
openssl genrsa -out key.pem 4096
//签名客户端
openssl req -subj "/CN=client" -new -key key.pem -out client.csr
//创建配置文件
echo extendedKeyUsage=clientAuth > extfile.cnf
#Auth授权
//客户端签名证书,输入123123,需要(签名客户端,ca证书,ca密钥)
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
//删除多余文件
rm -rf ca.srl client.csr extfile.cnf server.csr
//配置docker
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tkskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
##在配置文件末行添加,不然会报错
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 将这条命令注释掉
//重启进程
systemctl daemon-reload
//重启docker服务
systemctl restart docker
//将 /tls/ca.pem /tls/cer.pem /tls/key.pem 三个文件复制到另一台主机(client客户机)
scp ca.pem root@192.168.75.200:/etc/docker/ (CA证书)
scp cert.pem root@192.168.75.200:/etc/docker/(客户端签名证书)
scp key.pem root@192.168.75.200:/etc/docker/(客户端私钥)
//本地验证
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version
docker pull nginx
5.2 client 上操作
vim /etc/hosts
192.168.75.144 master
客户端输入验证
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version