我拥有自己的域名,使用Go编写的Web服务。我正在使用内置的Go Web服务器,前面没有Nginx或Apache。
我想开始通过HTTPS服务,我意识到让我们的加密即将成为这样做的方式。
任何人都可以共享配置在Linux服务器上运行的Go应用程序的整个设置过程吗?
答案 0 :(得分:55)
这是使用我发现的Go和Let的加密证书的HTTPS服务器的最小自动设置:
package main
import (
"crypto/tls"
"log"
"net/http"
"golang.org/x/crypto/acme/autocert"
)
func main() {
certManager := autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.com"), //Your domain here
Cache: autocert.DirCache("certs"), //Folder for storing certificates
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world"))
})
server := &http.Server{
Addr: ":https",
TLSConfig: &tls.Config{
GetCertificate: certManager.GetCertificate,
},
}
go http.ListenAndServe(":http", certManager.HTTPHandler(nil))
log.Fatal(server.ListenAndServeTLS("", "")) //Key and cert are coming from Let's Encrypt
}
有关autocert包的更多信息:link
编辑:由于letsencrypt security issue需要提供http,请阅读更多here。作为此修复的奖励我们现在有http - > https重定向。如果您已经收到证书,那么旧的示例将继续有效,但它将为新站点打破。
答案 1 :(得分:26)
我使用独立模式找到了一个非常简单的解决方案。
安装CERTBOT客户端(由Let's Encrypt推荐)
(go to the directory where you want to install the certbot client)
git clone https://github.com/certbot/certbot
cd certbot
./certbot-auto --help`
问题证书(第一次)
N.B。此操作通过端口80进行,因此如果您的Go应用程序侦听端口80,则需要在运行此命令之前将其关闭(顺便说一下,这可以非常快速地运行)
./certbot-auto certonly --standalone-supported-challenges http-01 -d www.yourdomain.com
在您的代码中添加SSL侦听器
http.ListenAndServeTLS(":443", "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem", "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem", nil)
更新证书(证书在90天后过期)
N.B。您可以手动运行(您将在证书过期前几天收到电子邮件),或者设置crontab
如果您的Go应用程序不再侦听端口80,您的Go应用程序可以在执行此命令时继续运行:
./certbot-auto renew --standalone
如果您的Go应用程序仍然侦听端口80,您可以指定停止并重新启动Go应用程序的命令:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"
有关Certbot命令的完整文档: https://certbot.eff.org/docs/using.html
答案 2 :(得分:0)
如果您可以使用 DNS 验证,那就是续订的方法。
使用证书,简单做:
c := &tls.Config{MinVersion: tls.VersionTLS12}
s := &http.Server{Addr: ":443", Handler: Gzipler(nosurf.New(router), 1), TLSConfig: c}
log.Fatal(s.ListenAndServeTLS(
"/etc/letsencrypt/live/XXX/fullchain.pem",
"/etc/letsencrypt/live/XXX/privkey.pem"
))
这个包含 Gzip 和 CSRF 保护。你可以使用
Handler: router
没有那些额外的功能。