2009-02-11 29 views
61

Tôi hiện đang tích hợp với hệ thống được tạo bởi bên thứ 3. Hệ thống này yêu cầu tôi gửi yêu cầu bằng cách sử dụng XML/HTTPS. Các bên thứ 3 gửi cho tôi giấy chứng nhận và tôi cài đặt nóWebClient + HTTPS Issues

tôi sử dụng đoạn mã sau:

using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add(HttpRequestHeader.ContentType, "text/xml"); 

    System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding(); 
    var response = client.UploadData(address, "POST", encoding.GetBytes(msg)); 
} 

Mã này trả về sau WebException:

Kết nối tiềm ẩn đã được đóng cửa: Không thể thiết lập mối quan hệ tin cậy cho kênh bảo mật SSL/TLS.

CẬP NHẬT Bởi vì nó là một máy chủ thử nghiệm Tôi đang làm việc chống lại, chứng chỉ không đáng tin cậy và xác nhận thất bại ... Để bỏ qua điều này trong môi trường thử nghiệm/gỡ lỗi, tạo ra một mới ServerCertificateValidationCallback

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

và đây là của tôi "giả" callback

private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error) 
{ 
    return true; 
} 

Read more herehere

+4

+1 để cập nhật với mã mà bạn sử dụng. Nice nhanh chóng sửa chữa cho tôi vì điều đó. –

+0

Điều này rất hữu ích thay vì đăng ký gốc CA khó chịu vào máy ảo của tôi khi gỡ lỗi các dịch vụ web SSL! Tôi chỉ cần đặt # DE DEBUG xung quanh phần đã thêm lệnh gọi giả để không đặt nó vào mã sản xuất. – jishi

+0

Vào [đây.] (Http://forums.asp.net/p/1174025/1972251.aspx) – Lonzo

Trả lời

8

Đối với phiên bản VB.NET của câu trả lời ban đầu, ở đây bạn đi (bộ chuyển đổi không hoạt động tốt khi cần kết nối các sự kiện với toán tử 'AddressOf'). đang 1st mà đi trước khi sử dụng một WebClient() hoặc HttpWebRequest() đối tượng:

ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf bypassAllCertificateStuff) 

..và các dây lên phương pháp mã:

Private Shared Function bypassAllCertificateStuff(ByVal sender As Object, ByVal cert As X509Certificate, ByVal chain As X509Chain, ByVal [error] As System.Net.Security.SslPolicyErrors) As Boolean 
    Return True 
End Function 
68

Ký hiệu ngắn nhất của mã để cho phép tất cả các chứng là thực sự:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Và hoạt động tốt cho lỗi này. Không cần phải nói rằng bạn nên cung cấp một triển khai thực sự kiểm tra chứng chỉ và quyết định dựa trên thông tin chứng chỉ nếu giao tiếp được an toàn. Đối với mục đích thử nghiệm, sử dụng dòng mã trên.

+0

Rất hữu ích cho các bài kiểm tra tích hợp của tôi! –

-1

Hãy thử điều này, nó hoạt động:

class Ejemplo 
{ 
    static void Main(string[] args) 
    { 
     string _response = null; 
     string _auth = "Basic"; 
     Uri _uri = new Uri(@"http://api.olr.com/Service.svc"); 

     string addres = @"http://api.olr.com/Service.svc"; 
     string proxy = @"http://xx.xx.xx.xx:xxxx"; 
     string user = @"platinum"; 
     string pass = @"01CFE4BF-11BA"; 


     NetworkCredential net = new NetworkCredential(user, pass); 
     CredentialCache _cc = new CredentialCache(); 

     WebCustom page = new WebCustom(addres, proxy); 
     page.connectProxy(); 

     _cc.Add(_uri, _auth, net); 

     page.myWebClient.Credentials = _cc; 

     Console.WriteLine(page.copyWeb()); 
    } 

} 

public class WebCustom 
{ 
     private string proxy; 
     private string url; 
     public WebClient myWebClient; 
     public WebProxy proxyObj; 
     public string webPageData; 


     public WebCustom(string _url, string _proxy) 
     { 
      url = _url; 
      proxy = _proxy; 
      myWebClient = new WebClient(); 
     } 

     public void connectProxy() 
     { 
      proxyObj = new WebProxy(proxy, true); 
      proxyObj.Credentials = CredentialCache.DefaultCredentials; 
      myWebClient.Proxy = proxyObj; 
     } 

     public string copyWeb() 
     { return webPageData = myWebClient.DownloadString(url); } 
} 
+2

Bạn có thể giải thích cách giải pháp của bạn khắc phục sự cố HTTP_S_ không? –