前言:之前配置了任何人都可以连接,被黑了,下决心要研究下docker客户端远程安全连接
一 证书的一些故事
(0)证书介绍
开发'https功能'的web server必须用到签名证书,证书都是由'证书签发机构签发',当然也可以'自己给自己签发'即自签名证书。
要签发证书,首先要'有一个根证书',然后用'根证书来签发'用户证书
一般先生成一个'私钥文件(Key)',然后用私钥生成'证书签名请求'(csr:certificate signing request),再用'证书服务器的根证书'来签发证书,生成'证书文件'(crt: certificate)。
理解: '英文单词'的含义
一般用于'顶级证书、根证书,证书的名称'和'认证机构'的名称相同.
根证书是'CA认证中心给自己颁发的证书',是'信任链的起始点',安装根证书'意味着'对这个CA认证中心的信任
交互图
二 开始配置
(1)准备工作
A客户端'CLient' : 理论上只需要安装docker客户端 'yum install docker-ce-cli -y' --> 保险 --> 'yum install docker-ce -y'
B服务端'Server' : --> 'yum install docker-ce -y' -->也即docker-daemon需要开启
(2)服务器开始配置
说明:以下Docker守护程序的主机上
①生成CA私钥和公钥
openssl genrsa -aes256 -out ca-key.pem 4096
'不想交互--> -subj "/CN=$HOST"' --> '没有尝试'
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
注意: 执行完如上指令后,会要求我们'输入密码'才能进行下一步
核心: Common Name (e.g. server FQDN or YOUR name) []:'$HOST' -->公网ip
补图
②通过CA创建'服务器密钥和证书签名请求'(CSR)
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
注意: 以'-out'对应的文件
③用CA签署公钥
由于可以通过'IP地址'和'DNS名称建立TLS连接',因此在创建证书时需要'指定IP地址' --> IP是'必须的'
echo subjectAltName = DNS:114.114.114.114,IP:$HOST,IP:127.0.0.1 >> extfile.cnf
④将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
echo extendedKeyUsage = serverAuth >> extfile.cnf
⑤生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
注意: 'server-cert.pem'
三 客户端身份验证的配置
⑥创建客户端密钥和证书签名请求
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
⑦为了使密钥适合客户端身份验证,请创建一个新的扩展配置文件:
echo extendedKeyUsage = clientAuth > extfile-client.cnf
⑧生成签名证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf
四 扫尾工作
⑨安全地删除两个证书签名请求和扩展配置文件
chmod -v 0400 ca-key.pem key.pem server-key.pem
⑩访问权限设置
chmod -v 0444 ca.pem server-cert.pem cert.pem
五 服务器进行配置
(1) 修改配置文件
vim /usr/lib/systemd/system/docker.service
(2)将相应的文件移动到对应的位置
cp server-cert.pem server-key.pem ca.pem /etc/docker/
(3)重启服务
systemctl daemon-reload
systemctl restart docker
六 客户端测试
(1)复制
将服务器/etc/docker目录下的'ca.pem、cert.pem、key.pem'三个文件复制到客户端
scp root@${REMOTE_IP}:/root/docker/{ca.pem,cert.pem,key.pem} .
(2)测试
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://${REMOTE_IP}:2375 network ls
-- 后面的 'network ls'是命令
七 总结一个交互的脚本
openssl genrsa -aes256 -out ca-key.pem 4096
# Common Name (eg, your name or your server's hostname) []:x.x.x.x
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=x.x.x.x" -sha256 -new -key server-key.pem -out server.csr
echo 'subjectAltName = DNS:114.114.114.114,IP:x.x.x.x,IP:127.0.0.1' >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
八 简化
问题:是不是每次都要输入一场串很不方便
mkdir -pv ~/.docker
cp -v {ca,cert,key}.pem ~/.docker
--> '~/.bashrc' <--
export DOCKER_HOST=tcp://$HOST:2376
export DOCKER_TLS_VERIFY=1
九 curl测试
说明: 自签名一定要加一个'--insecure'参数 --> DOcker Daemon 的'API调用'
curl --insecure https://$HOST:2376/images/json \
--cert ~/.docker/cert.pem \
--key ~/.docker/key.pem \
--cacert ~/.docker/ca.pem
补充:报错
x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs
十 后续