2015-11-10 9 views
8

Nella mia app utilizzo RestSharp per interrogare un'API REST e System.Net.Mail per inviare e-mail. All'avvio del programma ho impostato la proprietà ServicePointManager.SecurityProtocol.ServicePointManager SecurityProtocol conflitto

Se ho impostato la proprietà per:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; 

eccezione viene generata quando l'esecuzione di query API con RestSharp:

The request was aborted: Could not create SSL/TLS secure channel 

Se ho impostato la proprietà per:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls11; 

eccezione è generata durante l'invio di e-mail con System.Net.Mail:

System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm 

Come devo risolvere questo problema?

+0

Quale versione di .NET? Se non sei l'ultimo, è possibile effettuare l'aggiornamento? Dopo di ciò inizierei cercando di restringerlo un po '. Utilizza il postino di add-on chrome per provare a comunicare con la tua API. Imposta Fiddler (o wireshark) per intercettare il traffico e guarda i pacchetti per vedere cosa sta cercando di negoziare. Inoltre stai solo usando la classe standard SmtpClient? com'è il tuo codice per usarlo? – Wjdavis5

+0

È possibile impostare il valore corretto per il gestore dei punti di servizio subito prima di effettuare una chiamata. –

risposta

6

Il server API REST e il server di posta a cui ci si connette apparentemente hanno requisiti di protocollo di sicurezza in conflitto. Avrai bisogno di utilizzare diverse impostazioni del protocollo di sicurezza per loro.

ServicePointManager.SecurityProtocol è statico e il suo valore corrente si applica a tutte le nuove connessioni. Purtroppo non c'è modo di controllare questa impostazione per ServicePoint. (Secondo me questo è un difetto di progettazione di Microsoft)

Se si ha il controllo del server API REST o del server di posta, è possibile, eventualmente, riconfigurarlo per accettare protocolli di sicurezza non in conflitto.

In caso contrario, è possibile riprogettare il codice in modo che tutte le connessioni all'API REST e al server di posta siano costituite da due distinti AppDomains.

Ad esempio, lasciare che il dominio predefinito dell'app gestisca tutte le comunicazioni API REST e generare un dominio app separato che esegue tutte le comunicazioni di posta.

Con questa impostazione è possibile utilizzare diversi valori ServicePointManager.SecurityProtocol in ciascun dominio. (poiché i valori statici non sono condivisi tra i domini dell'app).