如果您需要在部署证书或证书链之前对其进行验证,Golang 提供了一种近乎万无一失的测试方法。在本文中,我将解释我们的用例,该用例产生了测试证书链的需求,回顾适当的 Web 服务器安全设置,并分解用于测试的 Go 代码。
最近,我在工作中承担了一个项目,这个项目变成了一次冒险。这是一个小型应用程序,但似乎花费了不应该花的那么多钱。这个应用程序是由第三方构建的,现在由内部维护。这个项目位于 Amazon Web Services 中,并使用了弹性负载均衡器 (ELB)。
在我可以进行任何重新工程工作之前,我必须解决一个关键问题——ELB 上的证书即将过期,需要更新。新证书来自一家大型 SSL 供应商,该供应商在其网站上提供了过时以及最新的文档。这些文档也更适合闭源操作系统和应用程序。我提到这一点是因为,如果您要通过 TLS 提供内容,您最好在 Qualys SSL Test 上获得 A 级评分。要获得 A 级评分,您必须将中间证书作为链的一部分。
有很多方法可以测试证书链,但测试可能会有点令人困惑。我假设如果 ELB、NGINX 或 httpd 启动,这是一个好兆头。这是我错误的假设,最终我提供了一个错误的链几分钟。这没有破坏网站,但这绝对不是我想要保持的方式。
我需要一个工具,如果提供的证书链不正确,它会失败。我想要一个可以公开访问的轻量级工具。对证书和配置进行第三方分析是一项要求。我找不到满足此需求的工具,因此我决定构建自己的工具。我转向了开源语言 Golang。
Golang(或 Go)是由 Robert Griesemer、Rob Pike 和 Ken Thompson 在 Google 创建的一种开源语言。Go 是一种编译型、静态类型语言,具有 Algol 和 C 的传统,添加了垃圾回收、有限的结构类型、内存安全特性和 CSP 风格的并发编程特性。Go 在速度、功能和简洁性之间提供了极佳的平衡。
我的 Go Web 服务器使用了三个 Go 包:log、crypto/tls 和 net/http。您可以从 GitHub 下载代码。
图 1:作者的简短 Go 程序,可在 GitHub 上找到。
Go log 包非常不言自明——它是启用日志记录的包。在本用例中,在出现问题时应该有明显的故障。log 有三个辅助函数:print、fatal 和 panic。包的输出将转到 stderr。我使用了一个致命错误来停止 Web 服务器并记录任何问题。
Go crypto/tls 包部分实现了 TLS 1.2,如 RFC 5246 中所指定的那样。这个包配置了可以使用的 SSL/TLS 版本,并识别握手期间使用的首选密码套件和椭圆曲线。这个包安全地处理连接。
Go Web 服务器中使用的关键包是 net/http 包。它是 HTTP 的 Go 实现。net/http 有一个名为 ListenAndServeTLS 的函数。这提供了所需的证书检查功能。根据包的 ListenAndServeTLS 文档,“如果证书由证书颁发机构签名,则 certFile 应该是服务器证书、任何中间证书和 CA 证书的串联。”
代码创建了一个 mux,是 HTTP 请求多路复用器的缩写。这个 mux 有一个函数,可以创建一个带有标头和内容(Hello World!)的 HTTP 服务器。cfg 引入了您在可靠的 NGINX 或 httpd 配置中看到的所有 TLS 位和片段。srv 将各个部分组合在一起,并定义要侦听的端口。行 log.Fatal(srv.ListenAndServeTLS("tls.crt", "tls.key")) 定义了要使用的证书文件,如果它们无效,则记录致命错误。
Go 代码完全满足了我的需求,仅用 34 行代码就完成了所有操作。一旦代码被编译,Web 服务器就小于 6MB。我能够从其他开源项目和文章(如本文)中拼凑出大部分 Go 代码。Web 服务器可以安全地部署到任何公共服务器,并对其运行测试以进行额外的审查。
您有什么方便的 Go 技巧要分享吗?请将您的故事创意发送至 open@opensource.com。
评论已关闭。