Можно ли заставить тестовый клиент WCF принять самозаверяющий сертификат?
У меня есть веб-служба WCF, работающая в IIS 7, с использованием самозаверяющего сертификата (это доказательство концепции, чтобы убедиться, что это маршрут, который я хочу отправить). Он должен использовать SSL.
Можно ли использовать тестовый клиент WCF для отладки этой службы без необходимости использования несамоходного сертификата?
Когда я пытаюсь получить эту ошибку:
Ошибка: невозможно получить метаданные из https:///Service1.svc Если это сообщение Windows (R) Фундаментальное обслуживание, к которому вы имеете пожалуйста, проверьте, что у вас есть включенных метаданных на указанный адрес. Для получения справки публикации метаданных, см. документация MSDN на http://go.microsoft.com/fwlink/?LinkId=65455.WS-MetadataИдентификатор ошибки обмена: https:///Service1.svc Метаданные содержат ссылку, не может быть решен: 'Https:///Service1.svc. Не удалось установить доверительные отношения для безопасного канала SSL/TLS с власть ''. базовое соединение было закрыто: Не удалось установить доверительные отношения для безопасного канала SSL/TLS. удаленный сертификат недействителен согласно валидации procedure.HTTP GET Ошибка URI: https:///Service1.svc Произошла ошибка при загрузке 'Https:///Service1.svc. Основное соединение было закрыто: Не удалось установить доверительные отношения для безопасного канала SSL/TLS. удаленный сертификат недействителен в соответствии с процедурой валидации.
EDIT: этот вопрос касается использования тестового клиента WCF для проверки веб-сервиса, уже обеспеченного через SSL, с использованием самозаверяющего сертификата. Сервер уже настроен, чтобы принять любой предоставленный сертификат, это тестовый клиент WCF. Я не вижу способа сделать это для.
Ответы
Ответ 1
Вы можете создать неавторизованный сертификат в области разработки, а затем использовать этот сертификат в IIS для применения SSL. Шаги:
-
Создать самозаверяющий сертификат
makecert -r -pe -n "CN=My Root Authority" -a sha1 -sky signature
-ss CA -sr CurrentUser
-cy authority
-sv CA.pvk CA.cer
-
Создайте не самозаверяющий сертификат для SSL, который подписан этим корневым сертификатом, а затем создайте файл pfx из этого
makecert -pe -n "CN=servername" -a sha1 -sky exchange
-eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk
-sp "Microsoft RSA SChannel Cryptographic Provider"
-sy 12 -sv server.pvk server.cer
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx
теперь вам просто нужно импортировать server.pfx
в IIS и настроить привязку веб-сайта для использования этого сертификата, а также установить хранилище CA.cer
в Local Computer
\Trusted Root Certification Authorities
на сервере и на клиенте, выполнив это Клиент WCF без проблем работал с сервисом через HTTPS.
Ответ 2
Ответ от этого вопроса помог мне в моем случае. Обязательно используйте точное имя машины, которое ожидает сертификат. Для примера machine/service.svc
может не работать, а machine.domain/service.svc
- работает.
Ответ 3
вы должны это сделать, если вы замените тестовый клиент WCF WCFStorm Lite Edition. Он бесплатный и довольно гибкий, чем MS test client... например, он позволит вам указать имя пользователя и пароль, если вы выполняете аутентификацию имени пользователя.
Ответ 4
Чтобы ответить на ваш вопрос... вот как вы вынуждаете свой тестовый клиент WCF принимать самозаверяющий сертификат...
using (ServiceReference1.Service1Client proxy = new ServiceReference1.Service1Client())
{
System.Net.Security.RemoteCertificateValidationCallback callBack = (sender, certificate, chain, sslPolicyErrors) => true;
ServicePointManager.ServerCertificateValidationCallback += callBack;
Console.WriteLine(proxy.GetData(35));
ServicePointManager.ServerCertificateValidationCallback -= callBack;
}
Ответ 5
Да, это возможно.
Просто загрузите созданный WSDL из службы (https://localhost/Service1.svc?singleWsdl) и укажите путь к этому файлу при добавлении службы в WCF Проверить клиента.
Ответ 6
Вы можете предоставить свой собственный метод для проверки сертификата.
Попробуйте следующее:
ServicePointManager.ServerCertificateValidationCallback +=
new System.Net.Security.RemoteCertificateValidationCallback(EasyCertCheck);
Обратный вызов:
bool EasyCertCheck(object sender, X509Certificate cert,
X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
return true;
}