3 回答

TA貢獻1890條經(jīng)驗 獲得超9個贊
這是使用我發(fā)現(xiàn)的 Go 和 Let's Encrypt 證書的 HTTPS 服務(wù)器的最小自動設(shè)置:
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
}
關(guān)于 autocert 包的更多信息:鏈接
編輯:由于letsencrypt安全問題需要使http可用,在這里閱讀更多。作為此修復(fù)的獎勵,我們現(xiàn)在有 http-->https 重定向。如果您已經(jīng)收到證書,舊示例將繼續(xù)工作,但它會因新站點而中斷。

TA貢獻1772條經(jīng)驗 獲得超5個贊
我找到了一個非常簡單的解決方案,使用獨立模式。
安裝 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`
簽發(fā)證書(第一次)
注意此操作通過端口 80 發(fā)生,因此如果您的 Go 應(yīng)用程序偵聽端口 80,則需要在運行此命令之前將其關(guān)閉(順便說一下,運行速度非??欤?/p>
./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 天后過期)
注意您可以手動運行此程序(您將在證書到期前幾天收到一封電子郵件),或者設(shè)置一個 crontab
如果您的 Go 應(yīng)用程序不再監(jiān)聽端口 80,您的 Go 應(yīng)用程序可以在您執(zhí)行以下命令時繼續(xù)運行:
./certbot-auto renew --standalone
如果您的 Go 應(yīng)用程序仍在偵聽端口 80,您可以指定停止和重新啟動 Go 應(yīng)用程序的命令:
./certbot-auto renew --standalone --pre-hook "command to stop Go app" --post-hook "command to start Go app"
有關(guān) Certbot 命令的完整文檔:https ://certbot.eff.org/docs/using.html

TA貢獻1817條經(jīng)驗 獲得超14個贊
如果您可以使用 DNS 驗證,那就是續(xù)訂的方法。
要使用證書,只需執(zhí)行以下操作:
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 回答
- 0 關(guān)注
- 228 瀏覽
添加回答
舉報