2008-09-20 58 views
80

Chúng tôi đang thiết lập một SharePoint mới mà chúng tôi chưa có chứng chỉ SSL hợp lệ. Tôi muốn gọi dịch vụ web Lists trên đó để lấy một số dữ liệu meta về thiết lập. Tuy nhiên, khi tôi cố gắng để làm điều này, tôi nhận được ngoại lệ:Bỏ qua các lỗi chứng chỉ SSL không hợp lệ khi gọi các dịch vụ web trong .Net

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

Ngoại lệ lồng nhau có chứa các thông báo lỗi:

The remote certificate is invalid according to the validation procedure.

này là đúng vì chúng ta đang sử dụng một giấy chứng nhận tạm thời.

Câu hỏi của tôi là: làm thế nào tôi có thể thông báo cho ứng dụng khách dịch vụ web Net (SoapHttpClientProtocol) để bỏ qua các lỗi này?

Trả lời

17

Cách tiếp cận tôi sử dụng khi gặp sự cố này là thêm người ký chứng chỉ tạm thời vào danh sách cơ quan đáng tin cậy trên máy tính được đề cập.

Tôi thường làm thử nghiệm với chứng chỉ được tạo bằng CACERT và thêm chúng vào danh sách các cơ quan chức năng đáng tin cậy của tôi làm việc bơi lội.

Làm theo cách này có nghĩa là bạn không phải thêm bất kỳ mã tùy chỉnh nào vào ứng dụng của mình và nó sẽ mô phỏng chính xác những gì sẽ xảy ra khi ứng dụng của bạn được triển khai. Như vậy, tôi nghĩ rằng đây là một giải pháp vượt trội để tắt kiểm tra theo chương trình.

+0

Đó cũng là ý tưởng đầu tiên của tôi. Thật không may là giấy chứng nhận hết hạn là tốt, vì vậy nó là không thể làm cho nó đáng tin cậy. –

+0

Có lý do gì khiến bạn không thể sử dụng một người như CA cert? Nếu đó là một chứng chỉ kiểm tra thì bạn có thể tiếp tục với điều đó. Tôi không chắc chắn có cách nào để tắt các séc này không! –

107

Hoặc bạn có thể đăng ký một cuộc gọi trở lại đại biểu mà bỏ qua các lỗi xác nhận:

... 
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler; 
... 

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error) 
{ 
// Ignore errors 
return true; 
} 
+1

Tôi đã thêm phương thức tĩnh này vào global.asax và đặt sự kiện trên "OnApplicationStart". làm việc như người ở. Cảm ơn –

+1

@JuanZamora Tôi đã làm điều tương tự bạn đã làm. Nó đã làm việc! –

+3

Đây là tất cả những gì bạn cần làm, nếu bạn muốn trở nên thô lỗ với vụ tấn công * "Man in the Middle" * ... – Houtman

71

Giống như câu trả lời Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

tôi đặt điều này trong chính mình và tìm đến app.config và thử nghiệm của tôi nếu (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True") trước khi gọi dòng mã đó.

20

Tôi giải quyết nó theo cách này:

Gọi sau ngay trước khi gọi webservice ssl của bạn gây ra mà lỗi:

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

/// <summary> 
/// solution for exception 
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure. 
/// </summary> 
public static void BypassCertificateError() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 

     delegate(
      Object sender1, 
      X509Certificate certificate, 
      X509Chain chain, 
      SslPolicyErrors sslPolicyErrors) 
     { 
      return true; 
     }; 
} 
+3

+1 để thêm cách sử dụng và không gian tên :) –

+1

Holy% @ # $! bạn đã cứu mạng tôi rồi! THANK YOU imanabidi !! –

0

Đối với người mới, bạn có thể mở rộng lớp dịch vụ một phần của bạn trong một cs riêng tệp và thêm mã được cung cấp bởi "imanabidi" để mã được tích hợp

10

Tôi đã gặp lỗi tương tự khi sử dụng DownloadString; và đã có thể làm cho nó hoạt động như dưới đây với các đề xuất trên trang này

System.Net.WebClient client = new System.Net.WebClient();    
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
string sHttpResonse = client.DownloadString(sUrl); 
2
ServicePointManager.ServerCertificateValidationCallback += 
      (mender, certificate, chain, sslPolicyErrors) => true; 

sẽ bỏ qua ssl invaild. Viết nó cho nhà xây dựng dịch vụ web của bạn.

1

Để mở rộng hơn nữa trên bài đăng Simon Johnsons - Lý tưởng nhất là bạn muốn một giải pháp mô phỏng các điều kiện bạn sẽ thấy trong sản xuất và sửa đổi mã của bạn sẽ không làm điều đó và có thể nguy hiểm nếu bạn quên lấy mã trước khi bạn triển khai nó.

Bạn sẽ cần chứng chỉ tự ký của một số loại. Nếu bạn đang sử dụng IIS Express, bạn sẽ có một trong số này, bạn sẽ phải tìm nó. Mở Firefox hoặc bất kỳ trình duyệt nào bạn thích và truy cập trang web nhà phát triển của bạn.Bạn sẽ có thể xem thông tin chứng chỉ từ thanh URL và tùy thuộc vào trình duyệt của bạn, bạn sẽ có thể xuất chứng chỉ sang tệp.

Tiếp theo, mở MMC.exe và thêm chứng chỉ snap-in. Nhập tệp chứng chỉ của bạn vào kho lưu trữ Tổ chức phát hành chứng chỉ gốc đáng tin cậy và đó là tất cả những gì bạn cần. Điều quan trọng là phải chắc chắn rằng nó đi vào cửa hàng đó và không phải một số cửa hàng khác như 'Cá nhân'. Nếu bạn không quen với MMC hoặc chứng chỉ, có rất nhiều trang web có thông tin về cách thực hiện điều này.

Bây giờ, toàn bộ máy tính của bạn sẽ tin tưởng hoàn toàn vào bất kỳ chứng chỉ nào đã tạo và bạn sẽ không cần thêm mã để xử lý đặc biệt này. Khi bạn chuyển sang sản xuất, nó sẽ tiếp tục hoạt động với điều kiện bạn có một chứng chỉ hợp lệ được cài đặt ở đó. Đừng làm điều này trên một máy chủ sản xuất - đó sẽ là xấu và nó sẽ không làm việc cho bất kỳ khách hàng nào khác ngoài những khách hàng trên máy chủ.

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