Как решить "не удалось установить доверительные отношения для безопасного канала SSL / TLS с полномочиями"
действительно думал, что я исправил эту проблему, но это было только замаскировано раньше.
у меня есть служба WCF, размещенная в IIS 7 с использованием HTTPS. Когда я просматриваю этот сайт в Internet Explorer, он работает как шарм, это потому, что я есть добавлен сертификат в хранилище локального корневого центра сертификации.
Я разрабатываю на 1 машине, поэтому клиент и сервер-это одна и та же машина. Сертификат является самозаверяющим непосредственно из оснастки управления IIS 7 в.
Я постоянно получаю эту ошибку...
не удалось установить доверительные отношения для безопасного канала SSL/TLS с полномочиями.
... при вызове из клиентской консоли.
Я вручную дал себе разрешения и сетевой сервис для сертификата, используя findprivatekey
и с помощью cacls.exe
.
Я попытался подключиться к службе с помощью SOAPUI, и это работает, поэтому это должно быть проблемой в моем клиентском приложении, которое это код, основанный на том, что используется для работы с HTTP.
где еще я могу посмотреть я, кажется, исчерпал все возможности, почему я не могу подключиться?
15 ответов:
в качестве обходного пути вы можете добавить обработчик к
ServicePointManager
' sServerCertificateValidationCallback
на стороне клиента:System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; };
но знайте, что это не очень хорошая практика поскольку он полностью игнорирует сертификат сервера и сообщает диспетчеру точек обслуживания, что любой сертификат хорош, что может серьезно поставить под угрозу безопасность клиента. Вы могли бы уточнить это и сделать некоторые пользовательские проверки (по имени сертификата, хэш и т. д.). по крайней мере, вы можете обойти проблемы при разработка при использовании сертификатов испытаний.
когда у меня такая проблема, это потому что клиент.конфигурация имела свои конечные точки, такие как:
https://myserver/myservice.svc
но сертификат ожидал
https://myserver.mydomain.com/myservice.svc
изменение конечных точек в соответствии с полным доменным именем сервера решает мою проблему. Я знаю, что это не единственная причина этой проблемы.
ваша проблема возникает потому, что вы используете самоподписанным ключом. Клиент не доверяет этому ключу, а сам ключ не предоставляет цепочку для проверки или список отзыва сертификатов.
У вас есть несколько вариантов - вы можете
отключить проверку сертификатов на клиент (плохой ход, человек в средних атак предостаточно)
воспользоваться этим инструментом для создания корневого центра сертификации и создайте сертификаты из этого (ОК двигайтесь, но все равно нет CRL)
создать внутренний корневой ЦС с помощью Сервер сертификатов Windows или другое Решения PKI, то поверьте, что корень cert (немного больно управлять)
купить сертификат SSL от одного из доверенных центров сертификации (дорого)
первые два используют лямбда, третий использует обычный код... надеюсь, вы найдете его полезным
//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; }
одно решение. Добавьте это в любом месте перед вызовом сервера на стороне клиента:
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };
Это следует использовать только в целях тестирования, поскольку клиент пропустит проверки безопасности SSL/TLS.
Я столкнулся с той же проблемой и смог решить ее с двумя решениями: Во-первых, я использовал оснастку MMC "сертификаты" для "учетной записи компьютера" и перетащил самозаверяющий сертификат в папку "Доверенные корневые центры сертификации". Это означает, что локальный компьютер (тот, который создал сертификат) теперь будет доверять этому сертификату. Во-вторых, я заметил, что сертификат был сгенерирован для некоторого внутреннего имени компьютера, но доступ к веб-службе осуществлялся с помощью другое имя. Это вызвало несоответствие при проверке сертификата. Мы сгенерировали сертификат для компьютера.оперативный.локальный, но доступ к веб-службе с помощью https://computer.internaldomain.companydomain.com. Когда мы переключили URL на тот, который используется для создания сертификата, мы больше не получили ошибок.
возможно, просто переключение URL-адресов сработало бы, но, сделав сертификат доверенным, вы также избегаете красного экрана в Internet Explorer, где он говорит вам об этом не доверяет сертификату.
пожалуйста, выполните следующие действия:
открыть служебную ссылку в IE.
нажмите на упоминание об ошибке сертификата в адресной строке и нажмите на Просмотр сертификатов.
проверка выдана на: имя.
возьмите выданное имя и замените упоминание localhost в имени базового адреса службы и конечной точки клиента полным доменным именем (FQDN).
Например: https:// localhost:203/SampleService.ВПВ На https://INL-126166-.groupinfra.com:203 / SampleService. svc
У меня была та же проблема. Я также добавил сертификаты CA в локальном магазине, но я сделал это неправильно.
с помощью консоли mmc (Пуск - > Выполнить ->mmc ) вы должны добавить сертификаты оснастка в качестве учетной записи службы (выбор учетной записи службы IIS) или учетной записи компьютера (он добавляет для каждой учетной записи на машине)
У меня была аналогичная проблема с самоподписанным сертификатом. Я мог бы решить его, используя имя сертификата, такое же, как полное доменное имя сервера.
В идеале, часть SSL должна управляться на стороне сервера. Клиенту не требуется устанавливать какой-либо сертификат для SSL. Кроме того, в некоторых сообщениях упоминается об обходе SSL из клиентского кода. Но я с этим совершенно не согласен.
Я просто перетащил сертификат в папку" Доверенные корневые центры сертификации " и вуаля все работало хорошо.
Ох. И я сначала добавил следующее из командной строки администратора:
netsh http add urlacl url=https://+:8732/Servicename user=NT-MYNDIGHET\INTERAKTIV
Я не уверен в названии, что нужно для пользователя (мой норвежский как вы можете видеть !):
user=NT-AUTHORITY/INTERACTIVE
?вы можете увидеть все существующие urlacl, выполнив команду:
netsh http show urlacl
в дополнение к ответам выше, вы можете столкнуться с этой ошибкой, если ваш клиент работает с неправильной версией TLS, например, если сервер работает только с TLS 1.2.
вы можете исправить это с помощью:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //tested in .NET 4.5
Это произошло при попытке подключиться к службе WCF, используя только имя хоста, например https://host/MyService.svc при использовании сертификата, привязанного к имени, например host.mysite.com.
переключение на https://host.mysite.com/MyService.svc и это разрешило ее.
Это произошло при попытке подключиться к службе WCF через. ИС, например,
https://111.11.111.1:port/MyService.svc
при использовании сертификата, привязанного к имени, например mysite.com.переключение на
https://mysite.com:port/MyService.svc
разрешить его.
просто исправлена аналогичная проблема.
Я понял, что у меня был пул приложений, который работал под учетной записью, которая имела только разрешение на чтение по сертификату, который он использовал.
приложение .NET может правильно получить сертификат, но это исключение было вызвано только при вызове GetRequestStream ().
разрешения сертификатов можно управлять через консоль MMC