Что может привести к ошибке System.Net: AcquireCredentialsHandle() с ошибкой 0X8009030D?C#

Место общения программистов C#
Ответить
Anonymous
 Что может привести к ошибке System.Net: AcquireCredentialsHandle() с ошибкой 0X8009030D?

Сообщение Anonymous »

У меня есть простой фрагмент кода соединения https, который хорошо работает с одним хостом SSL, подключаясь, даже если корневой центр сертификации не является доверенным (это изолированная среда, поэтому нас пока не беспокоит дыра в безопасности, которую это создает), и загружая сертификат и ключ из текстовых файлов, используя пакет Nuget OpenSSL.X509Certificate2Provider:

Код: Выделить всё

    public async Task Register()
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

using (var handler = new HttpClientHandler())
{
var rawcert = File.ReadAllText(@"C:\OpenSSL\bin\certTransport.pem");
var rawkey = File.ReadAllText(@"C:\OpenSSL\bin\privateKeyTransport.key");

var provider = new CertificateFromFileProvider(rawcert, rawkey);
var cert = provider.Certificate;
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback +=
(HttpRequestMessage req, X509Certificate2 cert2, X509Chain chain, SslPolicyErrors err) =>
{
return true;
};

handler.ClientCertificates.Add(cert);

using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://{uri}/");
var response = await client.GetStringAsync("register");
return response;
}
}
}
Когда я указываю этот код на другой хост, который должен быть защищен точно таким же образом, я получаю следующую ошибку:

Код: Выделить всё

System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
И копаясь в журналах, я обнаруживаю:

Код: Выделить всё

System.Net Information: 0 : [35036] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent  = Outbound, scc     = System.Net.SecureCredential)
System.Net Error: 0 : [35036] AcquireCredentialsHandle() failed with error 0X8009030D.
При поиске этого стека я обнаружил множество ошибок, связанных с разрешениями хранилища сертификатов, но сертификат клиента в этом случае не загружается из хранилища.

Я также обнаружил множество проблем, связанных с SecurityProtocolType. Я проверил, что сервер использует только Tls1.2.

Я вызываю код из модульного теста в VS 2017 Enterprise, работающего с правами администратора на Win10 x64. Код содержится в библиотеке классов .Net 4.7, а не в IIS.

Что может быть причиной этой проблемы?

ОБНОВЛЕНИЕ
После полезных комментариев @Jeroen Mostert ниже я попробовал выполнить базовый тест соединения с OpenSSL. Слегка анонимизированные результаты:

Код: Выделить всё

OpenSSL> s_client -connect {REMOVED}:443 -CAfile C:\OpenSSL\bin\archive-ii\transport-production-new\certTransport.pem
CONNECTED(000001F0)
depth=2 C = GB, O = OK, CN = {REMOVED} Root CA
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/C=GB/O={REMOVED}/OU={REMOVED}/CN={REMOVED}
i:/C=GB/O={REMOVED}/CN={REMOVED} Issuing CA
1 s:/C=GB/O={REMOVED}/CN={REMOVED} Issuing CA
i:/C=GB/O={REMOVED}/CN={REMOVED} Root CA
2 s:/C=GB/O={REMOVED}/CN={REMOVED} Root CA
i:/C=GB/O={REMOVED}/CN={REMOVED} Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
{REMOVED}
-----END CERTIFICATE-----
subject=/C=GB/O={REMOVED}/OU={REMOVED}/CN={REMOVED}
issuer=/C=GB/O={REMOVED}/CN={REMOVED} Issuing CA
---
Acceptable client certificate CA names
/C=GB/O={REMOVED}/CN={REMOVED} Issuing CA
/C=GB/O={REMOVED}/CN={REMOVED} Root CA
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms:     RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 5155 bytes and written 446 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol  : TLSv1.2
Cipher    : ECDHE-RSA-AES128-GCM-SHA256
Session-ID:
Session-ID-ctx:
Master-Key: {REMOVED}
Key-Arg   : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1527164830
Timeout   : 300 (sec)
Verify return code: 19 (self signed certificate in certificate chain)
---
Что-то не так?

Я также просмотрел журнал CAPI2 (как предложено в комментариях). Это показывает ошибки, связанные с недоверием корневого сертификата, например:
Изображение


Означает ли это, что мои обратные вызовы проверки не работают - и если да, то есть идеи, почему это происходит?

Дальнейшее обновление:

Если я удалю строку кода, которая прикрепляет сертификат, ошибка исчезнет - я доберусь до конечной точки теста MTLS (но, конечно, провалю тест MTLS, который там проводится).

О чем это говорит? Проблема с самим сертификатом?

Подробнее здесь: https://stackoverflow.com/questions/505 ... th-error-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»