2015-09-25 16 views
9

Tôi hy vọng bạn có thể giúp tôi với điều này. Tôi đã được Googling tất cả các buổi sáng và cố gắng tất cả các giải pháp tôi có thể tìm thấy hoặc suy nghĩ của bản thân mình. Trang web tôi đang cố gắng tải đang chạy TLS1.2 như là một vài trang web khác mà tôi đã thử nghiệm để đảm bảo rằng đó không phải là vấn đề TLS1.2. Các trang web khác được tải tốt.C# HttpWebRequest Kết nối cơ bản đã bị đóng: Đã xảy ra lỗi không mong muốn khi gửi

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; 
} 

Không có vấn đề gì tôi cố gắng tôi tiếp tục nhận được ngoại lệ

Kết nối tiềm ẩn đã được đóng cửa: Một lỗi không mong muốn xảy ra trên một gửi.

Dưới biết thêm chi tiết tôi thấy

Xác thực không thành vì đảng từ xa đã đóng cửa các luồng giao thông.

Trả lời

36

Trong phiên bản 4.0 của .Net framework các ServicePointManager.SecurityProtocol chỉ được cung cấp two options để thiết lập:

  • SSL3: Secure Socket Layer giao thức (SSL) 3,0 an ninh.
  • TLS: Transport Layer Security (TLS) Nghị định thư 1.0 an ninh

Trong phiên bản tiếp theo của khuôn khổ SecurityProtocolType Enumerator đã mở rộng với các giao thức TLS mới hơn, vì vậy nếu ứng dụng của bạn có thể sử dụng thứ phiên bản 4.5 bạn cũng có thể sử dụng:

  • Tls11: Chỉ định Transport layer Security (TLS) Nghị định thư 1.1 an ninh
  • Tls12: Chỉ định Transport layer Security (TLS) 1.2 giao thức bảo mật.

Vì vậy, nếu bạn đang ở trên Net 4.5 thay đổi dòng của bạn

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 

để

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

để các ServicePointManager sẽ tạo ra dòng có hỗ trợ kết nối Tls12.

Đừng nhận thấy rằng các giá trị liệt kê có thể được sử dụng như cờ, do đó bạn có thể kết hợp nhiều giao thức với một logic OR

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

Note
Cố gắng giữ số lượng các giao thức bạn hỗ trợ càng thấp càng tốt và cập nhật các tiêu chuẩn bảo mật ngày nay. Ssll3 không còn được coi là an toàn và việc sử dụng Tls1.0 SecurityProtocolType.Tls bị từ chối.

+1

Bạn có thể muốn 'Tls | Tls11 | Tls12' trong hầu hết các trường hợp. –

8

Tôi gặp phải ngoại lệ này và nó cũng liên quan đến ServicePointManager.SecurityProtocol.

Đối với tôi, điều này là do ServicePointManager.SecurityProtocol đã được đặt thành Tls | Tls11 (do một số trang web mà ứng dụng truy cập bằng TLS 1.2 bị hỏng) và khi truy cập TLS 1.Trang web 2-chỉ (được thử nghiệm với SSLLabs' SSL Report), nó không thành công.

Một lựa chọn cho .NET 4.5 và cao hơn là cho phép tất cả các phiên bản TLS:

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

Đối với Net 4 sử dụng:

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

Nói chung, không sử dụng [hằng số ma thuật] (https://en.wikipedia.org/wiki/Magic_number_ (lập trình) #Unnamed_numerical_constants). –

0

Mã cho WebTestPlugIn

public class Protocols : WebTestPlugin 
{ 

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

    } 

} 
Các vấn đề liên quan