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.