Go で記述された Web サービスを含む独自のドメインがあります。Nginx または Apache を前面に配置せずに、組み込みの Go Web サーバーを使用しています。
HTTPS 経由でのサービス提供を開始したいと考えていますが、Let's Encrypt がまさにそれを行うための方法になりつつあることに気付きました。
Linux サーバーで実行されている Go アプリを構成するためのセットアップ手順全体を共有できる人はいますか?
Go で記述された Web サービスを含む独自のドメインがあります。Nginx または Apache を前面に配置せずに、組み込みの Go Web サーバーを使用しています。
HTTPS 経由でのサービス提供を開始したいと考えていますが、Let's Encrypt がまさにそれを行うための方法になりつつあることに気付きました。
Linux サーバーで実行されている Go アプリを構成するためのセットアップ手順全体を共有できる人はいますか?
これは、私が見つけた Go および Let's Encrypt 証明書を使用した 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 パッケージの詳細:リンク
編集: Letsencrypt のセキュリティ上の問題により、http を利用できるようにする必要がありました。詳細はこちらをご覧ください。この修正のボーナスとして、http-->https リダイレクトが追加されました。古い例は、すでに証明書を受け取っている場合は引き続き機能しますが、新しいサイトでは機能しなくなります。
スタンドアロンモード
を使用して、非常に簡単な解決策を見つけました。
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)
TO RENEW CERTIFICATE (証明書は 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
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
それらの追加機能なしで。