2009-04-06 38 views
5

Cũng im làm việc lại một dịch vụ web có chứng chỉ không được thiết lập chính xác 100% chứng chỉ được thiết lập cho miền * .domain1.com và api được đặt tại soap.shop.domain1.com/SOAP giờ đây tôi không thể kết nối cho webservice này khi tôi nhận được một WebException "Không thể thiết lập mối quan hệ trush cho kênh bảo mật SSL/TLS. -> Chứng chỉ từ xa không hợp lệ theo quy trình xác thực..net WebService, bỏ qua xác thực ssl!

Bây giờ câu hỏi của tôi là có bất kỳ cách nào để bỏ qua kiểm tra này, tôi sử dụng Tham chiếu Web bình thường (2.0) không phải là Tham chiếu Dịch vụ ..

Trả lời

6

Có, bạn có thể sử dụng sau đây để có ASP.NET phớt lờ những lời cảnh báo chứng chỉ:

using System; 
using System.Net; 
using System.Security.Cryptography.X509Certificates; 

namespace YourNamespace 
    public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy 
    { 
     public TrustAllCertificatePolicy() {} 

     public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) 
     { 
      return true; 
     } 
    } 
} 
5
System.Net.ServicePointManager.ServerCertificateValidationCallback = _ 
    Function(a, b, c, d) True 
8

Đối với những người không thể xác định bắt đầu từ đâu với câu trả lời này, nó có thể không rõ ràng. Các áp phích ở trên đang làm cho nó đúng, nhưng nó không phải là rõ ràng trả trước về những gì cần làm với mã đã cho.

Giả sử bạn có một lớp học ở đâu đó cần phải gọi dịch vụ web có chứng chỉ.

Đây là giải pháp hoàn chỉnh của tôi:

public class MyClass 
{ 

    public bool TrustAllCertificatesCallback(object sender, X509Certificate cert, 
               X509Chain chain, SslPolicyErrors errors) 
    { 
     return true; 
    } 

    public string CallSomeWebService(string someParam) 
    { 
     try 
     { 
      ServicePointManager.ServerCertificateValidationCallback = TrustAllCertificatesCallback; 


      RemoteWebService ws = new RemoteWebService(); 

      //add the client cert to the web service call. 
      ws.ClientCertificates.Add(GetMyCert()); 

      //call the web service 
      string response = ws.SomeMethod(someParam); 

      return response.ToString(); 
     } 
     catch (Exception ex) 
     {throw;} 
    } 

    public X509Certificate GetMyCert() 
    { 
     try 
     { 
      string certPath = @"C:\MyCerts\MyCert.cer"; 
      var cert = X509Certificate.CreateFromCertFile(certPath); 
      return cert; 
     } 
     catch (Exception ex) 
     {throw;} 
    } 
} 
4

đón quý khách hương vị ..

lambda expresions

  //Trust all certificates 
      System.Net.ServicePointManager.ServerCertificateValidationCallback = 
       ((sender, certificate, chain, sslPolicyErrors) => true); 

      // trust sender (more secure) 
      System.Net.ServicePointManager.ServerCertificateValidationCallback 
       = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); 

hoặc đồng bằng clode (tốt hơn để thử nghiệm)

  // validate cert 
      // allows for validation of SSL conversations 
      ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

    // callback used to validate the certificate in an SSL conversation 
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) 
    { 
     bool result = false; 
     if (cert.Subject.ToUpper().Contains("YourServerName")) 
     { 
      result = true; 
     } 

     return result; 
    } 
+0

Đây là tuyệt vời, tôi thích "an toàn hơn" tùy chọn cũng như sắp xếp kiểm tra xem cert có thể đóng từ xa không! –

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