Как избежать установки DnsEndpointIdentity на стороне клиента - PullRequest
0 голосов
/ 26 октября 2019

Итак, в основном у меня есть приложение, в котором у меня есть один клиент и две службы, которые предоставляют конечные точки через netTcpBinding или netNamedPipe. Кроме того, вся связь между сервисами и клиентом защищена сертификатом (сейчас я использую самонадежный сертификат).

Работает нормально, но при создании экземпляра EndpointAddress мне нужно также установить DnsEndpointIdentity с именем сертификата, который используется на стороне службы. Так это выглядит так:

new EndpointAddress(serviceUrl, new DnsEndpointIdentity("MyCertificateName"));

Итак, мой вопрос: это нормально? Есть ли способ избежать установки его на стороне клиента?

1 Ответ

1 голос
/ 28 октября 2019

Это нормальное явление, личность не может быть невежественной, она представляет собой личность сервера. Стороннее лицо может выдать себя за сервисную программу, чтобы разрешить вызов на стороне клиента, чтобы достичь цели кражи информации на стороне клиента. Чтобы клиент не нашел неправильный сервер, имя хоста в сертификате (субъект) должно совпадать с именем хоста, которое предоставляет клиент (идентификатор DNS). Мы также можем использовать открытый ключ сертификата в качестве идентификатора, поскольку открытый ключ сертификата является открытым для внешних пользователей.

<identity>
                  <rsa value="...."/>
                </identity>

Вот пример кода для получения открытого ключа сертификата.

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2 cert = null;
            foreach (var certificate in store.Certificates)
            {
                if (certificate.Subject.Contains("myhostname"))
                {
                    cert = certificate;
                    break;
                }
            }
            if (cert==null)
            {
                return;
            }
            //output the public key
            string xmlKey = cert.PublicKey.Key.ToXmlString(false);
            //encoded
            string encodedkey = System.Net.WebUtility.HtmlEncode(xmlKey);
            Console.WriteLine($"Public key:\n{encodedkey}");
            store.Close();
            store.Dispose();

Кстати, эти конфигурации могут автоматически генерироваться при вызове службы с помощью диалогового окна Добавить ссылку на службу.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...