Я пытаюсь защитить свой сервис RESTful WebApi с помощью аутентификации ssl и клиента с помощью клиентских сертификатов.
Проверить; Я создал самоподписанный сертификат и размещен на локальной машине, доверенной корневой папке сертификации, и я создал сертификаты "сервер" и "клиент". Стандартный https для сервера работает без проблем.
Однако у меня есть код на сервере для проверки сертификата, который никогда не вызывается при подключении с использованием моего тестового клиента, который поставляет мой клиентский сертификат, а тестовому клиенту возвращается статус запрещенного 403.
Это указывает на то, что сервер не выполнил мой сертификат, прежде чем он достигнет моего кода проверки. Однако, если я запускаю скрипач, он знает, что требуется сертификат клиента, и просит его предоставить его в "Мои документы \Fiddler2". Я дал ему тот же клиентский сертификат, который я использую в своем тестовом клиенте, и теперь мой сервер работает и получил сертификат клиента, которого я ожидаю! Это означает, что клиент WebApi не отправляет сертификат надлежащим образом, мой код клиента ниже примерно такой же, как и другие примеры, которые я нашел.
static async Task RunAsync()
{
try
{
var handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(GetClientCert());
handler.ServerCertificateValidationCallback += Validate;
handler.UseProxy = false;
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://hostname:10001/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var response = await client.GetAsync("api/system/");
var str = await response.Content.ReadAsStringAsync();
Console.WriteLine(str);
}
} catch(Exception ex)
{
Console.Write(ex.Message);
}
}
Любые идеи, почему это будет работать у скрипача, но не на моем тестовом клиенте?
Изменить: Вот код GetClientCert()
private static X509Certificate GetClientCert()
{
X509Store store = null;
try
{
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Integration Client Certificate", true);
if (certs.Count == 1)
{
var cert = certs[0];
return cert;
}
}
finally
{
if (store != null)
store.Close();
}
return null;
}
Предоставлено, что тестовый код не обрабатывает нулевой сертификат, но я отлаживаю его, чтобы убедиться, что находится правильный сертификат.