Клиент SslStream не может выполнить рукопожатие с сервером stunnel

У меня есть полностью работающая система, в которой клиенты на основе 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 в мое личное хранилище ключей. В сведениях о моем сертификате я вижу небольшой значок, указывающий на прикрепленный закрытый ключ.

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

5
задан Philippe A. 17 July 2012 в 15:01
поделиться