如何在 istio mTLS 设置中进行 GRPC 身份验证?

How do you do GRPC authentication in an istio mTLS setup?

我有一堆 GRPC 微服务,它们使用的是自签名证书。我将身份验证信息添加到 GRPC 通道,然后用于识别端点并提供正确的服务。

现在我想迁移到 Istio mTLS。

在第一阶段,我让 Istio 绕过所有 GRPC 连接,我的服务像现在一样工作。

第二阶段,我想将 TLS 交给 Istio,但我一直卡在如何将身份验证信息传递给 GRPC?

您如何在 Istio mTLS 设置中处理身份验证?

GRPC 可以支持 other authentication mechanisms 有没有人用这个将 Istio 授权信息注入 GRPC?关于您如何在您的设置中实现它的任何其他建议

我正在使用 go-lang 以防万一这对提供任何其他信息有用。

谢谢

这样做的一种方法是使用 grpc.WithInsecure(),这样您就不必向您的服务添加证书,因为 pods 中的 istio-proxy 容器将 TLS 终止任何传入连接。

客户端:

conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())

服务器端:

s := grpc.NewServer()
lis, _ := net.Listen("tcp", "localhost:50051")

// error handling omitted
s.Serve(lis)

如果您仍然需要将 TLS 用于本地部署等,您可以简单地使用配置选项来指定它,例如:

var conn *grpc.ClientConn
var err error
// error handling omitted do not copy paste

if ( config.IstioEnabled ) {
    conn, err = grpc.Dial("localhost:50051", grpc.WithInsecure())

} else {
    creds, _ := credentials.NewClientTLSFromFile(certFile, "")
    conn, err = grpc.Dial("localhost:50051", grpc.WithTransportCredentials(creds))

}

Reference.

我通过为我的请求生成 JWT 令牌解决了这个问题,并使用拦截器注入了令牌。从 GRPC interceptor for authorization with jwt

中汲取灵感