2015-08-24 17 views
11

Sto cercando di creare una connessione client di prova/server utilizzando il seguente codice:AuthenticateAsServer - Il certificato remoto non è valido secondo la procedura di convalida

static void Main(string[] args) 
    { 
     var listenerThread = new Thread(ListenerThreadEntry); 
     listenerThread.Start(); 

     Thread.Sleep(TimeSpan.FromSeconds(1)); 

     var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
     socket.Connect("localhost", Port); 

     var rawStream = new NetworkStream(socket); 
     var stream = new SslStream(rawStream, false, VerifyServerCertificate); 
     var certificate = new X509Certificate(CertsPath + @"test.cer"); 
     var certificates = new X509CertificateCollection(new[] { certificate }); 
     stream.AuthenticateAsClient("localhost", certificates, SslProtocols.Tls, false); 

     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 

    private static bool VerifyServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     return true; 
    } 

    static void ListenerThreadEntry() 
    { 
     var listener = new TcpListener(IPAddress.Any, Port); 
     listener.Start(); 

     var client = listener.AcceptTcpClient(); 
     var serverCertificate = new X509Certificate2(CertsPath + @"\test.pfx"); 
     var sslStream = new SslStream(client.GetStream(), false); 
     sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Tls, false); 

     Thread.Sleep(TimeSpan.FromSeconds(10)); 
    } 

E ottenere "Il certificato remoto non è valido secondo la messaggio di errore "procedura di convalida" nel metodo AuthenticateAsServer. Il certificato è stato creato e salvato in file utilizzando questi comandi:

makecert.exe -r -pe -n "CN=localhost" -a sha1 -sky exchange -sv test.pvk test.cer 
pvk2pfx -pvk test.pvk -spc test.cer -pfx test.pfx 

Cosa mi è sfuggito?

risposta

2

non riesco a vedere dove nel vostro processo si aggiunge la fiducia al certificato utilizzato per l'autenticazione. Passando allo false come parametro 4 a AuthenticateAsServer() salta solo il controllo di revoca, non salta il controllo di attendibilità in generale.

in modo da avere le seguenti opzioni per farlo funzionare:

  • Non generare il certificato da soli, ma l'hanno generata da un'autorità di certificazione considerata attendibile in Windows per impostazione predefinita. Questo costerà un po 'di soldi, ma ci sono anche alcuni CA economici, non è necessario un certificato Thawte.
  • Aggiungere attendibilità al certificato importandolo nell'elenco di certificati personali
  • Se è già stato creato un certificato CA autofirmato già aggiunto all'elenco di certificati radice attendibili (che è comune in aziende o organizzazioni) , firmare il certificato con il certificato CA
  • non autenticano a tutti (ma probabilmente non si vuole che)
3

controllo questi passaggi, sembra funzionare,

1)First save the certificate in a file 
2)Run MMC 
3)Open the Certificate Manager (certmgr.msc in C:\Windows\System32) 
4)You will see it opens 'Certificates - Current User' 
5)In the menu, choose File, Add/Remove Snap-In 
6)Now press Add, select 'Certificates' and select 'Computer Account' 
7)Select the Local Computer 
8)Now you have two snap-ins: 
9)Certificates - Current User 
10)Certificates (Local Computer) 
11)Now import the certificate in "Certificates (Local Computer)\Trusted Root Certificates\Certificates" 
+0

devo aggiungere al negozio certificato globale? – user626528

Problemi correlati