2013-03-22 20 views
5

Per ignorare gli errori del certificato ssl, sto impostando ServicePointManager.ServerCertificateValidationCallback in un metodo statico prima di effettuare un HttpWebRequest. Voglio solo che questo sia fatto per le richieste interne e quindi sto reimpostando la proprietà sul suo valore predefinito nel blocco finally. Ma poiché si tratta di un'applicazione Web, ci saranno problemi quando più thread stanno modificando la proprietà?È sicuro per più thread impostare ServicePointManager.ServerCertificateValidationCallback?

Ecco come sto usando la proprietà

public static String GetResource() 
{ 
    try 
    {   
     ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };   
    } 
    catch() 
    { 
    } 
    finally 
    { 
     ServicePointManager.ServerCertificateValidationCallback -= delegate { return false; }; 
    }  
} 
  1. Sarà questo codice essere threadsafe? La documentazione su msdn dice che tutti i membri statici del tipo ServicePointManager sono thread-safe, ma volevo solo confermarli. http://msdn.microsoft.com/en-us/library/zkfa48de%28v=vs.80%29.aspx
  2. Il codice nel blocco finally, è il modo corretto di reimpostarlo sul valore predefinito?
+1

No, questo non sarà "thread-safe". Il callback può essere modificato da qualsiasi altro thread in qualsiasi momento. –

+1

BTW, "thread safe" in termini di membri statici significa semplicemente che quei membri modificano atomicamente lo stato statico (se presente). Due thread che modificano 'ServerCertificateValidationCallback' sono" thread safe "a tale riguardo. Ma, dal punto di vista della vostra applicazione, questo non è thread-safe perché i dati di un thread (* il suo * valore "ServerCertificateValidationCallback') possono essere sovrascritti da un altro thread - potenzialmente causando il malfunzionamento del codice nel thread. Non c'è modo di sincronizzare l'accesso a 'ServerCertificateValidationCallback' in thread su cui non si ha il controllo. –

+0

Grazie Peter per la tua risposta. Vedo molti post in cui hanno suggerito questa tecnica, ma a quanto pare non funziona. Non sono sicuro di quale sia il modo migliore per ignorare gli errori del certificato SSL per le richieste Web interne. – user1689030

risposta

5

Se è necessario sostituire la convalida dei certificati di default, prendere in considerazione uno o più dei seguenti elementi:

  1. Set ServerCertificateValidationCallback una volta e solo una volta - durante l'applicazione start up o, eventualmente, in un costruttore statico. Ciò elimina il rischio di contesa del filo.
  2. Dal momento che si sta facendo la sicurezza più permissiva, limitare il comportamento di build di debug con la compilazione condizionale:

    #if DEBUG 
        ServicePointManager.ServerCertificateValidationCallback += Callback; 
    #endif 
    
  3. Infine, ricordate che il delegato è una funzione ricco. Non devi semplicemente restituire true. Puoi interrogare la richiesta e decidere come gestirla.

    ServicePointManager.ServerCertificateValidationCallback += Callback; 
    
    static bool Callback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
        if (IsInternalRequest(sender)) 
        { 
         return true; 
        } 
        else 
        { 
         return IsExternalRequestValid(sender, certificate, chain, sslPolicyErrors); 
        } 
    }