Go语言 使用TLS和Nginx ingress加密gRPC通信(从REST迁移)

7z5jn7bk  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(92)

我目前正在探索gRPC作为REST的替代方案来进行客户端/服务器通信。
目前,我有一个Dart/flutter应用程序(我的客户端)主要在手机上运行。它通过REST与Go后端(我的服务器)进行通信。后端部署在Kubernetes集群上。后端前面有一个Nginx ingress控制器。我有一个Ingress规则可以做到这一点:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: fanout-ingress
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
    cert-manager.io/issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  rules:
  - host: fancy-domain.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api
            port:
              number: 8080
  tls:
  - hosts:
    - fancy-domain.com
    secretName: letsencrypt-prod-tls

字符串
通过这种设置,客户端可以简单地使用任何经典的HTTP客户端,我知道客户端将负责从fancy-domain.com获取证书以加密流量。由于此证书由受信任的第三方签名(在这种情况下让我们加密),客户端也可以确定它正在与正确的域进行通信。
当涉及到迁移到gRPC时,我很难理解这是如何工作的。我在网上找到的所有指南都显示客户端使用嵌入在客户端的证书(它们直接加载*.pem文件)。但看起来它们直接与后端对话。
我 * 认为 * 我想做的是让客户端使用我的域提供的证书(客户端应该把它们从域中取出来,而不是把证书以某种方式嵌入到某个地方),我想在入口控制器级别完成TLS终止。
这可能吗?我找不到任何关于这种设置的文档。

xxe27gdn

xxe27gdn1#

好吧,结果上面的代码(用于ingress规则)几乎已经准备好了。我只是添加了这个注解:

nginx.ingress.kubernetes.io/backend-protocol: 'GRPC'

字符串
然后在客户端,就像这样简单:

final channel = ClientChannel(
      'fancy-domain.com',
      port: 443,
      options: ChannelOptions(
        credentials: ChannelCredentials.secure(),
        codecRegistry:
            CodecRegistry(codecs: const [GzipCodec(), IdentityCodec()]),
      ),
    );
    var client = YourApiClient(channel);


一切都是开箱即用。

相关问题