Как подключиться к службе WCF, используя IP главной машины, на которой размещена служба?

#wcf

#wcf

Вопрос:

У меня есть защищенная служба WCF (https://MachineName:sslport/services ) самостоятельно размещенный на машине. Разные экземпляры одной и той же службы развернуты на разных машинах. Из клиентского приложения я могу подключиться к этим службам с помощью кода, т. е.) используя ChannelFactory() с тем же адресом конечной точки. Но если я попытаюсь получить доступ к службе, используя адрес конечной точки как (https://ipaddress:sslport/services) заменив имя машины на IP-адрес машины, я получаю сообщение об ошибке «не удалось установить доверительные отношения». Я знаю, что это ошибка, вызванная ssl-сертификатом, из-за которого не удалось установить доверительные отношения.

Существуют ли какие-либо настройки или возможные способы заставить это работать? Пожалуйста, укажите, если кто-нибудь знает об этом.

Ответ №1:

Сертификаты SSL основаны на именах, что означает, что проверка сертификата SSL завершится неудачей при попытке использовать IP-адрес вместо имени.

Вы могли бы изменить проверку, чтобы она всегда выполнялась успешно — это не конфигурация, а примерно 1-5 строк кода… НО это АБСОЛЮТНО НЕПРАВИЛЬНЫЙ путь, поскольку он сводит на нет всю цель сохранения SSL-сертификата в первую очередь, потому что тогда любой SSL-сертификат (подделанный, самоподписанный и т.д.) Будет принят как нормальный…

Возможно, если вы расскажете, ПОЧЕМУ вы хотели бы это сделать, есть вариант получше.

Ответ №2:

Я использую следующее, чтобы позволить мне обойти аутентификацию по умолчанию…

Непосредственно перед подключением я подключаю этот обратный вызов.

     System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate);
  

Затем в ‘ValidatRemoteCertificate’

     private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
    {
        if (policyErrors == SslPolicyErrors.None) return true;
        if (cert.Subject == "CN=whatever.address.com") return true;
        return false;
    }
  

Вы можете указать столько адресов, сколько захотите.

Надеюсь, это поможет!

Комментарии:

1. Яхия, код, который я предложил выше, явно допускает одно имя ‘whatever.address.com ‘, Я не предлагаю, чтобы он возвращал ‘true’ для каждого адреса. Если вы знаете, что домен действителен, независимо от состояния сертификата, то, конечно, можно принять его (если я чего-то не упускаю).