Установите доверительные отношения для безопасного веб-сервиса с помощью SetCertificatePolicy () - PullRequest
3 голосов
/ 21 декабря 2011

Я написал .NET-приложение на C #, которое связывается с несколькими веб-сервисами. Все работает нормально, когда я ссылаюсь на веб-сервисы по незащищенному URL; но когда я ссылаюсь на те же веб-службы по защищенному URL-адресу HTTPS, я получаю исключение с сообщением «Не удалось установить доверительные отношения для безопасного канала SSL / TLS».

Я указал на эту веб-страницу http://www.codemeit.com/wcf/wcf-could-not-establish-trust-relationship-for-the-ssltls-secure-channel-with-authority.html. И добавил код в мое приложение. Это решает проблему, и теперь я могу использовать безопасные веб-службы, как и ожидалось.

Я заметил, что приведенный выше фрагмент кода говорит, что «не предназначен для использования в производственной среде», и в настоящее время он доверяет любому сертификату. Чтобы сделать его более безопасным для производственной среды, должен ли я проверять его на наличие собственного сертификата? Как это проверить, параметр 'cert' в методе RemoteCertificateValidate () содержит много информации, поэтому я не уверен, как или что мне следует проверять.

ТИА

1 Ответ

0 голосов
/ 23 декабря 2012

Весьма вероятно, что существует проблема с сертификатом, используемым сервером для идентификации себя, когда ваш клиент устанавливает безопасное соединение SSL.По моему опыту это в первую очередь вызвано тем, что сертификат, который возвращает сервер, либо не подписан доверенным корневым центром, либо один или несколько сертификатов в цепочке недействительны (например, срок их действия истек или они относятся к домену, отличному от того, которым вы являетесьподключение к).

Чтобы определить проблему, попробуйте перейти по URL-адресу конечной точки службы и узнать, сообщает ли браузер о каких-либо проблемах.Современные браузеры предупреждают вас, если сертификат сервера недействителен, и иногда сообщают вам, почему.Если вы используете Chrome и проблема с сертификатом, вы увидите красный крестик на значке замка в левом конце адресной строки (или омнибокса).Если вы нажмете на замок, Chrome сообщит вам, почему ему не нравится сертификат.

Что касается фрагмента кода, который вы нашли, то это пример того, как реализовать проверку сертификатов сервера в качестве клиента.Сеть.Тем не менее, сам пример никогда не будет отклонять соединение с сервером, даже если есть проблема с сертификатом сервера, следовательно, комментарий о неиспользовании кода в работе.Вне тестового сценария вы никогда не захотите общаться с сервером, личности которого вы не можете доверять из-за плохого сертификата.Чтобы обеспечить «производственную» реализацию, вы должны проверить значение параметра «error», чтобы увидеть, есть ли какие-либо проблемы с сертификатом, и вернуть true, только если их нет.

using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Attach my certificate validation delegate.
            ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;

            System.Net.HttpWebRequest request = WebRequest.CreateHttp("https://www.google.com");
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        }

        private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            if (error == SslPolicyErrors.None)
            {
                return true;
            }

            return false;
        }
    }
}

В этом примере IЯ возвращаю true из моего делегата ServerCertificateValidationCallback, если значение ошибки равно SslPolicyErrors.None, в противном случае я возвращаю false, что создает исключение.Чтобы этот пример работал, я использовал Fiddler , чтобы прокси-запрос и вернуть ненадежный сертификат в мой код клиента.Если вы перейдете к https://www.google.com в нормальных условиях, вы должны не увидеть какие-либо ошибки сертификатов, так как Google играет хорошо !!

PKI с сертификатами может быть грубым доменом для работы.С точки зрения документации В Википедии есть хорошая статья о PKI , в которой рассказывается, как доверенные органы используются для подписи сертификатов, используемых в SSL, чтобы клиенты могли доверять идентификатору сервера, с которым они общаются.

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