2014-04-13 17 views
7

Mam zamiar nauczyć się obsługi ruchu HTTPS w C# jako strony serwera i jak na pierwsze kroki mam pewne problemy.Tryb serwera C# SSL musi korzystać z certyfikatu z odpowiednim kluczem prywatnym

Oto kod (http://pastebin.com/C4ZYrS8Q):

class Program 
{ 
    static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     if (sslPolicyErrors == SslPolicyErrors.None) return true; 
     Console.WriteLine("Certificate error: {0}", sslPolicyErrors); 
     return false; 
    } 

    static void Main() 
    { 
     var tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 8080); 
     tcpListener.Start(); 
     var clientAccept = tcpListener.AcceptTcpClient(); 
     Thread.Sleep(1000); 

     if (clientAccept.Available > 0) 
     { 
      var sslStream = new SslStream(clientAccept.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
      var certificate = new X509Certificate("path\server.pfx", "password"); 
      sslStream.AuthenticateAsServer(certificate); 
     } 

     Console.ReadLine(); 
    } 
} 

nie kłóć się! :) To jest kod testowy tylko tam, gdzie chcę tylko wykonać kilka podstawowych kroków z obsługą SSL w C#.

Więc ... problem występuje na tej linii:

sslStream.AuthenticateAsServer(certificate); 

enter image description here

Od Russian to tłumaczy się jako: - tryb serwera SSL musi użyć certyfikatu z odpowiednim kluczem prywatnym.

myślałem, że zrobiłem mój certyfikat X509 nieprawidłowe, ale ponownie sprawdzane:

makecert.exe -r -pe -n "CN=localhost" -sky exchange -sv server.pvk server.cer 
pvk2pfx -pvk server.pvk -spc server.cer -pfx server.pfx -pi <password> 

I wydaje się, że wszystko jest w porządku z tworzeniem X509, a dowodem na to jest to inna linia działa poprawnie :

var certificate = new X509Certificate("path\server.pfx", "password"); 

Program nie rzucił wyjątku na powyższej linii.

Jaki jest problem z hanldingiem protokołu SSL w moim kodzie i jak obsłużyć przychodzący strumień SSL jako serwer?

+0

Co klient może komunikować się z serwerem za pomocą SSL? Pokaż kod klienta. –

+0

@HamletHakobyan po prostu przeglądarka Chrome, to klient, z użyciem 'https: //' URI –

Odpowiedz

10

Wszystko w porządku, odpowiedzią jest użycie klasy X509Certificate2 zamiast X509Certificate.

I dodać do listy zaufania utworzony certyfikat.

Powiązane problemy