Bỏ qua lỗi chứng chỉ SSL không hợp lệ khi gọi dịch vụ web trong .Net


88

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 đó để truy xuất 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ệ:

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

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

Chứng chỉ từ xa không hợp lệ theo quy trình xác nhận.

Điều này đúng vì chúng tôi đang sử dụng chứng chỉ tạm thời.

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

Câu trả lời:


18

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

Tôi thường thực hiện kiểm tra với các chứng chỉ được tạo bằng CACERT và việc thêm chúng vào danh sách cơ quan đáng tin cậy của tôi đã hoạt động bình thường.

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ó mô phỏng đúng những gì sẽ xảy ra khi ứng dụng của bạn được triển khai. Do đó, tôi nghĩ rằng đây là một giải pháp tốt hơn để tắt kiểm tra theo chương trình.


Đó cũng là ý tưởng đầu tiên của tôi. Thật không may, chứng chỉ cũng hết hạn, vì vậy không thể làm cho nó đáng tin cậy.
jan.vdbergh 20-08

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

113

Ngoài ra, bạn có thể đăng ký một đại biểu gọi lại bỏ qua lỗi chứng 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
Juan Zamora

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

5
Đây là tất cả các bạn cần phải làm, nếu bạn muốn trở thành vulnarable đến "Man in the Middle" tấn công ...
Houtman

2
Tốt nhất bạn chỉ nên làm điều này trong môi trường phát triển.
Ron DeFreitas

79

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

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Tôi đặt cái này vào Main của mình và xem xét app.configvà kiểm tra xem (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")trước khi gọi dòng mã đó.


24

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

Gọi số sau ngay trước khi gọi dịch vụ web ssl của bạn gây ra 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;
        };
}

12

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ư bên dưới 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);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

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


1

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


1

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

Bạn sẽ cần một số loại chứng chỉ tự ký. Nếu bạn đang sử dụng IIS Express, bạn sẽ có một trong những thứ này, bạn chỉ cần 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 mình, bạn có thể xuất chứng chỉ sang tệp.

Tiếp theo, mở MMC.exe và thêm phần đính vào Chứng chỉ. Nhập tệp chứng chỉ của bạn vào cửa hàng 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 đảm bảo rằng nó đi vào cửa hàng đó chứ 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 cung cấp thông tin về cách thực hiện việc này.

Bây giờ, toàn bộ máy tính của bạn sẽ hoàn toàn tin cậy bất kỳ chứng chỉ nào mà nó đã tự tạo và bạn sẽ không cần thêm mã để xử lý điều này một cách đặc biệt. 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ài đặt chứng chỉ hợp lệ thích hợp ở đó. Đừng làm điều này trên máy chủ sản xuất - điều đó sẽ không tốt và nó sẽ không hoạt động với bất kỳ máy khách nào khác ngoài những máy khách trên chính máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.