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-адреса веб-служб указывали на правильное расположение.