golang tls
如果您需要在部署证书或证书链之前对其进行验证,则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 下载代码 。
![](https://i-blog.csdnimg.cn/blog_migrate/8bc316630aeb9541f14a9424dab5aaaf.png)
图1:作者的简短Go程序,可在GitHub上找到。
Go 日志包非常容易说明-它是启用日志记录的包。 在这种用例中,出现故障的迹象应该会出现明显的故障。 log具有三个助手功能: print , 致命和恐慌 。 包的输出发送到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请求多路复用器的缩写。 该多路复用器具有创建带有标头和内容的HTTP服务器的功能(Hello World!)。 cfg引入了您在可靠的NGINX或httpd配置中看到的所有TLS位和片段。 srv将各个部分放在一起,并定义要侦听的端口。 行log.Fatal(srv.ListenAndServeTLS(“ tls.crt”,“ tls.key”))定义要使用的证书文件,如果无效,则记录致命错误。
Go代码完全按照我的需要执行操作,仅用34行代码即可完成。 编译代码后,Web服务器小于6MB。 我能够将其他开源项目和文章(如本篇)中的大多数Go代码拼凑在一起。 可以将Web服务器安全地部署到任何公共服务器上,并对其进行测试以进行额外审查。
您有方便的Go技巧可以分享吗? 将您的故事想法发送至open@opensource.com 。
翻译自: https://opensource.com/article/17/4/testing-certificate-chains-34-line-go-program
golang tls