我正在尝试确保AWS API Gateway与我的API端点服务之间的连接,正如他在其文档中所描述的那样:http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-client-side-ssl-authentication.html
AFAIK我需要复制证书形式AWS API Gateway并使用http.ListenAndServeTLS
方法。但它接受两个文件: keyFile 和 certFile
func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler)
。
我唯一得到的是这种格式的证书(为了解释的目的,我将其缩短了):
-----BEGIN CERTIFICATE-----
MIIC6TCCAdGgAwIBAgIJAKbyiCf2f5J2MA0GCSqGSIb3DQEBCwUAMDQxCzAJBgNV
fYe+dxR0PMFvfUpZaGgaY1ykQG1sNaw/b6NjNg9c1aEVSZ7b1eU/cBmb6XqHw0Ih
7yHtBm+p8Px4NMAT9YhytTxPRBYpApfUsfPMa3qfUWvvj4TD0LR6bW980bebyxUn
BigXToSFlPeiNGdU/Zpiw9crzplojNBFc=
-----END CERTIFICATE-----
所以我的问题是,我究竟需要配置ListenAndServeTLS
方法以确保对我的服务的任何请求来自API网关?在哪里可以找到私钥?这对我来说很困惑。
答案 0 :(得分: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池进行验证。当然,如果需要,您可以向客户端池添加更多证书。