如何为Go服务器应用程序设置Let加密

时间:2016-05-19 11:24:21

标签: ssl go https ssl-certificate lets-encrypt

我拥有自己的域名,使用Go编写的Web服务。我正在使用内置的Go Web服务器,前面没有Nginx或Apache。

我想开始通过HTTPS服务,我意识到让我们的加密即将成为这样做的方式。

任何人都可以共享配置在Linux服务器上运行的Go应用程序的整个设置过程吗?

3 个答案:

答案 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

没有那些额外的功能。