SSL şifreli bir siteye https kullanarak erişmek için WebRequest'i nasıl kullanırım?


116

Kullanıcı tarafından sağlanan bir URL'den içerik okuyan bir program yazıyorum. Benim sorunum, bunun gibi bir şey olan kodda:

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

Sağlanan url bir "https: //" URL ise bu durum bozulur . Bu kodu, SSL şifreli içerikle çalışacak şekilde değiştirmeme yardımcı olabilir misiniz? Teşekkürler.

Yanıtlar:


175

Doğru şekilde yapıyorsunuz, ancak kullanıcılar geçersiz SSL sertifikalarının yüklü olduğu sitelere URL sağlıyor olabilir. Gerçek web talebini yapmadan önce bu satırı girerseniz, bu sertifika sorunlarını göz ardı edebilirsiniz:

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

nerede AcceptAllCertificationstanımlanır

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

41
Bu cevap için teşekkürler! Bazı gereksiz kodlardan kaçınmak için bunu şu şekilde kullandım: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;
Charles Ouellet

4
Teşekkürler, bana yardım ettiniz efendim. F # bunu çok kolaylaştırıyor:ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true)
David Grenier

2
@Charles Ouellet Sanırım senden daha tembelim, (a, b, c, d) => doğru
Despertar

24
Tercih ederim+= delegate { return true; }
vkrzv

2
Bu yaklaşımla ilişkili potansiyel risklerin farkında olun. Daha fazla bilgi için stackoverflow.com/a/6613434/2969615 adresine bakın .
Joe Coyle

19

Bu bağlantı ilginizi çekecek: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

Http bağlantıları için WebRequest ve WebResponse sınıfları, SSL'yi destekleyen web ana bilgisayarlarıyla iletişim kurmak için SSL kullanır. SSL kullanma kararı, verilen URI'ye göre WebRequest sınıfı tarafından verilir. URI "https:" ile başlıyorsa, SSL kullanılır; URI "http:" ile başlıyorsa, şifrelenmemiş bir bağlantı kullanılır.


Harika bağlantı. Bu önemli bir ayrım.
DanM7

1
Cevabınız sorudaki kodun çalışması gerektiğini mi ima ediyor?
Rowland Shaw

18

Bu benim için çalıştı:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

1
Varsayılan değer "Ssl2 | Tls" dir. Sunucumda yalnızca Tls 1.1 ve 1.2'yi etkinleştirmiştim. Bu gerçekten sorunu çözdü! Linux üzerinde nginX ile LetsEncrypt için protokoller burada tanımlanır: /etc/letsencrypt/options-ssl-nginx.conf
Jerther

Bunun farklı bir konuyla uğraştığına inanıyorum. Geçersiz Sertifikalar değil, daha yüksek TLS sürümleri hakkında.
wp78de

"Mevcut bir bağlantı uzaktaki ana bilgisayar tarafından zorla kapatıldı"
mesajı alıyordum

Bunun genel bir yapılandırma olduğunu unutmayın, bu nedenle bunu isteği her ayarladığınızda değil, yalnızca bir kez yapmanız gerekir.
Chad Hedgcock

Bunu bir şekilde tek bir istek için yapabilir miyim? Görünüşe göre ServicePointManager oldukça küresel bir şey ...
wexman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.