Impossible de télécharger des fichiers à partir de l’ordinateur avec les protocoles TLS 1.1 / 1.2 activés à l’aide de la méthode WebClient.DownloadFile

J’essaye d’implémenter une application console simple pour télécharger les fichiers en utilisant la méthode Webclient.DownloadFile sur les protocoles TLS 1.1 / 1.2. C’est le code de l’application:

var downloadUrl = "https://serverURL.com/sample.mp3"; var filename = "sample.mp3"; var myWebClient = new WebClient(); myWebClient.DownloadFile(downloadUrl, filename); 

À chaque fois que je l’exécute, le message d’erreur suivant s’affiche:

 Unhandled Exception: System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possessa common algorithm at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, Ssortingng package, CredentialUse intent, SecureCredential scc) at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential) at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint) at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output) at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count) at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) at System.Net.TlsStream.CallProcessAuthentication(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.Net.ConnectStream.WriteHeaders(Boolean async) --- End of inner exception stack trace --- at System.Net.WebClient.DownloadFile(Uri address, Ssortingng fileName) at System.Net.WebClient.DownloadFile(Ssortingng address, Ssortingng fileName) at web_downloader.Program.Main(Ssortingng[] args) in c:\Users\user\Documents\Visual Studio 2013\Projects\web_downloader\web_downloader\Program.cs:line 27 

J’ai la configuration suivante: l’application web_downloader est située sur ServerA (Windows Server 2012 R2 / 64bit), dont les éléments suivants se trouvent dans la clé de registre sous HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Control / SecurityProviders / SCHANNEL / Protocols :

 PCT 1.0 --Client ----DisabledByDefault=1 ----Enabled=0 --Server ----DisabledByDefault=1 ----Enabled=0 SSL 2.0 --Client ----DisabledByDefault=1 ----Enabled=0 --Server ----DisabledByDefault=1 ----Enabled=0 SSL 3.0 --Client ----DisabledByDefault=1 ----Enabled=0 --Server ----DisabledByDefault=1 ----Enabled=0 TLS 1.0 --Client ----DisabledByDefault=1 ----Enabled=0 --Server ----DisabledByDefault=1 ----Enabled=0 TLS 1.1 --Client ----DisabledByDefault=0 ----Enabled=1 --Server ----DisabledByDefault=0 ----Enabled=1 TLS 1.2 --Client ----DisabledByDefault=0 ----Enabled=1 --Server ----DisabledByDefault=0 ----Enabled=1 

Et ServerB , qui stocke le fichier sample.mp3 , présente les caractéristiques suivantes:

 SSL 2.0 Client DisabledByDefault=1 TLS 1.1 Client DisabledByDefault=0 Enabled=1 Server DisabledByDefault=0 Enabled=1 TLS 1.2 Client DisabledByDefault=0 Enabled=1 Server DisabledByDefault=0 Enabled=1 

Dès que j’active TLS 1.0 sur ServerA, je peux télécharger le fichier mp3 à partir de ServerB (Windows 7 / 64bit / Net Framework 4.5.1) sans aucun problème.

Cryptographie système: l’utilisation d’algorithmes conformes à FIPS pour la stratégie de chiffrement, de hachage et de signature est désactivée sur les deux ordinateurs.

Me manque-t-il des parameters de configuration de la méthode DownloadFile pour fonctionner avec TLS 1.1 / 1.2?

Le .NET Framework utilise ses propres parameters pour décider des versions HTTPS à utiliser par défaut. Voir https://stackoverflow.com/a/169396/126229 pour le paramètre ServicePointManager.SecurityProtocol à définir sur le client afin de s’assurer qu’il tente de négocier une connexion TLS1.1.

Vous pouvez également surveiller le trafic sortant avec Fiddler (consultez l’inspecteur de demande TextView du tunnel CONNECT ) pour obtenir une ventilation du message ClientHello. Soyez averti que l’exécution de Fiddler avec HTTPS-déchiffrement activé va interférer, car Fiddler utilise lui-même SSL3 + TLS1 pour communiquer avec les serveurs.

Si vous travaillez avec .NET Framwork 3.5 ou inférieur, vous pouvez définir uniquement TLS 1.0 (mettre la clé de registre) et vous devez activer TLS 1.0 sur le serveur.