2016-02-26 4 views
7

私は複数のドメインを持っています(abc.comとxyz.orgと言いましょう)。それは深い低レベルとnet.Listenなど、単純なhttp.ListenAndServeTLS(...)または同様のものを使用しないで行くことなく、ホスト名に基づいてキーと証明書を使用することは可能ですか? 基本的にはnginxの機能が好きです。net/httpでgolangで複数のドメインTLSをホストすることはできますか?

答えて

13

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)) 
} 
+0

サーバーにはStartTLSメソッドがありません。 – Ostad

+0

実例で訂正。このより完全な例では、リスナーを適切に作成してサーバーを起動します。 – foo

+0

ここにルータを追加する必要がありますか? – Saransh