Невозможно установить sh https соединение с gRPC - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть клиент / серверный код gRP C, успешно работающий на моей локальной машине с клиентом, использующим ChannelCredentials. Небезопасный, но мне нужно перейти в безопасный режим. Мне не нужны какие-либо проверки сертификатов, только зашифрованный трафик c. Мне не удалось найти конфигурацию клиентского сервера, которая общается друг с другом. Запуск c# основного сервера (gRP C 2.27.0) и & c#. net Framework Framework (gRP C 2.28.1).

Сервер сообщает, что публикует на http & https как показано ниже:

[20:12:58 DBG] Using development certificate: CN=localhost (Thumbprint: 3EDA2E5BD559D75C9DCF058E0A6994EED859CD34)
[20:12:58 INF] Now listening on: https://localhost:5001
[20:12:58 INF] Now listening on: http://localhost:5000

и клиент работает с:

 ChannelBase channel = new Channel("localhost:5000", ChannelCredentials.Insecure);
 var client = new MyApp.MyAppClient(channel);
 var response = client.Test(request)

Если я переключаю клиента на SslCredentials, как показано ниже

 ChannelBase channel = new Channel("localhost:5001", new SslCredentials());
 var client = new MyApp.MyAppClient(channel);
 var response = client.Test(request)

, я получаю следующие ошибки.

ошибка сервера

[19:32:53 DBG] Failed to authenticate HTTPS connection.
System.IO.IOException: Authentication failed because the remote party has closed the transport stream.
   at System.Net.Security.SslStream.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)

ошибка клиента

Grpc.Core.RpcException: 'Status(StatusCode=Unavailable, Detail="failed to connect to all addresses")'

Я также попытался добавить (сервер) без изменений в ошибках.

   services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
      .AddCertificate(options =>
      {
          options.RevocationMode = X509RevocationMode.NoCheck;
          options.ValidateCertificateUse = false;
          options.AllowedCertificateTypes = CertificateTypes.SelfSigned;
      });

Любые предложения относительно того, что мне нужно сделать, чтобы заставить их говорить.

1 Ответ

0 голосов
/ 23 апреля 2020

Таким образом, вам нужно указать roots.pem, соответствующий сертификату dev, который вы используете на своем сервере при создании SslCredentials.

Если вы используете SslCredentials () без параметров, он будет использовать доверительные корни по умолчанию, которые работают только для сертификатов, которые были подписаны доверенными центрами сертификации (например, если вы говорите об «официальных» серверах, таких как googleapis.com и c, это определенно не относится к сертификатам разработки, которые вы используете на своем сервере) , Поэтому вам нужно использовать SslCredentials (yourCustomTrustRootsPem).

Кстати, с SSL / TLS не существует такого понятия, как «отсутствие проверок сертификатов». Клиент ВСЕГДА проверяет, что он подключен к нужному серверу (сертификат сервера проверяется их доверенными корнями) - без этого безопасная связь не будет иметь смысла, поскольку она будет слишком восприимчива к атаке «человек посередине». (сервер, проверяющий подлинность клиента, не является обязательным).

Не стесняйтесь обращаться к https://github.com/jtattermusch/grpc-authentication-kubernetes-examples за дополнительными ресурсами.

...