一、Docker Remote API的认证

  • 在前一篇文章我们介绍了Docker Remote API如何使用:https://blog.csdn.net/qq_41453285/article/details/107642615
  • 在前一篇文章中我们介绍了如何连接到Docker Remote API,但是不意味着任何其他人都能连接到同样的API。从安全的角度上看,这存在一点儿安全问题。不过值得感谢的是,自Docker的0.9版本开始Docker Remote API开始提供了认证机制。这种认证机制采用了TLS/SSL证书来确保用户与API之间连接的安全

备注

  • 该认证不仅仅适用于API。通过这个认证,还需要配置Docker客户来支持TLS认证。在本文我们也将看到如何对客户端进行配置
  • 有几种方法可以对我们的连接进行认证,包括使用一个完整的PKI基础设置,我们可以选择创建自己的证书授权中心(Certificate Authority,CA),或者使用已有的CA。在这里我们将建立自己的证书授权中心,因为这是一个简单、快速的开始

警告

  • 这依赖于运行在Docker宿主机上的本地CA。它也不像使用一个完整的证书授权中心那样安全

二、建立证书授权中心

  • 下面快速了解一下创建所需CA证书和秘钥的方法,在大多数平台下这个过程都是非常标准的
  • 第一步:先要确保系统安装了openssl
which openssl

  • 第二步: 默认情况下,宿主机中有一个/etc/docker/目录,待会我们用这个目录来保存我们的CA和相关资料(如果没有这个目录自己创建)
ls /etc/docker

  • 第三步:进入上面那个目录,生成一个私钥,命令如下,在创建私钥的过程中,我们需要为CA秘钥设置一个密码(要自己记住这个密码,在新CA中,我们需要用这个秘钥来创建并对证书签名)
cd /etc/dockerecho 01 | sudo tee ca.srlsudo openssl genrsa -des3 -out ca-key.pem

  • 之后会生成一个名为ca-key.pem的新文件,这个文件是我们的CA的秘钥(不要把这个文件透露出去,也不能丢失这个文件)

  • 第四步:现在我们来创建一个CA证书,命令如下,回车之后会让你输入:

    • 刚才创建的CA的秘钥的密码(刚才上面输入的)
    • 然后输入城市名、组织名、邮箱等等信息
sudo openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem

  • 上面命令输入之后会传建一个ca.pem文件,这个文件使我们的CA证书,我们后面会使用这个文件来验证连接的安全性。

  • 现在我们有了自己的CA,让我们用它为我们的Docker服务器创建证书和秘钥。

三、创建服务器的证书签名请求和秘钥

  • 我们可以用新CA来为Docker服务器进行证书签名请求(cerificate signing request,CSR)和密钥的签名和验证。
  • 第一步:让我们从为Docker服务器创建一个秘钥开始,如下所示,同理也需要输入这个密钥的密码(注意:请设置一个密码,我们将会在使用之前清除这个密码(见下面第4步)。用户只需要在后面的几步中使用密码)。
sudo openssl genrsa -des3 -out server-key.pem

  • 之后会创建一个密钥server-key.pem。

  • 第二步:现在让我们创建服务器的证书签名请求(CSR),如下所示:

    • 同理,也要输入上面server-key.pem秘钥的密码。
    • 然后再输入一系列的信息,直接回车吧,不输入了。
    • 但是其中的Common Name比较重要,这个选项的值要么为Docker服务器(即从DNS中解析后得到的结果,比如docker.example.com)的FQDN(fully qualified domain name,完全限定域名)形式,要么为*(这将允许在任何服务器上使用该服务器证书)。
sudo openssl req -new -key server-key.pem -out server.csr

  • 之后生成一个server.csr文件。

  • 第三步:现在让我们来对CSR进行签名并生成服务器证书,如下所示,需要输入CA密钥文件的密码(创建ca-key.pem文件时的密码)。
sudo openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem

  • 上面命令输入完成之后会生成一个名为server-cert.pem的文件,这个文件就是我们的服务器证书。

  • 第四步:现在就让我们来清除服务器密钥的密码,如下所示

    • 输入命令之后,我们要输入先前设置的服务器密钥的密码(见上面第一步)。
    • 我们不想在Docker守护进程启动的时候再输入一次密码,因此需要清除它。
sudo openssl rsa -in server-key.pem -out server-key.pem

  • 第五步:现在,让我们为这些文件添加一些更为严格的权限来更好地保护它们,如下所示
sudo chmod 0600 /etc/docker/server-key.pem /etc/docker/server-cert.pem /etc/docker/ca-key.pem /etc/docker/ca.pem

