1

는 자신의 문서하는 int 설명으로 내가 AWS API 게이트웨이 정확히 내 API 엔드 포인트 서비스 간의 연결을 확보하기 위해 노력하고있어 : http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-client-side-ssl-authentication.htmlAWS API 게이트웨이 클라이언트 인증서 랭

AFAIK 내가 인증서 양식 AWS를 복사해야 API 게이트웨이 및 http.ListenAndServeTLS 메서드를 사용하십시오. 그러나 두 파일을 허용합니다 : keyFilecertFile func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler). 내가 복사 링크를 클릭하면

(내가 설명을 목적으로 단축 한) 내가 얻을 수있는 유일한 것은이 같은 형식의 인증서입니다 example of certificate generated by AWS

(아래 이미지 참조) :

-----BEGIN CERTIFICATE----- 
MIIC6TCCAdGgAwIBAgIJAKbyiCf2f5J2MA0GCSqGSIb3DQEBCwUAMDQxCzAJBgNV 
fYe+dxR0PMFvfUpZaGgaY1ykQG1sNaw/b6NjNg9c1aEVSZ7b1eU/cBmb6XqHw0Ih 
7yHtBm+p8Px4NMAT9YhytTxPRBYpApfUsfPMa3qfUWvvj4TD0LR6bW980bebyxUn 
BigXToSFlPeiNGdU/Zpiw9crzplojNBFc= 
-----END CERTIFICATE----- 

그래서 내 질문에 정확히 어떻게 ListenAndServeTLS 메서드를 구성해야합니다 내 서비스에 대한 모든 요청 API 게이트웨이에서 있는지 확인하려면? 개인 키를 어디에서 찾을 수 있습니까? 나에게는 꽤 혼란 스럽다.

답변

3

클라이언트 인증서 AWS는 서비스에 요청을 보내는 클라이언트 (AWS 게이트웨이)를 인증하기위한 것입니다.

이 인증서는 서버를 시작하는 것이 아니라 요청을 인증하는 데 사용됩니다.

아래에서 사용 된 테스트되지 않은 코드의 예를 참조하십시오.

func Hello(w http.ResponseWriter, req *http.Request) { 
    io.WriteString(w, "hello, world!\n") 
} 

func main() { 
    http.HandleFunc("/hello", Hello) 

    certBytes, err := ioutil.ReadFile("aws-gateway.pem") 
    if err != nil { 
     log.Fatal(err) 
    } 
    block, certBytes := pem.Decode(certBytes) 

    cert, err := x509.ParseCertificate(block.Bytes) 
    if err != nil { 
     log.Fatal(err) 
    } 

    clientCertPool := x509.NewCertPool() 
    clientCertPool.AddCerts(cert) 

    tlsConfig := &tls.Config{ 
     ClientCAs: clientCertPool, 
     // NoClientCert 
     // RequestClientCert 
     // RequireAnyClientCert 
     // VerifyClientCertIfGiven 
     // RequireAndVerifyClientCert 
     ClientAuth: tls.RequireAndVerifyClientCert, 
    } 
    tlsConfig.BuildNameToCertificate() 

    server := &http.Server{ 
     Addr:  ":8080", 
     TLSConfig: tlsConfig, 
    } 

    server.ListenAndServeTLS("server.crt", "server.key") 
} 

이렇게하면 모든 요청에서 인증서를 제공하고 ClientCA 풀에서이를 확인해야합니다. 원하는 경우 클라이언트 풀에 더 많은 인증서를 추가 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 나는 아직도 어디에서'server.crt'와'server.key' 파일을 얻을 수 있는지 모르겠습니다. 귀하의 예제는 저에게 오류를 제공합니다 : 'open server.crt : 해당 파일이나 디렉토리가 없습니다' – mkatanski

+0

이것은 서비스의 서버 인증서와 키입니다. 자체 서명 된 인증서를 생성하십시오 (AWS와 호환되는지 또는 Let 's Encrypt로 무료로 제공되는지 확실하지 않음). –

+0

@WilliamPoussier OP가 언급하는 문제는 AWS가 클라이언트 인증서를 제공하지만 실제로 pem 키의 파일 복사본을 얻는 방법을 설명하지 않는다는 것입니다. http://docs.aws.amazon.com/cli/latest/reference/apigateway/get-client-certificate.html을 사용하여 PEM 인증서를 문자열로 가져온 다음 PEM을 만들고 텍스트를 삽입 할 수 있다고 가정합니다. 자체 서명 된 인증서이기는하지만 Let 's Encrypt는 더 안전합니다. –

관련 문제