目前有一个Go HTTP API使用github.com/gin-gonic/gin
库来执行mTLS,如下所示:
router := gin.New()
router.GET("/ping", handlers.GinHandler{GC: globalConf, H: handler.Ping}.Handle())
// I'm checking errors but just for simplicity it's ommitted
caCert, _ := ioutil.ReadFile("ca.crt")
caCertPool, _ := x509.SystemCertPool()
caCertPool.AppendCertsFromPEM(caCert)
tlsConfig := &tls.Config{
ClientCAs: caCertPool,
ClientAuth: tls.RequireAndVerifyClientCert,
}
server := &http.Server{
Addr: ":" + "8443",
TLSConfig: tlsConfig,
Handler: router,
}
server.ListenAndServeTLS("ssl.crt", "ssl.key")
为了与AWS Lambda兼容,我似乎需要使用类似github.com/apex/gateway
的东西,但只有一个ListenAndServe
函数,而不是像net/http
包那样使用ListenAndServeTLS
。
有可能在AWS Lambda函数中执行这样的mTLS吗?
或者,这是否需要重写以在API网关内执行mTLS?如果是,是否可以将证书转发到Go app/Lambda功能以检查CN?
是否可以在AWS Lambda中执行这样的mTLS作用
不,这是不可能的。TLS连接由API网关终止,然后网关通过AWS API调用您的Lambda函数。Lambda函数从不具有来自传入请求的网络连接,因此无法在Lambda函数内部执行mTLS。
或者这是否需要重写才能在API中执行mTLS网关?如果是,是否可以将证书转发到用于检查CN的Go应用程序/Lambda功能?
是的,必须在API网关上实现mTLS功能。我建议遵循这份官方指南。