Невозможно использовать сертификат клиента из хранилища сертификатов, только путем загрузки из файла - PullRequest
1 голос
/ 30 сентября 2019

Я использую WebRequest для подключения к веб-странице, которая использует https.

Если я пытаюсь использовать сертификат клиента, который находится в личном хранилище в LocalMachine, с помощью

var myStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
myStore.Open(OpenFlags.ReadOnly);

var clientCertificates = myStore.Certificates.Find(X509FindType.FindBySubjectName, "foobar",
  validOnly: false);

изатем я создаю соединение с

var req = (HttpWebRequest)WebRequest.Create("https://theserver.com/the/url");
req.Method = "POST";
req.ContentType = "application/json";
req.ProtocolVersion = HttpVersion.Version11;

req.ClientCertificates = clientCertificates; 

req.ServerCertificateValidationCallback += (o, certificate, chain, errors) =>
{
  return true;
};

using (var stream = req.GetRequestStream())
{
  stream.Write(data, 0, data.Length);
  stream.Flush();
}

var response = req.GetResponse();

. Сбой на линии req.GetResponse с

System.Net.WebException: 'Запрос был прерван: Не удалось создать SSL /Безопасный канал TLS. '

Но если я вместо этого загружу сертификат клиента из файла (того же файла, который я ранее установил в хранилище) с

var certificatePath = @"C:\temp\file.p12";

var clientCertificate = new X509Certificate2(certificatePath, "pwd", 
  X509KeyStorageFlags.Exportable);

и

req.ClientCertificates.Add(clientCertificate);

Я смогу успешно выполнить запрос https.

Для этого необходимо сохранить файл в файловой системе и ввести пароль в исходный код.

  • Как использовать хранилище вместо файловой системы?

  • Почему я должен использовать validOnly: false для получения клиентских сертификатов?

edit

Предпочтительный способ получения доступа к этим сертификатамes (сертификат клиента и сервера) будет иметь их в web.config в качестве конечных точек, но мне не удалось это сделать.

1 Ответ

0 голосов
/ 02 октября 2019

Чтобы устранить симптомы проблемы / многих проблем, мне пришлось добавить пользователя Every в ACL закрытого ключа сертификата.

...