Когда я использую подключение localhost, если я использую IP, он не подключается - PullRequest
0 голосов
/ 01 августа 2020

Я запускаю сервер и клиент на одном компьютере для тестирования. Если в клиенте я использую адрес localhost, он работает, но если я использую IP-адрес компьютера «192.16.1.33», он не работает. Сообщение об ошибке следующее:

    D0725 20:25:53.870862 Grpc.Core.Internal.NativeExtension gRPC native library loaded successfully.
D0725 20:25:53.872652 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "grpclb"
D0725 20:25:53.872779 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "cds_experimental"
D0725 20:25:53.872871 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "eds_experimental"
D0725 20:25:53.872962 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "lrs_experimental"
D0725 20:25:53.873053 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "priority_experimental"
D0725 20:25:53.873118 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "weighted_target_experimental"
D0725 20:25:53.873181 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "xds_routing_experimental"
D0725 20:25:53.873249 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "pick_first"
D0725 20:25:53.873311 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\lb_policy_registry.cc:39: registering LB policy factory for "round_robin"
D0725 20:25:53.873377 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\resolver\dns\c_ares\dns_resolver_ares.cc:504: Using ares dns resolver
I0725 20:25:55.903532 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\subchannel.cc:1033: Connect failed: {"created":"@1595701555.902000000","description":"OS Error","file":"T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\lib\iomgr\tcp_client_windows.cc","file_line":105,"os_error":"Unable to retrieve error string","syscall":"ConnectEx","wsa_error":10061}
I0725 20:25:55.904211 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\subchannel.cc:970: Subchannel 0000016821801D70: Retry immediately
I0725 20:25:55.904411 0 T:\src\github\grpc\workspace_csharp_ext_windows_x64\src\core\ext\filters\client_channel\subchannel.cc:997: Failed to connect to channel, retryin

Кажется, что канал создан, потому что это подканал 0000016821801D70, но по какой-то причине не может получить ответ от сервера.

Код сервера такой:

const int miPort = 5001;

            var cacert = File.ReadAllText("Keys/ca.crt");
            var cert = File.ReadAllText("Keys/server.crt");
            var key = File.ReadAllText("Keys/server.key");

            var keypair = new KeyCertificatePair(cert, key);
            var sslCreds = new SslServerCredentials(new List<KeyCertificatePair>
                                {
                                    keypair
                                }, cacert, false);

            Server server = new Server()
            {
                Services = { Gestor.BindService(new GestorAplicacionesService()) },
                //Ports = { new ServerPort("0.0.0.0", miPort, sslCreds) },
                Ports = { new ServerPort("localhost", miPort, sslCreds) },
            };
            server.Start();
            Console.WriteLine("Started server on port " + miPort);
            server.ShutdownTask.Wait();

Код моего клиента такой:

var miCaCertificate = File.ReadAllText("Keys/ca.crt");
                var miClientCertificate = File.ReadAllText("Keys/client.crt");
                var miClientPrivateKey = File.ReadAllText("Keys/client.key");

            var keypair = new KeyCertificatePair(_clientCertificate, _clientPrivateKey);
            var sslCreds = new SslCredentials(_caCertificate, keypair);

            var channel = new Channel(_serviceAddress, _port, sslCreds);
            var client = new Gestor.GestorClient(channel);

            await client.MiSaludoAsync();

Сертификаты работают, потому что с localhost он работает, но это сценарий, который я использую для создания самоподписанных сертификатов с помощью OpenSSL:

# Generate valid CA
openssl genrsa -passout pass:1234 -des3 -out ca.key 4096
openssl req -passin pass:1234 -new -x509 -days 365 -key ca.key -out ca.crt -subj  "/C=SP/ST=Spain/L=Valdepenias/O=Test/OU=Test/CN=Root CA"

# Generate valid Server Key/Cert
openssl genrsa -passout pass:1234 -des3 -out server.key 4096
openssl req -passin pass:1234 -new -key server.key -out server.csr -subj  "/C=SP/ST=Spain/L=Valdepenias/O=Test/OU=Server/CN=localhost"
openssl x509 -req -passin pass:1234 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

# Remove passphrase from the Server Key
openssl rsa -passin pass:1234 -in server.key -out server.key

# Generate valid Client Key/Cert
openssl genrsa -passout pass:1234 -des3 -out client.key 4096
openssl req -passin pass:1234 -new -key client.key -out client.csr -subj  "/C=SP/ST=Spain/L=Valdepenias/O=Test/OU=Client/CN=localhost"
openssl x509 -passin pass:1234 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt

# Remove passphrase from Client Key
openssl rsa -passin pass:1234 -in client.key -out client.key




pause

Я пробовал с сертификатами 2 серверов. Одно, которое я использую как общее имя "localhost", работает, когда я запускаю клиент на том же компьютере, но не работает, когда в клиенте я использую IP.

Позже я попробовал другой сертификат сервера , с общим именем IP, но я все еще не могу подключиться к серверу.

Я прочитал, что на сервере сертификатов

1 Ответ

1 голос
/ 01 августа 2020

Создание сертификата для IP немного отличается от создания сертификата для имени. Для сертификата вы можете добавить альтернативное имя (так вы создаете групповые или мультидоменные сертификаты) или список IP-адресов.

Проверьте конфигурацию OpenSSL, если [alt_names] правильный. См. https://medium.com/@antelle / how-to-generate-a-self-signed-ssl-certificate-for-an-ip-address-f0dd8dddf754 для получения дополнительной информации

Чтобы убедиться что ваш сертификат предназначен для доменного имени или IP-адреса, используйте команду openssl x509 -in client.crt -text -noout, в выводе этой команды вы увидите следующее:

        X509v3 extensions:
            X509v3 Subject Alternative Name:
                IP Address:127.0.0.1

, если он начинается с 'DNS:' вместо «IP-адреса» необходимо обновить создание сертификата.

...