Мой клиентский код использует WebClient
и добавляет сертификат к ClientCertificates
:
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
var x509 = GetMyCert(); // see note
request.ClientCertificates.Add( x509 );
return request;
}
ПРИМЕЧАНИЕ. Я проверил в отладчике, и переменная x509
действительно содержит действительный сертификат. в этот момент кода.
Разве это не правильный способ добавить сертификат в HttpWebRequest, чтобы он был доступен веб-приложению?
На стороне сервера, сертификат не 'Не отображается в методе ProcessRequest
из IHttpHandler
:
context.Response.Clear();
// set some Response caching parameters here <snip>
HttpClientCertificate cert = context.Request.ClientCertificate;
if (cert.IsPresent)
{
Hooray();
}
else
{
BooHoo(); // we are here
}
web.config
настроен на прием сертификата клиента:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
</security>
</system.webServer>
Является ли веб-приложение конфигурация не завершена?
PS Если я добавлю обратный вызов к переопределенному методу GetWebRequest
:
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate (Object obj, X509Certificate X509certificate, X509Chain chain,
System.Net.Security.SslPolicyErrors errors)
{
return (errors == SslPolicyErrors.None);
};
errors
будет SslPolicyErrors.None
, а обратный вызов вернет true
. Но, насколько мне известно, я не создавал никакой политики на сервере, если только нет какого-либо значения по умолчанию.