四、配置Docker守护进程

  • 好了,现在我们已经得到了证书和秘钥,现在我们可以来配置Docker守护进程使用它们了
  • 为了使用这些东西,我们需要修改守护进程的配置文件。在不同的系统中配置文件不同:
    • Ubuntu、Debian系统:/etc/default/docker
    • Upstart系统:/etc/init/docker.conf
    • Red Hat、Redora系统:/etc/sysconfig/docker
    • 对于那些使用了Systemd的发布版本:/usr/lib/systemd/docker.service

以ubuntu为例

  • 我们使用是一台非server版本的ubuntu。在前面讲解【Docker API】文章中说过,docker安装在桌面版ubuntu的时候,默认的配置文件/etc/default/docker里的配置是无效的(server版并无问题),这个问题在官方文档中有出现。
  • 因此此处我们修改/lib/systemd/system/docker.service文件。
  • 。第一步:修改/lib/systemd/system/docker.service文件,修改ExecStart选项
    • 我们添加了一个-H,让其监听在tcp的2376端口上,这样使得外网可以访问我们的Docker守护进程,从而可以调用Docker Remote API(见前面介绍:https://blog.csdn.net/qq_41453285/article/details/107642615)。
    • 备注:上面我们让Docker守护进程监听在2376端口,这是Docker中TLS/SSL的默认端口号。对于非认证的链接,只能使用2375这个端口。
    • 然后使用了--tlsverify标志来启动TLS,然后使用--tlscacert、--tlsscert、--tlskey这3个参数指定了CA证书、证书和密钥的位置。
    • 可以使用--tls 标志来只启用TLS,而不启用客户端认证功能。
sudo vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem

  • 关于TLS还有很多其他选项可以使用,请参考:https://docs.docker.com/engine/security/https/。
  • 第二步:之后重启Docker服务,然后再重启Docker守护进程,之后查看守护进程的状态。
sudo systemctl daemon-reload
sudo service docker restart
sudo service docker status

五、创建客户端证书和密钥

  • 我们的服务器已经启用了TLS,下面我们需要为客户端创建和签名证书和密钥,以保证我们的Docker客户端的安全性。
  • 备注:实际开发中,客户端应该是在其他机器上(与Docker守护进程不处于同一台)创建这些内容的,但是我们只有一台机器,因此都放在一个机器上面弄了。
  • 第一步:创建客户端的密钥,同理,也需要输入一个临时的密码。
sudo openssl genrsa -des3 -out client-key.pem

  • 之后生成一个cleint-key.pem密钥文件。

  • 第二步:现在我们来创建客户端CSR,如下所示

    • 需要输入上面创建cleint-key.pem密钥文件时的密码。
    • 另外需要输入城市名一些列信息,直接回车。
sudo openssl req -new -key client-key.pem -out client.csr

  • 第三步:现在我们需要通过添加一些扩展的客户端SSL认证属性,来开启我们的密钥的客户端身份认证,命令如下,需要切换到管理员身份,不能使用sudo来执行echo命令
sudo su
echo extendedKeyUsage = clientAuth > extfile.cnf

  • 之后生成一个extfile.cnf文件

  • 第四步:现在让我们在自己的CA中对客户端CSR进行签名,如下所示:

    • 此处我们使用CA密钥的密码创建另一个证书:client-cert.pem。
    • 需要输入创建ca-key.pem文件时的密码(见文章上面)。
sudo openssl x509 -req -days 365 -in client.csr -CA ca.pem -CAkey ca-key.pem -out client-cert.pem -extfile extfile.cnf

  • 之后生成一个client-cert.pem证书 。

  • 第四步:同理,我们需要清除client-cert.pem文件中的密码,以便在Docker客户端中使用该文件,如下所示:回车之后需要输入上面创建cleint-key.pem密钥文件指定的密码。
sudo openssl rsa -in client-key.pem -out client-key.pem

六、配置Docker客户端开启认证功能

  • 好了,接下来我们刻意配置我们的Docker客户端来使用我们新的TLS配置。之所以需要这么做,是因为Docker守护进程现在已经准备接收来自客户端和API的经过认证的连接。
  • 备注:
    • 我们需要将ca.pem 、client-cert.pem 和client-key.pem 这3个文 件复制到想运行Docker客户端的宿主机上。
    • 上面曾提起过,实际上Docker客户端与服务端应该不在同一台机器上操作,但是此处我们只有一台机器,因此都在一台机器上操作了。
  • 第一步:在家目录下有一个.docker目录(如果没有自己创一个),然后将上面我们创建的客户端的秘钥和证书复制进去。
sudo ls ~/.docker
sudo cp ca.pem ~/.docker/ca.pem
sudo cp client-key.pem ~/.docker/key.pem
sudo cp client-cert.pem ~/.docker/cert.pem
sudo chmod 0600 ~/.docker/key.pem ~/.docker/cert.pem
sudo ls ~/.docker/

  • 第二步:现在我们就可以来测试从客户端到Docker守护进程的连接了。

    • 我们使用-H来告诉客户端要连接的Docker主机(这个地方不能直接填IP,要填服务器的域名,要不然会报错的)。
    • 指定了--tlsverify选项,使我们通过TLS方式连接到Docker守护进程。
    • 此处我们不需要指定任何证书或者密钥文件,因为Docker会自己在我们的~/.docker/目录下查找这些文件。如果确实需要执行这些文件,请分别用--tlscasert、--tlscert、--tlskey选项来指定CA证书、证书和密钥的位置。
sudo docker -H=localhost​:2376 --tlsverify info

  • 备注:如果在连接的时候不指定--tlsverify标志,那么TLS连接会不通过,无法连接到服务器。
sudo docker -H=localhost​:2376 info


  • 我是小董,V公众点击"笔记白嫖"解锁更多【Docker】资料内容。

长文详解!Docker客户端与服务端TLS认证(Docker Remote API认证)相关推荐

  1. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

  2. 详解个推java服务端集成

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 一.简介 个推是商用级的移动应用消息推送云服务解决方案,客户端SDK支持Android和iOS两大平台,云端支 ...

  3. https客户端与服务端认证过程详解

    Go和HTTPS 四月 30, 2015 27 条评论 近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验.之前只是粗浅接触过HTTP(使用Golang开 发微信 ...

  4. 边缘计算:万字长文详解高通SNPE inception_v3安卓端DSP推理加速实战

    本文是在以下文章的基础上编写,关于SNPE环境部署和服务器端推理可以参考上一篇文章: 边缘计算:万字长文详解高通SNPE inception_v3推理实战_seaside2003的博客-CSDN博客 ...

  5. 详解“FTP文件传输服务”安装配置实例

    "FTP文件传输服务"安装配置实例 家住海边喜欢浪:zhang789.blog.51cto.com 目录 简介 ftp工作原理 常见的FTP服务 Vsftpd服务器的安装 Vsft ...

  6. 长文详解材料阻燃性能试验方法

    长文详解材料阻燃性能试验方法 材料阻燃性能试验方法 阻燃材料燃烧试验的目的在于评定它的燃烧特性,即是否容易着火.着火后是否延燃,以及是否冒烟和释放毒气等.本文主要介绍了材料阻燃性能的测试方法. 1.火 ...

  7. Android 客户端与服务端的数据交互问题

    Android客户端是如何与服务端的数据进行交互的呢? 一般就是客户端向服务端发送请求,服务端对数据进行相关处理,返回json数据返回给客户端,客户端再进行相关操作. 说明:主要是用登录功能来进行详解 ...

  8. 【基础篇】详解Zookeeper客户端Curator

    一.前言 Zookeeper被广泛应用于分布式环境下各种应用程序的协调,而Curator无疑是Zookeeper客户端中的瑞士军刀,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重 ...

  9. RPC 笔记(03)— gRPC 概念、安装、编译、客户端和服务端示例

    1. gRPC 概念 gRPC 是 Google 开源的一款高性能的 RPC 框架.GitHub 上介绍如下: gRPC is a modern, open source, high-performa ...

最新文章

  1. 大话程序猿眼里最全的高并发,快收藏!
  2. mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
  3. linux安装后启动mysql,linux安装完mysql后启动错误
  4. C++:44---关键字virtual、override、final
  5. 未转变者服务器未正常运行,未转变者Battleye服务不能正常运行 | 手游网游页游攻略大全...
  6. 一个用于学习的react项目
  7. [deviceone开发]-doSpace应用源码开源
  8. [设计模式-行为型]模板方法模式(Template Method)
  9. Linux---信号及其使用简单讲解
  10. 一个虚拟服务器装多个网站,一台虚拟主机 如何放多个网站
  11. JavaScript实现继承的方式
  12. eclipse android 服务端,Eclipse搭建服务器,实现与Android的简单通信
  13. vs中能编译通过,但是会有红色下划线提示未定义标示符问题
  14. android 车牌识别 开源,在android上的车牌识别
  15. 盘点(腾讯字节谷歌等大厂)面试中常见的智力题
  16. 老男孩教育33期周末班-决心书
  17. 我的世界服务器怎么刷头最快,我的世界:最“无聊”的发明之一,服务器挂机必备,还能刷步数!...
  18. C# XML注释说明
  19. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
  20. java tr069_tr069 java源码 实现了简单的TR069功能 - 下载 - 搜珍网

热门文章

  1. FilterDispatcher
  2. mysql 怎么查后几条_查询MYsql中最后几条记录
  3. LeetCode笔记:Biweekly Contest 33 比赛记录
  4. BAT文件语法和技巧
  5. Python的continue语句
  6. Dell重装win7系统
  7. 给三维城市地图添加园区场景
  8. 02-前端-javaScript
  9. [附源码]计算机毕业设计在线图书销售系统Springboot程序
  10. HTML5添加网页背景音乐