使用 Smallstep 和 Travis 生成证书

分享此内容
分享此内容

您可能知道,自 2016 年推出以来,用于自动证书管理的 ACME 协议在 Web PKI 中得到了广泛采用。虽然最初是为公共网络使用而设计的,但该协议也非常适合在内部网络上使用,例如内联网、学院的内部聊天系统等。让我们进一步了解 Smallstep。

什么是 X.509 证书

X.509 最初发布于 1988 年,与 X.500 标准一起推出。它严格遵循证书颁发机构 (CA) 的结构化系统来颁发证书。X.509 信任模型包含三个主要要素:证书颁发机构 (CA)、证书持有者 (CH) 和依赖方 (RP)。证书颁发机构是证书持有者和依赖方之间可信的第三方。CA 的主要作用是通过确认通信中包含的输入来颁发证书。

X.509 的 PKI 标准

X.509 公钥基础设施 (PKI) 标准被广泛用作可扩展且灵活的身份验证机制。X.509 实现中的缺陷可能使依赖应用程序容易受到模仿攻击或互操作性问题的攻击。在实践中,许多实现 X.509 的库已被证明存在由于不符合标准而导致的缺陷。由于标准是用自然语言编写的,因此其设计复杂性、模糊性或未完全定义的规范阻碍了开发符合标准的实现。

一些 PKI 标准

  • SSL(SSL 的前身)
  • TLS
  • 在线证书状态协议 (OCSP)

用法

因此,我创建了一个非常简单的 .travis.yml 文件,展示了 Smallstep 的一些功能,您可以开始考虑如何将其应用于您在 Travis 上运行的项目。现在让我们进入我创建的 .travis.yml 文件。

dist: jammy
language: go
group: edge
sudo: true

script: 
 - wget https://dl.step.sm/gh-release/cli/docs-cli-install/v0.20.0/step-cli_0.20.0_amd64.deb
 - sudo dpkg -i step-cli_0.20.0_amd64.deb
 - step -v 
 - step certificate create --profile root-ca "Montana Mendy Travis CI keys" ca.crt ca.key --insecure --no-password
 - step certificate inspect https://smallstep.com

这是我在 Debian 上使用 Smallstep 创建 localhost.key 文件。

您将看到,我们使用 wget 获取 Smallstep,然后使用 dpkg 解压缩它,接着我检查 step -v 以确认 Smallstep 确实在我们的虚拟机中。然后我运行以下命令:

step certificate create --profile root-ca "Montana Mendy Travis CI keys" ca.crt ca.key --insecure --no-password

这将为我创建一个证书,不需要密码。如果您需要密码,我已经创建了一个 bash 脚本,可以在 Smallstep 提示您输入密码时将密码输入到提示符中。该脚本在 Smallstep 提示您输入密码后可用。

#!/bin/bash
pass="toocool"
echo $pass | step certificate create --profile root-ca "Montana Mendy Travis CI keys" ca.crt ca.key

如果您想要密码,并且正在将此基础用于测试以外的目的,那么这将帮助您在 Travis CI 上进行操作。

ACME 用户体验

现在,当我们谈论使用 ACME(不一定是 Smallstep)时的普通用户体验时,它类似于以下步骤:

  • 生成 PKCS#10 [RFC2986] 证书签名请求 (CSR)。
  • 将 CSR 剪切并粘贴到 CA 的网页中。
  • 通过以下方法之一证明您对 CSR 中域名的所有权:
  • 将 CA 提供的挑战放置在 Web 服务器上的特定位置。
  • 将 CA 提供的挑战放置在与目标域名相对应的 DNS 记录中。
  • 在(希望是)管理员控制的与域名相对应的电子邮件地址中接收 CA 提供的挑战,然后在 CA 的网页上进行响应。
  • 下载已颁发的证书并将其安装在用户的 Web 服务器上。

JWS

如果客户端希望从服务器获取资源(否则将使用 GET 方法),则它 MUST 发送包含 JWS 主体的 POST 请求,如上所述,其中 JWS 的有效负载为零长度的八位字节串。换句话说,JWS 对象的“有效负载”字段 MUST 存在并设置为空字符串 (“”),否则您将获得 null

哦,不!我被卡在了交互式提示符处!

别担心,我们将使用 pass$pass,并告诉它与 step 命令一起运行,就像您上面所记得的那样,但请记住,您需要运行以下命令来确保它具有适当的权限:

chmod u+x step.sh 
./step.sh

Replay-Nonce 标头字段的值 MUST 是根据 base64url 编码进行编码的八位字节串。在设置某些策略时,请记住,客户端 MUST 忽略无效的 Replay-Nonce 值,以下是一个示例:

base64url = ALPHA / DIGIT / "-" / "_"
Replay-Nonce = 1*base64url

图 1. 可互操作实现体系结构概述。

我无法深入探讨 ACME 的所有方面,但您可以研究一下可互操作实现体系结构。它非常有趣。

我如何总结 ACME 协议?

ACME 客户端为域名创建密钥对(有时称为密钥值对),并将公钥(包含在 X.509 证书签名请求 (CSR) 中)提供给 ACME 服务器。然后,ACME 服务器颁发包含公钥和客户端之前请求的所有域名的证书。

实际的 ACME 协议旨在异步工作,并将草图流程分解为几个(更小的)步骤。这些步骤中的每一个都使用由 ACME 服务器在流程过程中逐步颁发的唯一标识符(在 URL 中提供)与流程相关联。该协议要求客户端对每条消息进行身份验证(基于 JSON Web 签名 (JWS) 标准)。

速率限制

一旦速率限制被超过,服务器 MUST 以类型为 urn:ietf:params:acme:error:rateLimited 的错误进行响应。此外,服务器 _SHOULD_ 发送 Retry-After 标头字段,并告知最终用户何时重试。

构建

如果您的构建正常完成,您将看到以下内容:

您会注意到 curl 将从 Google 拉取您需要的所有内容,然后我们运行 gcloud components update kubectl,并确保 Docker 被列为服务。您的构建应该与以下内容类似:

您会看到,在我们的 .travis.yml 文件中也有以下命令:

step certificate inspect https://smallstep.com

这是为了确保 certificate inspect 正常工作,正如您所看到的,Smallstep 正在出色地完成工作。

结论

您刚刚了解了 ACME 协议的概述,以及如何使用 smallstep 来使用 ACME 协议并在您的 Travis CI 项目中利用它的一些功能。

与往常一样,如果您对本教程有任何疑问,请通过电子邮件联系我:[email protected],我将为您提供帮助。

祝您构建愉快!在下面,您会找到与本教程相关的链接。

在您离开之前,这里有一些相关的链接!

© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利