首页>安全资讯>通过Docker和Go实现https访问

通过Docker和Go实现https访问

最近一直在构建很多 Webhook,通常我需要通过HTTPS协议为应用程序提供服务。快速实现这一目标的一种常见方法是使用Let's Encrypt,但设置起来可能有点繁琐。我希望能够将这个过程完全自动化,包括证书更新。我一直在使用docker来构建我的应用程序,并且希望保持构建过程和容器镜像尽可能轻量级。最后,我想将整个过程作为应用程序代码,这样我可以轻松地进行动态更改和重新部署。此外,不依赖运维/shell脚本,我的应用程序可移植并轻松部署到许多不同的环境。

幸运的是,使用Go acme/autocert包可以实现所有这些功能。ACME表示自动证书管理环境,是一种低成本和自动化TLS证书生成和验证的协议。

Let's get cooking

let's_get_cooking首先你需要有一个域名。只要能将应用程序部署到该域所托管的服务上,任何域/子域都可以。您可以拥有多个域,例如,您可以在同一个应用程序中托管和验证chat.example.com和www.example.com。对于此示例,我将在kappa.serv.brendanr.net上托管我的应用程序。理想情况下,您的应用程序不会进行负载平衡-虽然可以在负载平衡域上实现ACME验证,但它更复杂。

接下来,你需要一个可以部署应用的服务器。确保配置DNS服务器以将域名指向该服务器。

最后,您需要使用上文提到的acme/autocert包来请求和响应ACME请求。Krzysztof Kowalczyk提供了一个很好的示例,您可以阅读它,但我将向您展示一个为更简单的版本以便更好地解释它是如何工作的。

应用代码

申请https域名证书

逐步分解

申请https域名证书

在这里,我们设置首页请求处理程序。一旦你开始着手去做 , 你应该以同样的方式为你的应用程序去注册处理函数。

申请https域名证书

上述代码为ACME相关配置信息。Prompt: autocert.AcceptTOS字段意味着您接受了Let's Encrypt的服务条款。Cache字段指定autocert包是否缓存以及缓存证书的方式。Let's Encrypt存在请求速率限制,限制了您申请证书的频率,因此将证书存储在后续可以检索的地方非常重要。这里我们指定证书存储在 cert-cache 目录中。最后,HostPolicy 字段允许我们将期望申请证书的域名加入白名单。如果没有该设置,攻击者可能会耗尽所分配的速率限额,并可能会阻止您生成所需的证书,因此配置该字段很重要。

申请https域名证书

最后,我们配置并启动HTTP和HTTPS服务。HTTPS服务将使用我们之前编写的处理程序进行响应。在响应HTTPS请求时,会自动获取HTTPS证书(来自缓存或 Let's Encrypt)。HTTP服务专门用于允许Let's Encrypt对我前面提到的秘钥令牌发出请求。也可以将HTTP服务重定向到HTTPS--请查看之前的示例。

构建和部署您的应用程序,并向其发出https请求!虽然应用程序第一次使用Let's Encrypt进行ACME质询流程请求时会有几秒耗时,但您的应用程序仍将使用安全可靠的HTTPS页面进行响应。

You promised me Docker

在容器化这个应用程序前,你需要避免几个问题。以下是完整的Dockerfile。我正在使用的这个Dockerfile是基于Pierre Prinetti Go 1.11 Web service Dockerfile的修改版本。

申请https域名证书

Dockerfile分两个阶段,构建和最终阶段。这使我们能够发送极小的最终镜像-我们甚至可以使用scratch(空的分层)作为基础。上面的代码和Dockerfile最终构建了一个只有7 MB的镜像!

注意事项:

您必须在最终镜像上安装ca-certificates,即使您的应用程序未进行TLS连接也是如此。这是因为您的应用程序将对Let's Encrypt发起的所有请求都是基于HTTPS,因此您需要根证书。

即使您不打算通过HTTP提供任何服务,也必须开放80端口。这是因为Let's Encrypt需要能够向我们的应用程序发出HTTP请求。

您应该将缓存目录缓存至本地磁盘,即便在部署过程中也会缓存证书。如果你不这样做,你可能会超出Let's Encrypt速率限制。

总结一下

我希望这篇文章可以帮助您在设置下一个Web服务时减少一些时间和困惑,或者至少让您有兴趣再写一些Go。

完整的代码可查看

https://github.com/bmon/go-web-base

最新资讯

代码签名证书原理和作用

Hash算法的特点、应用和实现方法详解

rsa算法产生的过程与原理详解

Windows\Apple\Mozilla\Android删除根证书的方法

Firefox浏览器中出现SSL证书错误的解决方法

标签推荐:数字证书申请 | 域名ssl证书 | https证书申请| 数字证书过期| 网站证书安装| 可靠的ssl证书| 小程序证书| ca认证电子签名| 微软代码签名| android数字签名| java代码签名| ssl证书部署| 时间戳技术| 电子签名技术| https证书配置| 谷歌浏览器证书| tomcat数字证书| openssl漏洞| ECC加密算法| 服务器SSL证书| 链路层劫持| 物联网安全技术| 火狐插件签名证书