Подтвердить что ты не робот

Как решить "Не удалось установить доверительные отношения для безопасного канала SSL/TLS с полномочиями"

На самом деле я думал, что эта проблема исправлена, но она была только замаскирована раньше.

У меня есть служба WCF, размещенная в IIS 7 с использованием HTTPS. Когда я просматриваю этот сайт в Internet Explorer, он работает как прелесть, потому что я добавил сертификат в локальный корневой центр сертификации.

Я разрабатываю на 1 машине, поэтому клиент и сервер - это одна и та же машина. Сертификат самоподписывается непосредственно из оснастки управления IIS 7.

Я постоянно получаю эту ошибку...

Не удалось установить доверительные отношения для безопасного канала SSL/TLS с полномочиями.

... при вызове с клиентской консоли.

Я вручную предоставил мне разрешения и службу сети сертификату, используя findprivatekey и используя cacls.exe.

Я попытался подключиться к службе с помощью SOAPUI, и это работает, поэтому это должно быть проблемой в моем клиентском приложении, которое является кодом, основанным на том, что использовалось для работы с http.

Где еще я могу посмотреть, я, кажется, исчерпал все возможности, почему я не могу подключиться?

4b9b3361

Ответ 1

В качестве обходного пути вы можете добавить обработчик к ServicePointManager ServerCertificateValidationCallback на стороне клиента:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
        {
            return true;
        };

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

Ответ 2

Когда у меня возникает эта проблема, это потому, что у client.config были свои конечные точки, например:

 https://myserver/myservice.svc 

но сертификат ожидал

 https://myserver.mydomain.com/myservice.svc

Изменение конечных точек в соответствии с полным доменным именем сервера устраняет мою проблему. Я знаю, что это не единственная причина этой проблемы.

Ответ 3

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

У вас есть несколько вариантов - вы можете

  • отключить проверку сертификата на клиент (плохой ход, человек в средние атаки изобилуют)

  • использовать makecert для создания корневого ЦС и создавать сертификаты из этого (ok переместить, но CRL по-прежнему нет)

  • создать внутренний корневой ЦС, используя Сервер сертификатов Windows или другие Решение PKI затем доверяет этому корню cert (немного боль для управления)

  • купить сертификат SSL от одного доверенных ЦС (дорого)

Ответ 4

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

            //Trust all certificates
            System.Net.ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

            // trust sender
            System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

            // validate cert by calling a function
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

    // callback used to validate the certificate in an SSL conversation
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
    {
        bool result = false;
        if (cert.Subject.ToUpper().Contains("YourServerName"))
        {
            result = true;
        }

        return result;
    }

Ответ 5

Однострочное решение. Добавьте это где-нибудь перед вызовом сервера на стороне клиента:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

Это следует использовать только для целей тестирования, поскольку клиент будет пропускать проверки безопасности SSL/TLS.

Ответ 6

Я столкнулся с той же проблемой, и я смог решить ее с помощью двух решений: Во-первых, я использовал оснастку MMC "Сертификаты" для "Учетной записи компьютера" и перетащил самозаверяющий сертификат в папку "Доверенные корневые центры сертификации". Это означает, что локальный компьютер (тот, который сгенерировал сертификат) теперь будет доверять этому сертификату. Во-вторых, я заметил, что сертификат был сгенерирован для некоторого внутреннего имени компьютера, но к веб-службе обращался с использованием другого имени. Это вызвало несоответствие при проверке сертификата. Мы создали сертификат для computer.operations.local, но получили доступ к веб-сервису, используя https://computer.internaldomain.companydomain.com. Когда мы переключили URL-адрес на тот, который использовался для создания сертификата, мы не получили больше ошибок.

Возможно, сработало бы просто переключение URL-адресов, но, доверяя сертификату, вы также избегаете красных экранов в Internet Explorer, где он сообщает, что он не доверяет сертификату.

Ответ 7

Проделайте следующие шаги:

  • Открыть ссылку сервиса в IE.

  • Нажмите на ссылку об ошибке сертификата в адресной строке и нажмите "Просмотреть сертификаты".

  • Проверить выдано: имя.

  • Возьмите выпущенное имя и замените упоминание localhost в имени базового адреса конечной точки службы и клиента с полным доменным именем (FQDN).

