amazon-web-services - Go lang 中的 AWS API Gateway 客户端证书

标签 amazon-web-services go aws-api-gateway client-certificates

我正在尝试确保 AWS API Gateway 和我的 API 端点服务之间​​的连接完全按照他的文档中的描述:http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-client-side-ssl-authentication.html

据我所知,我需要从 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 网关?我在哪里可以找到私钥?这让我很困惑。

最佳答案

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 池对其进行验证。当然,如果需要,您可以向客户端池添加更多证书。

关于amazon-web-services - Go lang 中的 AWS API Gateway 客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864955/

相关文章:

mongodb - 如何向 bson.D 对象添加值

aws-api-gateway - 如何在 AWS API Gateway 中传递 Content-Type?

amazon-web-services - 如何使用cloudformation创建私有(private)AWS Api网关?

aws-lambda - 如何使用无服务器框架从节点 JS AWS lambda 后端将二进制内容传递到 API Gateway?

amazon-web-services - 使用 Gradle 插件将 docker 镜像推送到 ECR

php - 如何从亚马逊的商品广告 API 获取图片和描述?

go - 代理 exec.Cmd Stdout/Stderr 不丢失 TTY

amazon-web-services - AWS Elastic Beanstalk Go文件权限问题

amazon-web-services - DynamoDB : Query for range key in a set of non-sequential range keys

go - 在银杏测试中检查非空值的正确方法