每个客户端/服务器通信都需要通过具有安全套接字层/传输层安全性的协议来保护。传输层安全 (TLS) 的前身是安全套接层 (SSL),TLS 存在的原因是由于 SSL 对攻击的脆弱性,并且 SSL 在应用程序之间通信的加密标准中与 TLS 不同。

应用程序之间的安全通信依赖于由客户端和服务器双方同意的证书颁发机构 (CA) 分发的证书 (cert)。 CA 是颁发具有 x.509 标准(使用公钥加密)的数字证书的实体,很少有领先的 CA 提供商是 Comodo、GoDaddy、Global Sign 和赛门铁克。

本文将重点介绍如何将证书安装到具有 RESTful API 的 docker 映像中。我们可以将这篇文章分为三个部分,解释有关安全性的关键概念以及如何实现它。

  • 种证书格式

  • 客户端/服务器通信&单向认证

  • 将证书添加到 docker 映像

种证书格式

大多数证书格式都带有后缀 -.pem、.cer、.crt、.key。与服务器通信的客户端(浏览器/客户端系统)将持有 *.pem(隐私增强邮件)或 .cer(SSL 证书的文件扩展名)以建立安全连接。

![](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27800%27%20height=%27446%27/%3e)

<img altu003d"image" srcsetu003d"/_next/image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*XlBLha_CscXmICBU7Kxzdw.png&wu003d828&qu003d75 1x, /\ _next/image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*XlBLha_CscXmICBU7Kxzdw.png&wu003d1920&qu003d75 2x" srcu003d"/_next/image?urlu003dhttps%3A %2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*XlBLha_CscXmICBU7Kxzdw.png&wu003d1920&qu003d75" 解码u003d"async" data-nimgu003d"intrinsic" styleu003d"position:absolute;top:0;left :0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;最大宽度:100%;最小高度:100%;最大高度:100%;对象适配:包含" classu003d"image" loadingu003d"lazy">

*.pem、*.cer、*.crt 的常用格式

RSA (Rivest–Shamir–Adleman) 算法用于加密和解密通信中的消息,其中一个密钥保持公开,另一个密钥保持私有,它定义了公钥密码学又称非对称加密的概念。使用 TLS 可以防止最常见的攻击,例如 MITMA(中间人攻击)。注册机构 (RA) 帮助验证来自可用公钥基础设施 (PKI) 的证书,它充当 CA 的中间人。

客户端/服务器通信&单向认证

简而言之,通过一种方式身份验证在两个资源之间建立安全连接的整体通信总结如下。

  1. 客户端从服务器请求受保护的资源(RESTful API 调用)

  2. 客户端将使用其公钥加密的信息呈现给服务器

  3. 服务器使用其私钥评估请求(仅在服务器端可用)并根据请求的资源进行响应

对于相互身份验证,它的工作方式与客户端和服务器都提供它们的公钥并使用它们自己的可用私钥解密它们的消息的方式相同。

将证书添加到 docker 镜像

我们可以看到如何在具有 Golang RESTful API 的 docker 容器中实现单向身份验证的演示。请参阅文章Golang & Docker — Microservices (RESTful API) for Enterprise Model说明了创建 Restful API 并将其包装到 Docker 映像中的步骤。

docker 镜像由多个资源组成,这些资源将使容器在云中自行处理请求,管理员有责任在镜像内的根目录中安装相关证书以确保其安全。还要在您的代码中指示在调用其他安全 API 时考虑来自 root 的证书。

![](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27545%27%20height=%27208%27/%3e)

<img altu003d"image" srcsetu003d"/_next/image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*2V6S9p4AQiYFB7gy66TCvw.jpeg&wu003d640&qu003d75 1x, /_next/ image?urlu003dhttps%3A%2F%2Fcdn.hackernoon.com%2Fhn-images%2F1*2V6S9p4AQiYFB7gy66TCvw.jpeg&wu003d1200&qu003d75 2x" srcu003d"/_next/image?urlu003dhttps%3A%2F%2Fcdn .hackernoon.com%2Fhn-images%2F1*2V6S9p4AQiYFB7gy66TCvw.jpeg&wu003d1200&qu003d75" 解码u003d"async" data-nimgu003d"intrinsic" styleu003d"position:absolute;top:0;left:0;bottom:0 ;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100% ;min-height:100%;max-height:100%;object-fit:contain" classu003d"image" loadingu003d"lazy">

安装了证书的图像

在 alpine 中,我们有一个名为ca-certificates的包实用程序,它带有用于 Mozilla 浏览器的预安装证书。您还需要使用 TLS 所需的第三方证书更新捆绑包,这可以通过在 Dockerfile 中指定如下更新证书命令来完成。

FROM alpine:最新

运行 apk 更新 && apk 添加 ca 证书 && rm -rf /var/cache/apk/*

复制 ./mycert.crt /usr/local/share/ca-certificates/mycert.crt

运行更新 CA 证书

将以下命令添加到解释以下步骤的 Docker 文件中。

  • 从 docker 注册表中拉取 alpine 镜像

  • 在 docker 镜像中安装 ca-certificates bundle 并删除 temp 文件夹

  • 将证书从本地计算机复制到要构建的映像内的所需文件夹。

  • 运行命令 update-ca-certificates 将新证书更新到相应文件夹

上述步骤会将您的第三方证书添加到您的 docker 镜像中,一旦构建了镜像并且容器启动,Golang 库将检测证书(x.509 标准)并提供适当的公钥以与调用 API 建立安全连接