前提・実現したいこと
AWS EC2 の Amazon Linuz 上で、ワイルドカード証明書を利用して
golang echo で https サーバを起動したいと考えています。
起動は正常に行えているように見えますが、ブラウザよりアクセスするとエラーが発生します。
恐らく証明書周りの設定の問題だと思いますが、echo の技術情報などを確認しても
理解できませんでした。
ご教示いただきたくお願いいたします。
発生している問題・エラーメッセージ
go build -o test main.go でビルドし、
./test をターミナルで実行すると、https は起動していますが、
当該URLにブラウザよりアクセスすると、ターミナルの画面に
acme/autocert: missing server name
が出力されます。
____ __ / __/___/ / ___ / _// __/ _ / _ \ /___/\__/_//_/\___/ v3.2.6 High performance, minimalist Go web framework https://echo.labstack.com ____________________________________O/_______ O\ ? https server started on [::]:9443 echo: http: TLS handshake error from xxx.xxx.xxx.xxx:8095: acme/autocert: missing server name echo: http: TLS handshake error from xxx.xxx.xxx.xxx:8097: acme/autocert: missing server name
該当のソースコード
https のソースは golang echo を参考に作成しています。
https://echo.labstack.com/cookbook/auto-tls
package main import ( "net/http" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "golang.org/x/crypto/acme/autocert" ) func main() { e := echo.New() // e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("<DOMAIN>") // Cache certificates e.AutoTLSManager.Cache = autocert.DirCache(".cache") println(e.AutoTLSManager.Cache) e.Use(middleware.Recover()) e.Use(middleware.Logger()) e.GET("/", func(c echo.Context) error { return c.HTML(http.StatusOK, ` <h1>Welcome to Echo!</h1> <h3>TLS certificates automatically installed from Let's Encrypt :)</h3> `) }) e.Logger.Fatal(e.StartAutoTLS(":9443")) }
試したこと
証明書が正しく読めていないと推測しています。
証明書を格納した .cache ディレクトリの置き場所をソースと同じディレクトリにする、
DirCache を絶対パスにするなど試しましたが、エラーの内容は変わりませんでした。
echo ではない以下の方法では、https を起動できることを確認しています
package main import ( "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello world")) }) log.Fatal(http.ListenAndServeTLS(":9443", ".cache/2018_ssl_ca_cert_hogehoge.pem", ".cache/2018_key_hogehoge.pem", nil)) }
AutoTLSManager.Cache の仕様に以下のように書かれているので、
pem形式の SSL証明書、中間証明書、キーをソース置いてある
ディレクトリに .cache ディレクトリを作成して格納しています。
Manager passes the Cache certificates data encoded in PEM, with private/public parts combined in a single Cache.Put call, private key first.
確認した文献: https://github.com/golang/crypto/blob/master/acme/autocert/autocert.go#L92
バージョン情報
$ go version
go version go1.8.1 linux/amd64
$ uname -a
Linux hogehoge 4.9.81-35.56.amzn1.x86_64 #1 SMP Fri Feb 16 00:18:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
自己解決
StartAutoTLSではなく、StartTLSを利用して証明書を指定することで起動することで
正常に https が起動できました。
golang echo の http/2 に書いてありました。
https://echo.labstack.com/cookbook/http2
ソースコードは以下のようになります。
package main import ( "net/http" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "golang.org/x/crypto/acme/autocert" ) func main() { e := echo.New() // e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("<DOMAIN>") // Cache certificates // e.AutoTLSManager.Cache = autocert.DirCache(".cache") ←不要 println(e.AutoTLSManager.Cache) e.Use(middleware.Recover()) e.Use(middleware.Logger()) e.GET("/", func(c echo.Context) error { return c.HTML(http.StatusOK, ` <h1>Welcome to Echo!</h1> <h3>TLS certificates automatically installed from Let's Encrypt :)</h3> `) }) e.Logger.Fatal(e.StartTLS(":9443", ".cache/ssl_ca.pem", ".cache/key.pem")) }
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。