7
私は複数のドメインを持っています(abc.comとxyz.orgと言いましょう)。それは深い低レベルとnet.Listenなど、単純なhttp.ListenAndServeTLS(...)または同様のものを使用しないで行くことなく、ホスト名に基づいてキーと証明書を使用することは可能ですか? 基本的にはnginxの機能が好きです。net/httpでgolangで複数のドメインTLSをホストすることはできますか?
私は複数のドメインを持っています(abc.comとxyz.orgと言いましょう)。それは深い低レベルとnet.Listenなど、単純なhttp.ListenAndServeTLS(...)または同様のものを使用しないで行くことなく、ホスト名に基づいてキーと証明書を使用することは可能ですか? 基本的にはnginxの機能が好きです。net/httpでgolangで複数のドメインTLSをホストすることはできますか?
BuildNameToCertificate()は証明書からホスト名をスニッフィングします。 SNI情報と一致するものがない場合、[0]を処理します。 https://golang.org/src/crypto/tls/common.go?s=18204:18245#L762
package main
import (
"crypto/tls"
"net/http"
"time"
"log"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("tls"))
}
func main() {
t := log.Logger{}
var err error
tlsConfig := &tls.Config{}
tlsConfig.Certificates = make([]tls.Certificate, 3)
// go http server treats the 0'th key as a default fallback key
tlsConfig.Certificates[0], err = tls.LoadX509KeyPair("test0.pem", "key.pem")
if err != nil {
t.Fatal(err)
}
tlsConfig.Certificates[1], err = tls.LoadX509KeyPair("test1.pem", "key.pem")
if err != nil {
t.Fatal(err)
}
tlsConfig.Certificates[2], err = tls.LoadX509KeyPair("test2.pem", "key.pem")
if err != nil {
t.Fatal(err)
}
tlsConfig.BuildNameToCertificate()
http.HandleFunc("/", myHandler)
server := &http.Server{
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
TLSConfig: tlsConfig,
}
listener, err := tls.Listen("tcp", ":8443", tlsConfig)
if err != nil {
t.Fatal(err)
}
log.Fatal(server.Serve(listener))
}
サーバーにはStartTLSメソッドがありません。 – Ostad
実例で訂正。このより完全な例では、リスナーを適切に作成してサーバーを起動します。 – foo
ここにルータを追加する必要がありますか? – Saransh