使用Net::ACME2和Let’s Encrypt实现免费通配符TLS

互联网上TLS部署最近取得的改进,很大一部分要归功于Let’s Encrypt(LE),它通过开放访问的RESTful API提供免费的TLS证书。该API有大量不同语言的客户端,包括Perl。(列表包括由cPanel派生的Net::ACME以及Crypt::LEProtocol::ACMEWWW::LetsEncryptMojo::ACME。)

LE与IETF合作,将他们的“ACME”(自动证书管理环境)协议标准化为互联网标准。即将推出的标准与之前版本的协议不兼容,这需要更新客户端逻辑。

然而,作为客户端采用新协议的激励,LE将通过其新API提供免费的通配符TLS。

我认为这是一个重新设计Net::ACME以支持新协议的好机会,并很快决定一个新发行版最能满足需求。除了已经发生的重大协议变化,我还想做一些“更深层”的改进:

  • 我想整合X::Tiny以减少一些逻辑重复并获取该库的好处。

  • 新协议建议对类结构进行一些修改,这些修改在先前的版本中难以整合。

因此,Net::ACME2现在可用。这是一个适用于任何标准ACME实现的通用客户端库,尽管目前唯一的公开ACME实现是Let’s Encrypt的。他们的API目前只提供测试证书,但一旦有生产端点,我将更新Net::ACME2以使用它。

与它的前身一样,Net::ACME2

  • … 支持RSA和ECDSA

  • … 在Perl运行的地方运行——除了核心模块外不需要XS。(参照Crypt::Perl

  • … 通过类型化异常报告详细错误

  • … 依赖最少(没有Moose等。)

我创建了一些脚本以帮助您开始。安装模块后,克隆存储库,进入根项目目录并运行

$ ./examples/http-01.pl

… 或

$ ./examples/dns-01.pl

这些将引导您完成以下步骤(以Let’s Encrypt为例)

  1. 阅读服务条款,如果您接受,请继续。

  2. 创建RSA或ECC私钥。Net::ACME2将从其中提取公钥并将其作为您的账户标识符发送到ACME服务器。(示例脚本为每次调用创建一个新密钥,但对于生产部署,您应该重复使用密钥。)

  3. 通过告诉Net::ACME2证书将包括哪些域名来创建证书订单。ACME服务器将响应“挑战”选项——即如何证明您控制这些域名。目前有两种可用方法:HTTP和DNS。(注意:通配符域名需要DNS方法。)

  4. 设置验证。对于HTTP,这意味着创建一个特定域名上的特定URL以返回特定内容;对于DNS,这意味着创建一个具有特定名称和内容的TXT记录。(示例脚本为所有域名使用相同的挑战方法,但您的应用程序可以更灵活。)

  5. 向ACME服务器指示您为每个域名接受的挑战。

  6. 完成证书订单。这将告诉您是否有任何挑战失败或仍在等待。

  7. 如果所有域的挑战都成功,您将获得一个URL,其内容将是新发行的证书。

Net::ACME2,就像ACME标准本身一样,仍然可能发生变化,但它现在可以完成这项工作。试试看吧!

标签

费利佩·加斯帕

费利佩·加斯帕自2000年代初就开始编写Perl,目前定期为cPanel, L.L.C.提供咨询服务。他也是一名有经验的合唱指挥、歌手和风琴师。在业余时间,他喜欢看电影、戏剧、“家庭语言学”和游戏。

浏览他们的文章

反馈

这篇文章有问题吗?请在GitHub上打开一个issue或pull request来帮助我们。