web-dev-qa-db-ja.com

Goサーバーアプリケーション用にLet's Encryptをセットアップする方法

Goで書かれたWebサービスを持つ独自のドメインがあります。 NginxやApacheを前にせずに、組み込みのGo Webサーバーを使用しています。

HTTPS経由でサービスを開始したいのですが、Let's Encryptがまさにその方法になりつつあることに気付きました。

Linuxサーバーで実行するGoアプリを構成するためのセットアップ手順全体を誰でも共有できますか?

27
Daniele B

これは、見つけた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パッケージの詳細: link

編集: letsencryptセキュリティの問題 のためにhttpを利用可能にする必要がありました。詳細は here をご覧ください。この修正のボーナスとして、http-> httpsリダイレクトがあります。古い例は、既に証明書を受け取っている場合は引き続き機能しますが、新しいサイトでは機能しなくなります。

55
Pylinux

standaloneモードを使用して、非常に簡単なソリューションを見つけました。


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`
_


ISSUE CERTIFICATE(初回)

N.B.この操作はポート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日後に失効します)

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

27
Daniele B