2017-12-17 5 views
1

私はGoを使用してアプリケーションを作成していますが、ListenAndServeTLS関数を使用してhttpsサーバーを起動しようとしています。ここに私のコードは次のとおりです。ListenAndServeTLSへの文字列としての証明書とキーの受け渡し

func StartServer() { 
    defer config.CapturePanic() 
    c := config.GetInstance() 

    serverAddress := fmt.Sprintf(":%s", c.GetConfig().ServerPort) 
    server := http.Server{Addr: serverAddress} 

    log.Info("Starting local server") 
    http.HandleFunc("/", login.Handler) 
    http.HandleFunc("/login", login.Handler) 
    http.HandleFunc("/settings", settings.Handler) 

    //cert, _ := data.Asset("my-cert.pem") 
    //key, _ := data.Asset("my-key.pem") 
    err := server.ListenAndServeTLS("my-cert.crt", "my-cert.key") 
    if err != nil { 
     log.WithError(err).Fatal("Error stopping local server") 
    } 
} 

事は、私は私の実行可能ファイル内に自分の証明書とキーを埋め込み、その後、文字列またはバイト配列としてserver.ListeAndServeTLS関数に渡すしたいということです。しかし、この関数はこれらの型の引数をとらない。これを行う別の方法がありますか?

注:プライベートキーをクライアントアプリケーションに埋め込むのは悪い習慣ですが、私がここでやろうとしているのは、https://localhost:8080としてホストされる設定Webページを作成することです。

答えて

2

独自のサーバーオブジェクトを構築しても、依然としてListenAndServeTLSを呼び出すことができます。 tls configには証明書があるので、渡されたファイル名は無視されます。私は簡潔にするため、エラーのリターンを省略してる 、しないでください。あなたの応答のための

// Generate a key pair from your pem-encoded cert and key ([]byte). 
cert, err := tls.X509KeyPair(<cert contents>, <key contents>) 

// Construct a tls.config 
tlsConfig := &tls.Config{ 
    Certificates: []tls.Certificate{cert} 
    // Other options 
} 

// Build a server: 
server := http.Server{ 
    // Other options 
    TLSConfig: tlsConfig, 
} 

// Finally: serve. 
err = server.ListenAndServeTLS("", "") 
+0

こんにちは、ありがとう。私のコードをあなたの提案に変更しましたが、 'tls.Loadx509KeyPair()'関数は証明書ファイルへのパスと、この情報を含むバイト配列ではなくキーファイルへのパスも期待しています。あなたのコードを実行したとき、私はこのエラーを受け取りました: 'open:システムは指定されたファイルを見つけることができません。 ' – Felipe

+0

良い点。私は 'tls.X509KeyPair'を使う答えを編集しました。将来、[Loadx509KeyPair](https://golang.org/src/crypto/tls/tls.go?s=5407:5474#L168)のソースを見て、それが何をしているのかを見ることができます。 – Marc

+0

こんにちは、私は 'tls.X509KeyPair'を使うように変更しました。助けてくれてありがとう! – Felipe

関連する問題