У меня есть простой вызов веб-службы, сгенерированный приложением Windows .NET (C #) 2.0, через прокси веб-службы, сгенерированный Visual Studio, для веб-службы, также написанной на C # (2.0). Это работало в течение нескольких лет, и продолжает делать это в дюжине или около того местах, где он работает.
Новая установка на новом сайте сталкивается с проблемой. При попытке вызвать веб-сервис происходит сбой с сообщением:
Не удалось установить доверительные отношения для безопасного канала SSL / TLS
В URL-адресе веб-службы используется SSL (https: //), но он работает уже давно (и продолжает это делать) из многих других мест.
Куда я смотрю? Может ли это быть проблемой безопасности между Windows и .NET, которая уникальна для этой установки? Если да, где я могу установить доверительные отношения? Я потерялся!
Ответы:
Мысли (основанные на боли в прошлом):
сервере(т. е. чтобы время UTC было правильным [игнорировать местное время, оно в значительной степени бесполезно]) - это, безусловно, имеет значение для WCF, поэтому может повлиять на обычный SOAP?источник
Следующие фрагменты исправят ситуацию, когда что-то не так с сертификатом SSL на сервере, который вы вызываете. Например, он может быть самоподписанным или имя хоста между сертификатом и сервером может не совпадать.
Это опасно, если вы вызываете сервер, находящийся вне вашего прямого контроля, поскольку вы больше не можете быть уверены в том, что разговариваете с сервером, к которому, как вы думаете, вы подключены. Однако, если вы имеете дело с внутренними серверами и получение «правильного» сертификата нецелесообразно, используйте следующую команду, чтобы сообщить веб-службе, что нужно игнорировать проблемы с сертификатом и отважно идти дальше.
Первые два используют лямбда-выражения, третье использует обычный код. Первый принимает любой сертификат. Последние два по крайней мере проверяют, что имя хоста в сертификате - то, которое вы ожидаете.
... надеюсь, вы найдете это полезным
источник
ServicePointManager.ServerCertificateValidationCallback = null;
должен вернуться к поведению по умолчанию.Очень простое решение «поймать все» заключается в следующем:
Решение от Себастьяна-Кастальди немного более детально.
источник
#If CONFIG = "Debug"
утверждение, чтобы оно активировалось только в режиме отладки. Работает отлично!Мне лично больше всего нравится следующее решение:
... затем, прежде чем запросить ошибку, сделайте следующее
Обнаружил это после консультации с Люком
источник
Если вы используете Windows 2003, вы можете попробовать это:
Ссылка: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...
источник
Если вы не хотите слепо доверять всем и делать исключение доверия только для определенных хостов, то более подходящим является следующее решение.
Затем просто вызовите Ssl.EnableTrustedHosts при запуске вашего приложения.
источник
Люк написал довольно хорошую статью об этом .. довольно прямо вперед .. попробуйте
Решение Люка
Причина (цитата из его статьи (минус ругань)) ".. Проблема с кодом выше в том, что он не работает, если ваш сертификат недействителен. Зачем мне публиковать на веб-странице с недействительным сертификатом SSL? Потому что Я дешевый, и мне не хотелось платить Verisign или одному из других ** - * s за сертификат для моей тестовой коробки, поэтому я сам подписал его. Когда я отправил запрос, меня бросили в прекрасное исключение:
System.Net.WebException Базовое соединение было закрыто. Не удалось установить доверительные отношения с удаленным сервером.
Я не знаю о вас, но для меня это исключение выглядело как нечто, что было бы вызвано глупой ошибкой в моем коде, которая вызывала сбой POST. Так что я продолжал искать, настраивать и делать разные странные вещи. Только после того, как я погуглил дерьмовую вещь, я обнаружил, что поведение по умолчанию после обнаружения недействительного сертификата SSL - выбрасывать это исключение. ..»
источник
Средство диагностики SSL от Microsoft может помочь выявить проблему.
ОБНОВЛЕНИЕ ссылка была исправлена сейчас.
источник
Я только что столкнулся с этой проблемой. Я решил обновить системное время, вручную синхронизировавшись с серверами времени. Для этого вы можете:
Adjust Date/Time
Internet Time
вкладкуChange Settings
Update Now
В моем случае это было синхронизировано неправильно, поэтому мне пришлось щелкнуть несколько раз, прежде чем он обновился правильно. Если он продолжает обновляться некорректно, вы можете даже попробовать использовать другой сервер времени из выпадающего списка.
источник
Попробуй это:
Обратите внимание, что вы должны работать как минимум с 4.5 .NET Framework
источник
У меня была похожая проблема в
.NET
приложении в Internet Explorer.Я решил проблему с добавлением сертификата (сертификат VeriSign Class 3 в моем случае) к сертификатам доверенных редакторов.
Вы можете получить сертификат, если экспортируете его из:
Спасибо
источник
У меня была эта ошибка при запуске веб-сервера с URL-адресом, как:
но для него не было сертификата, поэтому я получил DNS под названием
Просто намекаем на это решение здесь, так как это заняло первое место в Google.
источник
Для тех, кто столкнулся с этой проблемой через клиентскую сторону VS, однажды успешно добавил ссылку на службу и попытался выполнить первый вызов, получил следующее исключение: «Базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS». Если вы используете (как и в моем случае) URL-адрес конечной точки с IP-адресом и получили это исключение, тогда вам, вероятно, потребуется повторно добавить ссылку на службу, выполнив следующие действия:
Попробуй еще раз :). Спасибо
источник
В моем случае я пытался проверить SSL в моей среде Visual Studio, используя IIS 7.
Вот что я сделал, чтобы заставить его работать:
Под моим сайтом в разделе «Привязки ...» справа в IIS мне пришлось добавить привязку «https» к порту 443 и выбрать «Сертификат разработки IIS Express».
Под моим сайтом в разделе «Расширенные настройки ...» справа мне пришлось изменить «Активированные протоколы» с «http» на «https».
Под значком «Настройки SSL» я выбрал «Принять» для клиентских сертификатов.
Затем мне пришлось утилизировать пул приложений.
Мне также пришлось импортировать сертификат локального хоста в мой личный магазин, используя mmc.exe.
Мой
web.config
файл уже был настроен правильно, поэтому после того, как я разобрался со всем вышеперечисленным, я смог продолжить тестирование.источник
Мое решение (VB.Net, «промежуточная» (UAT) версия этого приложения должна работать с «промежуточным» сертификатом, но не влиять на запросы, когда они находятся на действующем сайте):
источник
Если не работает плохой сертификат, когда ServerCertificateValidationCallback вернет true; Мой ServerCertificateValidationCallback код:
Мой код, который помешал выполнить ServerCertificateValidationCallback:
Функция OnValidateCertificateError:
Я отключил код CertificateValidation и ServerCertificateValidationCallback работает очень хорошо
источник