我有自己的域,里面有用Go编写的Web服务。我使用的是内置的Go Web服务器,前面没有Nginx或Apache。我想开始通过HTTPS服务,我意识到让我们加密即将成为这样做的方式。有谁能分享一下在Linux服务器上配置Go应用程序的整个设置过程吗?
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重定向。旧的例子将继续工作,如果你已经收到了证书,但它会打破新的网站。
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
./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
./certbot-auto renew --standalone
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"
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
而没有那些额外的特征。
3条答案
按热度按时间anauzrmj1#
这是使用Go和Let 's Encrypt certificates自动设置HTTPS服务器的最小配置,我找到:
有关autocert软件包的详细信息:link
编辑:由于letsencrypt security issue,需要使http可用,阅读更多here。作为这个修复的奖金,我们现在有http--〉https重定向。旧的例子将继续工作,如果你已经收到了证书,但它会打破新的网站。
uttx8gqw2#
我发现了一个非常简单的解决方案,使用独立模式。
安装CERTBOT客户端(Let 's Encrypt推荐)
颁发证书(首次)
注意:这个操作是通过端口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
r7s23pms3#
如果您可以使用DNS验证,这是续订的方式。
要使用证书,只需执行以下操作:
这一个有Gzip和CSRF保护包括在内。你可以使用
而没有那些额外的特征。