У меня есть клиент и сервер gRPC, оба защищены сертификатом ssl.Без промежуточного прокси эти работают отлично.В качестве теста, когда я намеренно создаю ошибочные сертификаты, он терпит неудачу.Доказательство позже в этом посте - это не проблема с сертификатом.
код сервера gRPC:
// Creates a new gRPC server
// Create the TLS credentials
creds, err := credentials.NewServerTLSFromFile("configs/cert/servercert.pem", "configs/cert/serverkey.pem")
if err != nil {
log.Fatalf("could not load TLS keys: %s", err)
}
// Create an array of gRPC options with the credentials
opts := []grpc.ServerOption{grpc.Creds(creds)}
// create a gRPC server object
s := grpc.NewServer(opts...)
код клиента gRPC:
// Create the client TLS credentials
creds, err := credentials.NewClientTLSFromFile("configs/cert/servercert.pem", "")
if err != nil {
log.Fatalf("could not load tls cert: %s", err)
}
conn, err := grpc.Dial(grpcUri, grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("Unable to connect: %v", err)
}
сейчас я пытаюсь использоватьпрямой прокси (который был протестирован и отлично работает на обычных HTTP-запросах API).Однако он постоянно завершает работу при запросах gRPC через прокси.
Я использую cuttle , который внутренне использует goproxy со следующей настройкой.Обратите внимание, что логический InsecureSkipVerify
был опробован как true
, так и false
.С моим (ограниченным) пониманием SSL, это должно быть false
, так как он будет проверять сертификат на наличие сертификата в сети, и они самозаверяющие, поэтому, естественно, он потерпит неудачу.Однако, опять же, я попытался true
и false
// Config proxy.
proxy := goproxy.NewProxyHttpServer()
proxy.Tr = &http.Transport{
// Config TLS cert verification.
TLSClientConfig: &tls.Config{InsecureSkipVerify: !cfg.TLSVerify},
Proxy: http.ProxyFromEnvironment,
}
Запуск прокси между клиентом и сервером gRPC приводит к следующей ошибке:
transport: аутентификациясбой рукопожатия: x509: сертификат подписан неизвестным органом (возможно, из-за «x509: недопустимая подпись: родительский сертификат не может подписать этот тип сертификата» при попытке проверить сертификат кандидата в полномочия «тестовый сервер»
, которыйуказывает на то, что это проблема с сертификатом, однако gRPC безупречно работает без прокси-сервера, как указано и протестировано ранее.
также обратите внимание: я не хочу запускать gRPC за прокси-сервером, но вынужден работать из-за среды разработки.Сервер и прокси-сервер gRPC работают на одной и той же док-машине. Наличие одного и того же IP-адреса приведет к следующей конфигурации, которая просто уничтожит друг друга (поверьте мне, я все равно попробовал).
ENV http_proxy 192.168.99.100:3128
ENV https_proxy 192.168.99.100:3128
ENV no_proxy 192.168.99.100 # <- this would be the gRPC server IP, which is the same as the proxy. resulting in nothing being run through a proxy.
Разделение IP-адресав докере решил бы эту проблему, однако я бы ничего не узнал иВы хотели бы решить это.Я попытался настроить, как ответил здесь , чтобы установить разные внутренние IP-адреса докера, однако, ip останется пустым (будет установлена только сеть), а доступ к новому IP будет просто тайм-аут.