Краткий ответ: нет *.
Wordier intro: SslStream
выбирает один сертификат из коллекции ClientCertificates
, используя данные, которые (были исторически, но больше не обычно) отправляются сервером TLS о соответствующих корнях (и если ни один из них не применим, он выбирает первое, где HasPrivateKey
истинно). В процессе выбора каждый сертификат кандидата проверяется изолированно, и система запрашивает разрешение цепочки. На Windows выбранный сертификат затем отправляется в системные библиотеки для «мы делаем TLS сейчас», что (IIR C) является источником ограничений. (macOS и Linux сборки из. NET Core просто пытаются поддерживать поведенческую паритетность)
После выбора сертификата выполняется последняя цепочка, чтобы определить, какие сертификаты включить в рукопожатие. без контекста чего-либо еще из коллекции ClientCertificates
.
Если вы знаете, что ваша коллекция представляет собой одну цепочку, лучший ответ - импортировать элементы CA в хранилище CertificateAuthority пользователя. Это хранилище не доверяет сертификатам CA, на самом деле это просто кеш, который используется при построении цепочек.
Кроме того, вам не нужен PersistKeySet и, вероятно, не нужен MachineKeySet: What является обоснованием для всех различных X509KeyStorageFlags?
var handler = new HttpClientHandler();
using (X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadWrite);
var certs = new X509Certificate2Collection();
certs.Import(@"Swish_Merchant_TestCertificate_1234679304.p12", "swish", X509KeyStorageFlags.DefaultKeySet);
foreach (X509Certificate2 cert in certs)
{
if (cert.HasPrivateKey)
{
handler.ClientCertificates.Add(cert);
}
else
{
store.Add(cert);
}
}
}
var client = new HttpClient(handler);
...
* Если в вашей системе уже импортирована цепочка CA, она будет работать. В качестве альтернативы, если цепочка CA использует расширение доступа к информации о полномочиях для публикации sh загружаемой копии сертификата CA, механизм цепочки найдет ее, и все будет работать.