2009-02-18 6 views
89

J'écris un programme qui lit le contenu d'une URL fournie par l'utilisateur. Mon problème est dans le code qui ressemble à ceci:Comment utiliser WebRequest pour accéder à un site crypté SSL à l'aide de https?

Uri uri = new Uri(url); 
WebRequest webRequest = WebRequest.Create(uri); 
WebResponse webResponse = webRequest.GetResponse(); 
ReadFrom(webResponse.GetResponseStream()); 

Et cela brise si la condition url est un « https: // » URL. Quelqu'un peut-il m'aider à modifier ce code afin qu'il fonctionne avec le contenu crypté SSL. Merci.

Répondre

150

Vous le faites de la bonne façon, mais les utilisateurs peuvent fournir des URL aux sites pour lesquels des certificats ssl invalides sont installés. Vous pouvez ignorer ces problèmes cert si vous mettez cette ligne avant de faire la demande Web réelle:

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); 

où AcceptAllCertifications est défini comme

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
+1

C'était mon problème exactement. Je le faisais correctement sauf que lorsque je testais mon code, je fournissais https: // localhost qui entraînait une erreur car le certificat était pour www.monentreprise.com. Merci de m'avoir indiqué la bonne direction. –

+36

Merci pour cette réponse! Pour éviter un code inutile, je l'ai utilisé comme ceci: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true; –

+2

Merci, vous m'avez aidé monsieur. F # rend cela plus facile: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) '' –

15

Ce lien sera vous intéresser: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

Pour les connexions http, les classes WebRequest et WebResponse utilisent SSL pour communiquer avec les hébergeurs qui prennent en charge SSL. La décision d'utiliser SSL est prise par la classe WebRequest, en fonction de l'URI qui lui est attribuée. Si l'URI commence par "https:", SSL est utilisé; Si l'URI commence par "http:", une connexion non cryptée est utilisée.

+0

Great link. C'est une distinction importante. – DanM7

+0

Votre réponse implique le code dans la question devrait fonctionner? –

6

Celui-ci a fonctionné pour moi:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

La valeur par défaut est" Ssl2 | Tls ". J'avais seulement activé Tls 1.1 et 1.2 sur mon serveur. Cela a effectivement réglé le problème! Pour LetsEncrypt avec nginX sur linux, les protocoles sont définis ici: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Je crois que cela concerne un problème différent. Il ne s'agit pas de Certs invalides mais d'une version plus haute de TLS. – wp78de

Questions connexes