web-dev-qa-db-ja.com

Golang WebサーバーでHTTPSを設定する方法

私は https://www.kaihag.com/https-and-go/ を読んでいて、ComodoからSSL証明書を購入し、.Zipファイルをメールで送ってきました。これまでのところ、すべてのファイルは次のようになります

csr.pem
private-key.pem
website.com.crt
website.com.ca-bundle
website.com.Zip

上記のウェブサイトは、私が持っていない3つの.pemファイルを連結することを望んでいます。ところで、.pemファイルを連結する必要がある理由は何ですか?変更されていない上記のファイルを使用して、golang Webサーバーでhttpsを設定するにはどうすればよいですか?

6
irregular

https://golang.org/pkg/net/http/#ListenAndServeTLS を使用します

http.HandleFunc("/", handler)
log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/")
err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil)
log.Fatal(err)

これは実際には問題ではありませんが、コンピューターはルート証明書のみを格納するため、中間証明書が必要です。それらを連結することで、すべてを1つのファイルに入れて、ブラウザーがすべての証明書を取得するようにします。これは必須のステップです。そうしないと、サーバーが特定のデバイスで失敗します。証明書プロバイダーは、これを行うための指示を提供します。はじめに、1つの証明書ファイルと1つの秘密鍵ファイルが必要です。

https://kb.wisc.edu/page.php?id=1892

証明書を組み合わせるには、次のようなcatを使用できます(ファイルの最後に改行があることを確認してください)。

cat example.com.ca-crt example.com.ca-bundle > example.com.crt
11
Kenny Grant

http.ListenAndServeTLSが必要です

package main

import (
    // "fmt"
    // "io"
    "net/http"
    "log"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
    // fmt.Fprintf(w, "This is an example server.\n")
    // io.WriteString(w, "This is an example server.\n")
}

func main() {
http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

これがスニペットです: https://Gist.github.com/denji/12b3a568f092ab951456

2
Eugene Lisitsky

ここに私の発見があります。利用可能なすべてのインストールガイドはGolang Webサーバー用ではなく、NginxとApache HTTP構成用だったので数時間かかったので、共有したいと思います。

環境:

  • Comodo/SectigoからのSSL証明書
  • ミドルウェアとしてのジンゴニック

問題:

  • MacのChrome/Firefoxでは問題なく動作していましたが、Windows FirefoxではCORSエラーが発生しました。後で、それは本当にCORS関連の問題ではないことがわかり、私は https://www.digicert.com/help を使用して、SSLの有効性をubuntuサーバーに診断しました。その結果、「証明書は信頼できる機関によって署名されていません(Mozillaのルートストアに対してチェック)」。

解決:

解決策は、テキストエディタを使用して以下の証明書を連結し、好きな名前を付けることです。 「my_domain.txt」という名前で保存しました。

  • my_domain.ca-bundle(1つのルートと2つの中間証明書を含む)
  • my_domain.crt(私のドメインのメイン証明書)

次に、このように実行します。

router.RunTLS(":"+os.Getenv("PORT"), "../my_domain.txt", "../my_private_key.txt")

お役に立てば幸いです。

0
R.Cha