Например: https:// localhost: 203/SampleService.svc Для https:// INL-126166-.groupinfra.com: 203/SampleService.svc

Ответ 8

Если вы используете ядро .net, попробуйте это:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
        new X509ServiceCertificateAuthentication()
        {
            CertificateValidationMode = X509CertificateValidationMode.None,
            RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
        };

Ответ 9

У меня была аналогичная проблема с самозаверяющим сертификатом. Я мог бы решить это, используя имя сертификата, такое же, как полное доменное имя сервера.

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

Ответ 10

У меня была та же проблема. Я также добавил CA сертификаты в локальном магазине, но я сделал это НЕПРАВИЛЬНО.

Используя консоль MMC (Пуск → Выполнить → ммк), вы должны добавить оснастку Сертификаты в качестве учетной записи службы (выбор учетной записи службы IIS) или учетной записи компьютера (он добавляется для каждой учетной записи на машине)

Вот образ того, о чем я говорю  Add snap-in for a service account or the computer account

Теперь вы можете добавить сертификаты центров сертификации (доверенных корневых центров сертификации и промежуточных центров сертификации), и все будет нормально работать

Ответ 11

В дополнение к ответам выше, вы можете столкнуться с этой ошибкой, если ваш клиент работает с неверной версией TLS, например, если на сервере работает только TLS 1.2.

Вы можете исправить это с помощью:

// tested in .NET 4.5:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Ответ 12

Я просто перетащил сертификат в папку "Доверенные корневые центры сертификации", и вояла все хорошо работало.

О. И я сначала добавил следующее из командной строки администратора:

netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV

Я не уверен в имени, которое вам нужно для пользователя (мой норвежский, как вы можете видеть!):   user=NT-AUTHORITY/INTERACTIVE?

Вы можете увидеть все существующие urlacl, выполнив команду: netsh http show urlacl

Ответ 13

Это произошло при попытке подключиться к службе WCF через. IP, например. https://111.11.111.1:port/MyService.svc при использовании сертификата, привязанного к имени, например. mysite.com.

Переключение на https://mysite.com:port/MyService.svc разрешило его.

Ответ 14

Это произошло при попытке подключения к службе WCF с использованием только имени узла, например. https://host/MyService.svc при использовании сертификата, привязанного к имени, например. host.mysite.com.

Переключение на https://host.mysite.com/MyService.svc, и это разрешило его.

Ответ 15

Просто исправлена ​​аналогичная проблема.

Я понял, что у меня есть пул приложений, который запускался под учетной записью, которая имела только разрешение на чтение по используемому сертификату.

Приложение .NET может правильно получить сертификат, но это исключение было выбрано только при вызове GetRequestStream().

Разрешения на сертификаты можно управлять с помощью консоли MMC

Ответ 16

Я ХОЧУ ПРОВЕРИТЬ БОЛЬШУЮ ЧАРТОВУЮ КОЛЛЕКЦИЮ, ЗАПРОШЕННУЮ ДР. ЛАМАТУ, ДЛЯ ЕГО ПОМОЩИ ПО МОЕМУ БРАКУ. Мой муж был отвергнут после 14 лет брака только потому, что из-за другой женщины он и я оставили детей и пострадали. Однажды, когда я читал в Интернете, я увидел сообщение о том, как этот заклинатель доктор ЛАМАТУ заклинатель заклинаний. Помог женщине вернуть ее мужа, и я дал ему ответ, и он сказал мне, что женщина разыграла заклинание на моего мужа, и он сказал мне, что он поможет мне, и через 3 дня я верну мужа. Я поверил ему из-за его вежливого подхода и искренности, и сегодня я рад сообщить вам всем, что этот заклинатель способен вернуть любовников, потому что теперь я счастлив со своим мужем и моими детьми. Отправьте ему электронное письмо на [email protected] ком для любой семейной помощи. или WhatsApp его через +14158551136. Он хорош во всем, что он делает, и заслуживает доверия. У него есть постоянное решение любых проблем, таких как: Заклинание лотереи Заклинание любви Заклинание силы Заклинание успеха Болезнь Заклинание беременности Брак Заклинание защиты Заклинание защиты Заклинание победы в судебном деле Заклинание удачи Заклинание и т.д.

Ответ 17

Добавьте это в код клиента:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
    delegate
    {
        return true;
    });