【问题标题】:How to set up docker-compose containers for gRPC TLS connection?如何为 gRPC TLS 连接设置 docker-compose 容器?
【发布时间】:2018-02-14 03:21:50
【问题描述】:

我有一个 gRPC 客户端和一个服务器作为使用 docker-compose 声明的两个 docker 容器。

version: '3.3'
services:
  apiserver:
    image: golang:latest
    container_name: apiserver
    expose:
      - "3000"
    ports:
      - "3000:3000"
    command: go run cmd/apiserver/main.go

  userserver:
    image: golang:latest
    container_name: userserver
    expose:
      - "3001"
    ports:
      - "3001:3001"
    command: go run cmd/userserver/main.go

我省略了一些东西,比如卷等,因为我认为它们与问题无关。

当客户端尝试拨号服务器时,我收到错误TLS handshake error from 172.22.0.1:34824: tls: oversized record received with length 21536

服务器(用户服务器):

lis, err := net.Listen("tcp", "userserver:3001")
if err != nil {
    logger.Critical(ctx, "failed to listen: %v", err)
}

grpcServer := grpc.NewServer()
userServer := userserver.New()
pb.RegisterDomainServer(grpcServer, userServer)
rpcErr := grpcServer.Serve(lis)

if rpcErr != nil {
    logger.Critical(ctx, "failed to serve: %v", rpcErr)
}

客户端(apiserver):

conn, err := grpc.Dial("userserver:3001", grpc.WithInsecure())
if err != nil {
    return err
}
defer conn.Close()

client := pb.NewDomainClient(conn)
_, err = client.Dispatch(ctx, &pb.Command{
    Name:    command,
    Payload: payload,
})

信息

客户端是apiserveruserserver是gRPC服务器,之所以叫客户端apiserver是因为它也是http代理。所以apiserver 容器尝试拨打userserver 容器

【问题讨论】:

  • 你为什么要从服务器监听 userip? lis, err := net.Listen("tcp", "userserver:3001") 服务器应该注册到它自己的 ip 和/或端口。 More info net pkg
  • 当你拨号时应该是apiserver:port
  • 客户端是apiserveruserserver是gRPC服务器,之所以叫客户端apiserver是因为它也是http代理。所以apiserver 容器尝试拨打userserver 容器
  • WithInsecure 禁用传输安全性。
  • 是的,但我认为我需要它,对吗?我没有使用任何证书,只是想让它在 atm 工作

标签: go docker-compose grpc


【解决方案1】:

你不见了grpc.Creads(...)

我们正在使用此代码:

package main

import(
    "crypto/tls"
    "crypto/x509"
    "crypto/x509/pkix"
    "io/ioutil"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
    "mysource.com/packages/grpcserver"
)

func main(){
    cert := "/path/to/cert.crt"
    key := "/path/to/cert.key"
    caCrt := "/path/to/my.ca"

    certificate, err := tls.LoadX509KeyPair(cert, key)
    if err != nil {
        return
    }   
    certPool := x509.NewCertPool()

    ca, err := ioutil.ReadFile(caCrt)
    if err != nil {
        return
    }

    if ok := certPool.AppendCertsFromPEM(ca); !ok {
        return
    }
    creds := credentials.NewTLS(&tls.Config{
        ClientAuth:   tls.RequireAndVerifyClientCert,
        Certificates: []tls.Certificate{certificate},
        ClientCAs:    certPool,
        MinVersion:   tls.VersionTLS12,
    })

    grpcServer := grpc.NewServer(grpc.Creds(creds))
    server := grpcserver.NewGrpcServer()
    grpcserver.RegisterGrpcServer(grpcServer, server)

    lis, err := net.Listen("tcp", "0.0.0.0:11311")      
    log.Fatal(grpcServer.Serve(lis))
}

【讨论】:

  • 但我不想使用任何证书,或者 tls 不可能?
  • 您可以随意填写tls.Config字段。例如:InsecureSkipVerify 禁用所有证书检查。
  • @Marc 对。你可以这样使用creds := credentials.NewTLS(&tls.Config{ ClientAuth: tls.InsecureSkipVerify})
  • 我在服务器上设置了creds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) grpcServer := grpc.NewServer(grpc.Creds(creds))creds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) conn, err := grpc.Dial("userserver:3001", grpc.WithTransportCredentials(creds)) 但仍然是同样的错误
  • 但不是 :( 在这种情况下,我认为 tls 配置或 WithInsecure 不是问题,我的 docker-compose 设置一定有问题
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2019-04-14
  • 2017-07-11
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多