Почему SslStream не отправляет мой сертификат клиента? - PullRequest
0 голосов
/ 10 июля 2020

Я уже много часов пытаюсь заставить это работать, но я не могу найти никакой информации о том, что идет не так. Проходя через свой код, я в конце концов достигаю такой части:

clientCerts = new X509CertificateCollection(new[] { <mycert> as X509Certificate });
stream.AuthenticateAsClientAsync(<host>, clientCerts, SslProtocols.Tls12, false); // Continuation omitted

Моя цель здесь - предоставить сертификат клиента серверу на другой стороне. Однако я получил жалобы на то, что их нет и соединение не установлено. Я запустил Wireshark и увидел, что последнее, что отправил сервер, было:

Handshake Protocol: Certificate Request
    Handshake Type: Certificate Request (13)
    Length: 19
    Certificate types count: 2
    Certificate types (2 types)
        Certificate type: RSA Sign (1)
        Certificate type: ECDSA Sign (64)
    Signature Hash Algorithms Length: 12
    Signature Hash Algorithms (6 algorithms)
        Signature Algorithm: rsa_pkcs1_sha384 (0x0501)
        Signature Algorithm: ecdsa_secp384r1_sha384 (0x0503)
        Signature Algorithm: rsa_pkcs1_sha256 (0x0401)
        Signature Algorithm: ecdsa_secp256r1_sha256 (0x0403)
        Signature Algorithm: rsa_pkcs1_sha1 (0x0201)
        Signature Algorithm: ecdsa_sha1 (0x0203)
    Distinguished Names Length: 0

Пока все хорошо, так что естественно, поскольку я указал сертификат клиента в методе аутентификации, я ожидал, что он будет отправлен обратно но ...

Handshake Protocol: Certificate
    Handshake Type: Certificate (11)
    Length: 3
    Certificates Length: 0

Без объяснения причин, он просто отказывается его отправлять. Я создал сертификат в фактическом тесте, который я запустил, и сохранил его в хранилище Current User MY:

var ecdsa = ECDsa.Create();
var req = new CertificateRequest($"cn={name}", ecdsa, HashAlgorithmName.SHA256);
var generatedCert= req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(1));
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) {
                    store.Open(OpenFlags.ReadWrite);
                    store.Add(generatedCert);
                    // Do stuff....
                    store.Remove(generatedCert);
}

Я загрузил некоторые. NET Основная трассировка и я нашел несколько обнадеживающих линий трассировки, но нет ошибки. Очевидно, что он распознает его как действительный и пригодный для использования сертификат, но просто не отправляет его:

Event Name                                   Time MSec  Process Name            Rest  
Microsoft-System-Net-Security/CertIsType2   12,600.157  Process(84336) (84336)  ThreadID="38,972" ProcessorNumber="6" secureChannelHash="23,128,995" FormattedMessage="Certificate is of type X509Certificate2 and contains the private key." 
Microsoft-System-Net-Security/SelectedCert  12,631.155  Process(84336) (84336)  ThreadID="38,972" ProcessorNumber="6" clientCertificate="<long string that matches what I expect>" secureChannelHash="23,128,995" FormattedMessage="Selected certificate: <long string again>." 

Я действительно вижу некоторые вещи, говорящие о «errorCode: 0x00090312, refContext: SafeDeleteContext_SECURITY: 27780689 (0x0)», но я может только сказать, что 0x00090312 соответствует SEC_I_INCOMPLETE_CREDENTIALS, что, по-видимому, означает

Сервер запросил аутентификацию клиента, но либо предоставленные учетные данные не включают сертификат, либо сертификат не был выпущен центром сертификации что сервер доверяет.

Ну ... как я должен знать, чему доверяет сервер, не посылая это по сети, чтобы увидеть? Другая сторона - это код, над которым я тоже работаю, поэтому я знаю, что он ожидает синтаксического анализа сообщения сертификата и проверки сертификата, но не может, потому что сертификат не отправляется . Я не понимаю, что мне здесь делать?

1 Ответ

0 голосов
/ 11 июля 2020

Хорошо, так что в истинной форме newb ie оказывается, что я не использовал действующий алгоритм подписи. Мне пришлось заранее указать кривую, которая будет использоваться для ключа ala

ECDsa.Create() -> ECDsa.Create(ECCurve.CreateFromValue("1.2.840.10045.3.1.7"));, чтобы соответствовать части secp256r1 в ecdsa_secp256r1_sha256 (я получил это значение из здесь )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...