HTTP-запрос был запрещен с помощью схемы аутентификации клиента "Анонимный"
Я пытаюсь настроить WCF-сервер\клиент для работы с SSL
Я получаю следующее исключение:
HTTP-запрос был запрещен с помощью схемы проверки подлинности клиента 'Anonymous'
У меня есть сам сервер WCF.
Я запустил hhtpcfg
как мои клиентские, так и серверные сертификаты хранятся под персональными и доверенными людьми на локальном компьютере.
Вот код сервера:
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Mode = WebHttpSecurityMode.Transport;
_host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
_host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
_host.Credentials.ClientCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine;
_host.Credentials.ServiceCertificate.SetCertificate("cn=ServerSide", StoreLocation.LocalMachine, StoreName.My);
Код клиента:
binding.Security.Mode = WebHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
WebChannelFactory<ITestClientForServer> cf =
new WebChannelFactory<ITestClientForServer>(binding, url2Bind);
cf.Credentials.ClientCertificate.SetCertificate("cn=ClientSide", StoreLocation.LocalMachine, StoreName.My);
ServicePointManager.ServerCertificateValidationCallback
+= RemoteCertificateValidate;
Глядя на web_tracelog.svclog и trace.log
показывает, что сервер не может аутентифицировать клиентский сертификат
Мой сертификат не подписан авторизированным центром сертификации
но именно поэтому я добавил их к доверенным людям....
Что мне не хватает?
Что мне не хватает?
Ответы
Ответ 1
Хитрость заключалась в том, чтобы сделать сертификат клиента действительным,
Для этого у вас есть два варианта:
1) сделать его самостоятельно подписанным, а затем поставить его под "доверенным корневым центром сертификации".
Очевидно, что в производстве вы хотите, чтобы ваш клиентский сертификат был подписан доверенным ЦС, а не сам подписан.
см. http://msdn.microsoft.com/en-us/library/ms733813.aspx
2) Подпишите свой сертификат клиента другим созданным вами сертификатом (позвоните в MyCA) и поместите MyCA в "Trusted Root Certification Authority" и получите сертификат клиента в "Trusted People". Таким образом, среда разработки еще ближе к развертыванию.
Как создать и подписать сертификаты:
Посмотрите под http://msdn.microsoft.com/en-us/library/bfsktky3.aspx
Вот серия команд, которые я использовал:
1) makecert -r -pe -ss My -sr LocalMachine -a sha1 -sky exchange -n cn = MyCA -sv "MyCAPrivate.pvk"
2) makecert -pe -ss My -sr LocalMachine -a sha1 -sky exchange -n cn = SignedClientCertificate -iv "MyCAPrivate.pvk" -ic "MyCAPublic.cer"
Ответ 2
Причина, по которой я получал эту ошибку, заключалась в том, что в моем веб-интерфейсе веб-службы имели URL-адрес http://localhost/myservicename.svc
, а на нашем dev-сервере у нас было FQDN http://dev.myname.com/myservicename.svc.
Дважды проверьте свои web.configs, чтобы URL-адреса веб-служб указывали на правильное расположение.