ssl 如何设置Let's Encrypt for a Go服务器应用程序

h4cxqtbf  于 2023-01-21  发布在  Go
关注(0)|答案(3)|浏览(104)

我有自己的域,里面有用Go编写的Web服务。我使用的是内置的Go Web服务器,前面没有Nginx或Apache。
我想开始通过HTTPS服务,我意识到让我们加密即将成为这样做的方式。
有谁能分享一下在Linux服务器上配置Go应用程序的整个设置过程吗?

anauzrmj

anauzrmj1#

这是使用Go和Let 's Encrypt certificates自动设置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,
            MinVersion: tls.VersionTLS12, // improves cert reputation score at https://www.ssllabs.com/ssltest/
        },
    }

    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重定向。旧的例子将继续工作,如果你已经收到了证书,但它会打破新的网站。

uttx8gqw

uttx8gqw2#

我发现了一个非常简单的解决方案,使用独立模式。

安装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`

颁发证书(首次)

注意:这个操作是通过端口80进行的,所以如果你的Go应用程序监听端口80,在运行这个命令之前需要关闭它(顺便说一句,这个命令运行起来非常快)
./certbot-auto certonly --standalone-supported-challenges http-01 -d www.yourdomain.com

在您的GO代码中添加SSL监听器

http.ListenAndServeTLS(":443", "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem", "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem", nil)

搞定!

续订证书(证书将在90天后过期)

注意:您可以手动运行此操作(在证书到期前几天,您将收到一封电子邮件),也可以设置一个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

r7s23pms

r7s23pms3#

如果您可以使用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

而没有那些额外的特征。

相关问题