Pertanyaan C # HttpWebRequest Koneksi yang mendasarinya tertutup: Terjadi kesalahan yang tidak terduga pada pengiriman


Saya berharap Anda dapat membantu saya dengan ini. Saya telah melakukan Googling sepanjang pagi dan mencoba semua solusi yang dapat saya temukan atau pikirkan sendiri. Situs yang saya coba muat menjalankan TLS1.2 seperti beberapa situs lain yang saya coba uji untuk memastikan itu bukan masalah TLS1.2. Situs-situs lain dimuat dengan baik.

byte[] buffer = Encoding.ASCII.GetBytes(
    "mod=www&ssl=1&dest=account_settings.ws"
    + "&username=" + username.Replace(" ", "20%")
    + "&password=" + password.Replace(" ", "20%"));

ServicePointManager.MaxServicePointIdleTime = 1000;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

HttpWebRequest WebReq =
    (HttpWebRequest)WebRequest.Create(
        "https://secure.runescape.com/m=weblogin/login.ws");

WebReq.Method = "POST";
WebReq.KeepAlive = false;

WebReq.Referer =
    "https://secure.runescape.com/m=weblogin/loginform.ws"
    + "?mod=www&ssl=1&expired=0&dest=account_settings.ws";

WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
reply = _Answer.ReadToEnd();
curAccount++;
if (reply.Contains("Login Successful"))
{
     eturn true;
}
else
{
     eturn false;
}

Tidak peduli apa pun yang saya coba, saya terus mendapatkan pengecualian

Koneksi yang mendasarinya tertutup: Kesalahan tak terduga terjadi pada pengiriman.

Di bawah detail yang saya temukan

Otentikasi gagal karena pihak jarak jauh telah menutup aliran transportasi.


14
2017-09-25 18:22


asal


Jawaban:


Dalam versi 4.0 dari kerangka Net ServicePointManager.SecurityProtocol hanya ditawarkan dua pilihan untuk mengatur:

  • Ssl3: Protokol keamanan Secure Socket Layer (SSL) 3.0.
  • Tls: Transport Layer Security (TLS) 1.0 protokol keamanan

Dalam rilis berikutnya dari kerangka kerja tersebut SecurityProtocolType enumerator diperpanjang dengan protokol Tls yang lebih baru, jadi jika aplikasi Anda dapat menggunakan versi 4.5, Anda juga dapat menggunakan:

  • Tls11: Menentukan protokol keamanan Transport Layer Security (TLS) 1.1
  • Tls12: Menentukan protokol keamanan Transport Layer Security (TLS) 1.2.

Jadi jika Anda aktif. Bersih 4.5 ubah jalur Anda

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

untuk

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

sehingga ServicePointManager akan membuat aliran yang mendukung koneksi Tls12.

Perhatikan bahwa nilai enumerasi dapat digunakan sebagai tanda sehingga Anda dapat menggabungkan beberapa protokol dengan OR yang logis

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

Catatan
Cobalah untuk menjaga jumlah protokol yang Anda dukung serendah mungkin dan up-to-date dengan standar keamanan saat ini. Ssll3 tidak lagi dianggap aman dan penggunaan Tls1.0 SecurityProtocolType.Tls sedang menurun.


53
2017-09-25 19:39



Saya mengalami pengecualian ini, dan itu juga terkait dengan ServicePointManager.SecurityProtocol.

Bagi saya, ini karena ServicePointManager.SecurityProtocol telah diatur untuk Tls | Tls11 (karena situs web tertentu yang mengunjungi aplikasi dengan TLS rusak 1.2) dan saat mengunjungi situs web TLS 1.2-saja (diuji dengan Laporan SSL SSLLabs), gagal.

Opsi untuk .NET 4.5 dan lebih tinggi adalah untuk mengaktifkan semua versi TLS:

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

8
2017-10-17 06:57



Untuk .Net 4 gunakan:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;

1
2017-09-10 20:41



Kode untuk WebTestPlugIn

public class Protocols : WebTestPlugin
{

    public override void PreRequest(object sender, PreRequestEventArgs e)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    }

}

0
2018-03-06 09:31