Я делаю рукопожатие SSL3, используя SslStream, но, несмотря на все мои усилия, SslStream никогда не отправляет сертификат клиента от моего имени. Вот код:
SSLConnection = new System.Net.Security.SslStream(SSLInOutStream, false, new System.Net.Security.RemoteCertificateValidationCallback(AlwaysValidRemoteCertificate), new System.Net.Security.LocalCertificateSelectionCallback(ChooseLocalCertificate));
X509CertificateCollection CC = new X509CertificateCollection();
CC.Add(Org.BouncyCastle.Security.DotNetUtilities.ToX509Certificate(MyLocalCertificate));
SSLConnection.AuthenticateAsClient("test", CC, System.Security.Authentication.SslProtocols.Ssl3, false);
и затем AlwaysValidRemoteCertificate просто возвращает значение true, а ChooseLocalCertificate возвращает нулевой элемент массива.
Код, вероятно, выглядит немного странно, потому что проект немного странен, но я думаю, что здесь дело не в этом. Рукопожатие SSL завершено. Проблема заключается в том, что вместо отправки сообщения сертификата от моего имени (в процессе рукопожатия) с закодированным сертификатом ASN.1 (MyLocalCertificate) SslStream отправляет предупреждение с номером SSL 41 (без сертификата) и затем продолжает работу. Я знаю это по пакетному анализу. После того, как рукопожатие завершено, SslStream помечает IsAuthenticated как true, IsMutuallyAuthenticated - как false, а его член LocalCertificate равен null.
Я чувствую, что, возможно, я здесь упускаю что-то довольно очевидное, поэтому любые идеи будут оценены. Я новичок с SSL, и этот проект находится на проторенном пути, поэтому я немного растерялся.
P.S. 1: Моя процедура ChooseLocalCertificate вызывается дважды во время рукопожатия и возвращает действительный (насколько я могу судить) ненулевой сертификат оба раза.
P.S. 2: SSLInOutStream - это мой собственный класс, а не NetworkStream. Как я уже сказал, рукопожатие проходит в основном нормально, поэтому я сомневаюсь, что это виновник ... но кто знает?