使用 Go 和 Let's Encrypt 快速配置HTTPS加密

Let's Encrypt 在2015年秋季推出了免费的数字证书认证计划,旨在消除当前手动创建和安装证书的复杂性,并推广加密的万维网服务,为安全网站提供免费的SSL/TLS证书。
Let's Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。

用以实现这一新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。提案的一个版本已作为一个Internet草案发布。

目前, 申请证书的域名只能是特定的域名, 不支持通配符证书(*.example.com),这对于一个拥有众多子域名的公司来说很不方便。但是今年已经说了,将于2018年1月支持通配符证书和ACME v2 API。

原先有一些支持Let's Encrypt的 Go 工具和库, 比如legoacmeletsencryptrsc/letsencrypt, 但是我推荐使用官方的库:x/crypto/acme/autocert, 简单好用,并且官方维护。

稍微复杂一点的使用姿势如下(其实已经很简单了):

1
2
3
4
5
6
7
8
9
10
m := autocert.Manager{
Cache: autocert.DirCache("secret-dir"),
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org"),
}
s := &http.Server{
Addr: ":https",
TLSConfig: &tls.Config{GetCertificate: m.GetCertificate},
}
s.ListenAndServeTLS("", "")

autocert.Manager提供了GetCertificate方法, 可以用来配置TLSConfig

更简单的方式是一行搞定:

1
2
3
4
5
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
})
log.Fatal(http.Serve(autocert.NewListener("example.com"), mux))

autocert.NewListener提供了一个自动配置的listener,使用起来非常的方便。

所以,如果你想做一些额外的配置,如果证书要缓存的位置,就用上面的方式, 如果想傻瓜式的使用,就用一行代码的方式。

关于这个包的设计的一些讨论可以看: #17053