2017-12-17 15 views
1

이동을 사용하여 앱을 만들고 있는데 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으로 호스트되는 구성 웹 페이지를 만드는 것입니다.

답변

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()'함수는 인증서 파일에 대한 경로와 키 파일에 대한 경로를 요구하며이 정보를 포함하는 바이트 배열은 필요하지 않습니다. 귀하의 코드를 실행할 때 나는이 오류가 발생했습니다 : '열기 : 시스템이 지정된 파일을 찾을 수 없습니다.' – Felipe

+0

좋은 지적. 나는'tls.X509KeyPair'를 사용할 답안을 편집했습니다. 앞으로 [Loadx509KeyPair] (https://golang.org/src/crypto/tls/tls.go?s=5407:5474#L168)의 출처를보고 그 기능을 확인하십시오. – Marc

+0

안녕하세요,'tls.X509KeyPair'를 사용하도록 변경되었으며 모든 것이 작동합니다. 도와 주셔서 감사합니다! – Felipe