Как я могу подключить клиент gRP C в рамках. NET к защищенному. NET базовому серверу? - PullRequest
4 голосов
/ 08 июля 2020

Я использую protobuf- net .Grp c на основном сервере. NET и пытаюсь выполнять вызовы из. NET Framework (4.7.2.) GRP C Client. Полный пример здесь: https://github.com/angelagyang/GRPCProtobufExample

Вот фрагмент моего клиента:

var channelCreds = new SslCredentials(GetRootCertificates());
var channel = new Channel("localhost", 5001, channelCreds);
var greeter = channel.CreateGrpcService<IGreeterService>();

С этой конфигурацией я получаю ошибку StatusCode="Unknown", Detail="Stream removed"..., когда вызов сервера. Я могу подключиться к серверу, если я установил ClientCertificateMode = ClientCertificateMode.NoCertificate на сервере. Однако я хочу, чтобы сервер запрашивал сертификат клиента и проверял сертификат с помощью отпечатка .

Например, в. NET Core, я могу использовать Grp c. Net .Client для настройки моего канала следующим образом:

var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
var channel2 = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
      HttpHandler = handler
});

Есть ли способ настроить клиента с сертификатом в. NET Framework, как это? Я новичок в gRPC /.NET и буду благодарен за любые предложения!

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Решен и обновлен исходный пример: https://github.com/angelagyang/GRPCProtobufExample

Вы можете настроить сертификат клиента, создав KeyCertificatePair для передачи в SslCredentials. Вам понадобится цепочка сертификатов в кодировке PEM и закрытый ключ в кодировке PEM.

var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/cert.pem"), File.ReadAllText($"{rootDir}/cert.key")); 
var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);

В целях тестирования я использовал самоподписанные сертификаты здесь: https://github.com/grpc/grpc/tree/master/src/core/tsi/test_creds

При отладке ставить GRPC_VERBOSITY = DEBUG и GRPC_DEBUG = ALL. Это может помочь устранить расплывчатые сообщения об ошибках. Например, я понял, что сертификат сервера, который я использовал для настройки HTTPS, не включает localhost.

0 голосов
/ 25 июля 2020

Исходя из того, что я пробовал и сделал работающим, вы можете избавиться от необходимости читать как cert.pem, так и cert.key. Кроме того, GetRootCertificate() будет работать только в том случае, если серверные системы размещены на хорошо известном надежном веб-сайте, таком как google.com или msdn.com или ему подобные, и localhost. Более подробный ответ можно найти здесь и здесь

Если мы намерены использовать наш собственный DNS хоста с SSL, создание сертификата сервера в pfx, назначенном вашему DNS и преобразование его в pem для клиентского приложения - это ваш путь к go. Использование таких инструментов, как openssl, поможет преобразовать кодировку сертификата.

openssl pkcs12 -in "<DiskLocationOfPfx>\ProjectName.pfx" -out "<TargetLocation>\certifcate.pem" -clcerts

После преобразования сертификата сервера в pem вы можете использовать

var channelCreds = new SslCredentials(File.ReadAllText($"{rootDir}/cert.pem"));
var channel = new Channel("www.youdns.com", 5001, secureCredentials);
...