У меня есть полностью работающая система, в которой клиенты на основе openssl взаимодействуют с сервером openssl. У каждого клиента есть собственный сертификат, который проверяется сервером. Сертификаты были сгенерированы с помощью openssl (X509, pem ). Они самоподписанные -.
Теперь я хочу написать тестовый клиент на основе SslStream. Я использовал пример клиента из документации класса SslStream .
Мой клиент SslStream не может завершить рукопожатие. stunnel жалуется на то, что клиент не отправляет свой сертификат. Это подтверждено в Wireshark (Certificates Length :0 в сообщениях рукопожатия ).
Мой клиент отображает следующее исключение:
Inner exception: The message received was unexpected or badly formatted
Вот как я загружаю свой сертификат:
X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);
Я попытался получить различные свойства сертификата (ex :GetSerialNumberString ()). Оно работает. Метод Verify возвращает false. Это следующее, что я собираюсь исследовать.
То, как я настроил свой SslStream, похоже, не имеет значения (тот же результат):
sslStream.AuthenticateAsClient(serverName);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectLocalCertificate));
То же самое с аутентификацией:
sslStream.AuthenticateAsClient(serverName);
sslStream.AuthenticateAsClient(serverName,
certColl,
SslProtocols.Tls,
true);
SelectLocalCertificate
вызывается (дважды )и возвращает мой сертификат. ValidateServerCertificate
к моему удивлению )в настоящее время никогда не вызывается (.
Как я могу это отладить? Еще лучше, если вы сможете решить мою проблему.
ОБНОВЛЕНИЕ
Я добавил функцию для проверки цепочки на основе примера X509Chain из документации. Он отображает всевозможную информацию о сертификате, в том числе два интригующих сообщения:
Element certificate is valid: False
Element error status length: 1
В конце концов, у меня действительно нет больше деталей, чем когда я вызываю верификацию.
Вывод openssl verify cert.pem
не сообщает ничего необычного.
error 18 at 0 depth lookup:self signed certificate
OK
ОБНОВЛЕНИЕ
Я извлек закрытый ключ и сертификат из PEM,и я создал cert.pfx (pkcs12 ). У меня не было проблем с импортом cert.pfx в мое личное хранилище ключей. В сведениях о моем сертификате я вижу небольшой значок, указывающий на прикрепленный закрытый ключ.
Я изменил свой клиент, чтобы получить сертификат из моего личного хранилища. Но я получаю тот же самый отказ.