【问题标题】:TLS for GRPC service running behind Nginx using Golang使用 Golang 在 Nginx 后面运行的 GRPC 服务的 TLS
【发布时间】:2018-11-30 08:30:50
【问题描述】:

我有一个使用 GRPC 的颤振应用程序(基于 dart)和一个 GoLang 服务器。

我想保护它,所以我尝试用certbot 设置Ngninx(我是新来的),但是机器人需要一个挑战,它连接到Web 服务(用于域)以获得一个http 响应,我的服务没有提供。可以在同一端口上同时运行 GRPC 和 HTTP 服务器,但我不明白如何为此设置 Nginx

然后我尝试使用autocert 为我的服务本身设置 TLS,但是使用 acme 执行此操作需要相同的 Web 服务响应,否则我必须提供手动证书并跳过不安全验证,这在 dart 中目前不可用(只有两个选项可用secureinsecure)。在本地测试 autocert 也无济于事,因为它甚至不会创建本地证书(至少对我而言)。

我还读到了一个需要 DNS TXT 记录的 DNS 质询,但我不确定它是否会要求我在每次续订时提供新的 TXT 记录。

无论如何,我很困惑如何继续前进。我将 GRPC 连接到实际的移动应用程序,并且在任何地方都没有找到很多关于此的教程或问题。我的 GoLang 服务器还与其他内部微服务交互,因此支持 TLS 也意味着重新部署所有其他启用了安全标志的服务。

任何关于我应该做些什么来保护我的 GRPC 与应用程序连接的帮助,将是惊人的!

相关文档:

抱歉,如果这是一个愚蠢的问题,但我已经坚持了一周。

【问题讨论】:

    标签: ssl go nginx dart grpc


    【解决方案1】:

    只是发布我最终为我的设置所做的事情。 Nginx 确实支持 1.3.10+ 版本的 GRPC,但需要大量手动工作和 cron 作业来自动更新证书,而且它缺少操作文档。

    我最终改用了 Traefik,我已经在一篇博文 here

    上记录了整个过程以及我选择 Traefik 的原因

    简而言之,Traefik 允许更简单的设置和非常详细的 GRPC 文档开始。另一个优点是它在 docker 内部运行,因此可以在我的 mac 上轻松测试我在服务器上部署的相同版本。它在包装盒中提供自动证书更新,并且通过 DNS 质询,我可以轻松验证域。

    用于在反向代理端终止 TLS 的示例 TOML 文件,用于 GRPC 和普通 REST 服务,支持 http(适用于旧应用)和 https

    defaultEntryPoints = ["http", "https"]
    logLevel = "INFO"
    [traefikLog]
    [accessLog]
      filePath = "/var/log/access.log"
      format = "json"
    [entryPoints]
      [entryPoints.http]
      address = ":80"
      [entryPoints.https]
      address = ":443"
        [entryPoints.https.tls]
    [api]
    [file]
    [acme]
    email = "admin@example.com"
    storage = "acme.json"
    entryPoint = "https"
    acmeLogging = true
      [acme.dnsChallenge]
        provider = "gcloud"
      [[acme.domains]]
        main = "*.example.com"
        sans = ["www.example.com"]
    [backends]
      [backends.foo]
        [backends.foo.servers.server1]
        url = "h2c://127.0.0.1:3000"
      [backends.bar]
        [backends.bar.servers.server1]
        url = "http://127.0.0.1:3001"
    [frontends]
      [frontends.foo]
      backend = "foo"
        [frontends.foo.routes.server1]
        rule = "Host:foo.example.com"
      passHostHeader = true
      passTLSCert = false
      [frontends.bar]
      backend = "bar"
        [frontends.bar.routes.server1]
        rule = "Host:bar.example.com"
      passHostHeader = true
      passTLSCert = false
    

    唯一的问题是找出供应商 (dnsChallenge) 的 Google Cloud 设置,如果是第一次这样做,很难找到和设置!阅读有关使用 GRPC 配置 traefik 的更多信息here

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2019-07-20
      • 2017-05-28
      • 2021-10-21
      • 2021-10-03
      • 2020-08-15
      • 2022-11-01
      • 2015-11-20
      相关资源
      最近更新 更多