C # Bỏ qua lỗi chứng chỉ?


159

Tôi gặp lỗi sau trong khi yêu cầu dịch vụ web đến dịch vụ web từ xa:

Không thể thiết lập mối quan hệ tin cậy cho kênh bảo mật SSL / TLS. ---> System.Security.Authentication.AuthenticationException: Chứng chỉ từ xa không hợp lệ theo quy trình xác nhận.

Có cách nào để bỏ qua lỗi này, và tiếp tục?

Có vẻ như chứng chỉ từ xa không được ký.

Trang web tôi kết nối là www.czebox.cz- vì vậy, vui lòng truy cập trang web và thông báo ngay cả các trình duyệt ném ngoại lệ bảo mật.

Câu trả lời:


341

Thêm một trình xử lý xác nhận chứng chỉ. Trở về truesẽ cho phép bỏ qua lỗi xác thực:

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;

6
Điều này thậm chí còn hữu ích hơn lần đầu tiên xuất hiện. Tôi gặp phải vấn đề của OP khi sử dụng Dịch vụ web được trao đổi được quản lý (EWS). Tôi nghĩ rằng tôi không thể sử dụng câu trả lời này vì tôi không có quyền truy cập vào các cuộc gọi SOAP cấp thấp đang được thực hiện bởi thư viện được quản lý đó. Nhưng khi tôi nhìn lại, tôi nhận ra ServicePointManager tự đứng vững. Vì vậy, tôi đã thêm cuộc gọi lại ở trên trước khi khởi tạo ExchangeService và nó hoạt động như một cơ duyên.
Mark Meuer

2
Dưới đây là một ví dụ về cách áp dụng bỏ qua trên toàn cầu. Đối với tất cả chúng ta vào thực tiễn xấu. (Đôi khi bạn không có sự lựa chọn nào) jasig.275507.n4.nabble.com/ từ
snowYetis

1
một lời cảm ơn lớn điều này tạm thời giải quyết vấn đề Thêm mã này vào Startup.cs trong Web Api
Sivalingaamorthy

2
@MarkMeuer gần như sẽ từ bỏ giải pháp này cho vấn đề API EWS của tôi, nhưng sau đó tôi thấy nhận xét của bạn.
Mahen

7
@MiguelVeloso bạn có thể tự do downvote ofcference, nhưng hãy ghi nhớ, không phải câu hỏi cũng như câu trả lời thảo luận về khía cạnh bảo mật của điều này. Chủ đề rõ ràng là "làm thế nào để bỏ qua lỗi xác nhận", chứ không phải "tại sao chúng ta nên làm / không làm điều này", đây là một chủ đề hoàn toàn khác. Đi sâu vào một cuộc thảo luận về lý do tại sao OP không nên làm điều đó sẽ chỉ làm vẩn đục nước, vì các nhà bình luận đã chỉ ra rằng có những trường hợp hợp lý mà bạn thực sự sẽ làm điều này. Vì vậy, chúng tôi bám sát chủ đề và giải quyết vấn đề.
Peter Lillevold

40

Cho phép tất cả các chứng chỉ là rất mạnh mẽ nhưng nó cũng có thể nguy hiểm. Nếu bạn muốn chỉ cho phép các chứng chỉ hợp lệ cộng với một số chứng chỉ nhất định thì có thể được thực hiện như thế này.

Lõi .Net:

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
        if (sslPolicyErrors == SslPolicyErrors.None)
        {
            return true;   //Is valid
        }

        if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
        {
            return true;
        }
        return false;
    };
    using (var httpClient = new HttpClient(httpClientHandler))
    {
        var httpResponse = httpClient.GetAsync("https://example.com").Result;
    }
}

.Nền tảng NET:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (
    object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;   //Is valid
    }

    if (cert.GetCertHashString() == "99E92D8447AEF30483B1D7527812C9B7B3A915A7")
    {
        return true;
    }

    return false;
};

Cập nhật:

Cách nhận cert.GetCertHashString()giá trị trong Chrome:

Bấm vào Securehoặc Not Securetrong thanh địa chỉ.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Sau đó bấm vào Chứng chỉ -> Chi tiết -> Dấu vân tay và sao chép giá trị. Nhớ làm cert.GetCertHashString().ToLower().

nhập mô tả hình ảnh ở đây


3
@MiguelVeloso Hoàn toàn đồng ý. Điều này cho phép bỏ qua việc kiểm tra (hy vọng) một hoặc hai chứng chỉ mà không ảnh hưởng đến bảo mật hoàn toàn.
Kemuel Sanchez

HOw tôi có thể nhận được Hash Stringtừ một chứng chỉ?
Kiquenet

@Kiquenet Hoặc gỡ lỗi mã và chạy cert.GetCertHashString()từ Immediate windowhoặc kiểm tra cert Thumbprinttrong trình duyệt của bạn hoặc MMCnếu nó được cài đặt cục bộ.
Ogglas

Máy chủ nằm trong tầm kiểm soát của chúng tôi, liệu có an toàn khi sử dụng mã của @ Ogglas khi sản xuất không? Sử dụng TLS / SSL, có thể dừng cuộc tấn công như người trung gian không?
Pingpong

Cảm ơn bạn rất giúp đỡ.
Wowo Ot

30

Phương pháp IgnoreBadCertert:

//I use a method to ignore bad certs caused by misc errors
IgnoreBadCertificates();

// after the Ignore call i can do what ever i want...
HttpWebRequest request_data = System.Net.WebRequest.Create(urlquerystring) as HttpWebRequest;

/*
and below the Methods we are using...
*/

/// <summary>
/// Together with the AcceptAllCertifications method right
/// below this causes to bypass errors caused by SLL-Errors.
/// </summary>
public static void IgnoreBadCertificates()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
}  

/// <summary>
/// In Short: the Method solves the Problem of broken Certificates.
/// Sometime when requesting Data and the sending Webserverconnection
/// is based on a SSL Connection, an Error is caused by Servers whoes
/// Certificate(s) have Errors. Like when the Cert is out of date
/// and much more... So at this point when calling the method,
/// this behaviour is prevented
/// </summary>
/// <param name="sender"></param>
/// <param name="certification"></param>
/// <param name="chain"></param>
/// <param name="sslPolicyErrors"></param>
/// <returns>true</returns>
private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
} 

2
Tôi đã phải thêm một dòng nữa để mã này hoạt động với mã của tôi (Tôi đang sử dụng websocket4net). System.Net.ServicePointManager.CheckCertertRevocationList = false; Ngay sau khi thiết lập cuộc gọi lại xác nhận chứng chỉ máy chủ.
kalyanswaroop

24

Lý do thất bại không phải vì nó không được ký mà vì chứng chỉ gốc không được khách hàng của bạn tin tưởng. Thay vì tắt xác thực SSL, một cách tiếp cận khác sẽ là thêm chứng chỉ CA gốc vào danh sách các CA mà ứng dụng của bạn tin tưởng.

Đây là chứng chỉ CA gốc mà ứng dụng của bạn hiện không tin tưởng:

-----BEGIN CERTIFICATE-----
MIIFnDCCBISgAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJDWjEs
MCoGA1UECgwjxIxlc2vDoSBwb8WhdGEsIHMucC4gW0nEjCA0NzExNDk4M10xHjAc
BgNVBAMTFVBvc3RTaWdudW0gUm9vdCBRQ0EgMjAeFw0xMDAxMTkwODA0MzFaFw0y
NTAxMTkwODA0MzFaMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoFz8yBxf
2gf1uN0GGXknvGHwurpp4Lw3ZPWZB6nEBDGjSGIXK0Or6Xa3ZT+tVDTeUUjT133G
7Vs51D6z/ShWy+9T7a1f6XInakewyFj8PT0EdZ4tAybNYdEUO/dShg2WvUyfZfXH
0jmmZm6qUDy0VfKQfiyWchQRi/Ax6zXaU2+X3hXBfvRMr5l6zgxYVATEyxCfOLM9
a5U6lhpyCDf2Gg6dPc5Cy6QwYGGpYER1fzLGsN9stdutkwlP13DHU1Sp6W5ywtfL
owYaV1bqOOdARbAoJ7q8LO6EBjyIVr03mFusPaMCOzcEn3zL5XafknM36Vqtdmqz
iWR+3URAUgqE0wIDAQABo4ICaTCCAmUwgaUGA1UdHwSBnTCBmjAxoC+gLYYraHR0
cDovL3d3dy5wb3N0c2lnbnVtLmN6L2NybC9wc3Jvb3RxY2EyLmNybDAyoDCgLoYs
aHR0cDovL3d3dzIucG9zdHNpZ251bS5jei9jcmwvcHNyb290cWNhMi5jcmwwMaAv
oC2GK2h0dHA6Ly9wb3N0c2lnbnVtLnR0Yy5jei9jcmwvcHNyb290cWNhMi5jcmww
gfEGA1UdIASB6TCB5jCB4wYEVR0gADCB2jCB1wYIKwYBBQUHAgIwgcoagcdUZW50
byBrdmFsaWZpa292YW55IHN5c3RlbW92eSBjZXJ0aWZpa2F0IGJ5bCB2eWRhbiBw
b2RsZSB6YWtvbmEgMjI3LzIwMDBTYi4gYSBuYXZhem55Y2ggcHJlZHBpc3UvVGhp
cyBxdWFsaWZpZWQgc3lzdGVtIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQgYWNjb3Jk
aW5nIHRvIExhdyBObyAyMjcvMjAwMENvbGwuIGFuZCByZWxhdGVkIHJlZ3VsYXRp
b25zMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQW
BBQVKYzFRWmruLPD6v5LuDHY3PDndjCBgwYDVR0jBHwweoAUFSmMxUVpq7izw+r+
S7gx2Nzw53ahX6RdMFsxCzAJBgNVBAYTAkNaMSwwKgYDVQQKDCPEjGVza8OhIHBv
xaF0YSwgcy5wLiBbScSMIDQ3MTE0OTgzXTEeMBwGA1UEAxMVUG9zdFNpZ251bSBS
b290IFFDQSAyggFkMA0GCSqGSIb3DQEBCwUAA4IBAQBeKtoLQKFqWJEgLNxPbQNN
5OTjbpOTEEkq2jFI0tUhtRx//6zwuqJCzfO/KqggUrHBca+GV/qXcNzNAlytyM71
fMv/VwgL9gBHTN/IFIw100JbciI23yFQTdF/UoEfK/m+IFfirxSRi8LRERdXHTEb
vwxMXIzZVXloWvX64UwWtf4Tvw5bAoPj0O1Z2ly4aMTAT2a+y+z184UhuZ/oGyMw
eIakmFM7M7RrNki507jiSLTzuaFMCpyWOX7ULIhzY6xKdm5iQLjTvExn2JTvVChF
Y+jUu/G0zAdLyeU4vaXdQm1A8AEiJPTd0Z9LAxL6Sq2iraLNN36+NyEK/ts3mPLL

-----END CERTIFICATE-----

Bạn có thể giải mã và xem chứng chỉ này bằng cách sử dụng

bộ giải mã chứng chỉ này hoặc bộ giải mã chứng chỉ khác


Đúng! Đây là trường hợp của tôi, nhưng làm cách nào để thêm chứng chỉ trên Azure mà không cần VM? Tôi chỉ có thể sử dụng API X509Store? Tôi sẽ thử điều đó vào ngày mai nhưng mọi thông tin đều được chào đón ở đây
João Antunes

7

Để vô hiệu hóa xác nhận ssl cert trong cấu hình máy khách.

<behaviors>
   <endpointBehaviors>
      <behavior name="DisableSSLCertificateValidation">
         <clientCredentials>
             <serviceCertificate>
                <sslCertificateAuthentication certificateValidationMode="None" />
              </serviceCertificate>
           </clientCredentials>
        </behavior>

Đây có phải là web.config không? Bất kỳ sự thay thế nào cho ASP.NET Core?
Shimmy Weitzhandler

5

Mã này làm việc cho tôi. Tôi đã phải thêm TLS2 vì đó là những gì URL tôi quan tâm đang sử dụng.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(UserDataUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new
      MediaTypeWithQualityHeaderValue("application/json"));
    Task<string> response = client.GetStringAsync(UserDataUrl);
    response.Wait();

    if (response.Exception != null)
    {
         return null;
    }

    return JsonConvert.DeserializeObject<UserData>(response.Result);
}

3

Bỏ qua chứng chỉ SSL ....

        HttpClientHandler clientHandler = new HttpClientHandler();
        clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };

        // Pass the handler to httpclient(from you are calling api)
        var client = new HttpClient(clientHandler)

2

Nếu bạn đang sử dụng ổ cắm trực tiếp và đang xác thực là máy khách, thì phương thức gọi lại Trình quản lý điểm dịch vụ sẽ không hoạt động. Đây là những gì đã làm việc cho tôi. VUI LÒNG SỬ DỤNG ĐỂ KIỂM TRA MỤC ĐÍCH CHỈ .

var activeStream = new SslStream(networkStream, false, (a, b, c, d) => { return true; });
await activeStream.AuthenticateAsClientAsync("computer.local");

Chìa khóa ở đây, là cung cấp cuộc gọi lại xác thực chứng chỉ từ xa ngay trong hàm tạo của luồng SSL.


1

Để tiếp tục mở rộng trên bài đăng của BIGNUM - 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 quá trình sản xuất và sửa đổi mã của mình sẽ không làm đ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 chứng chỉ tự ký của một số loại. Nếu bạn biết những gì bạn đang làm, bạn có thể sử dụng BIGNUM nhị phân được đăng, nhưng nếu không, bạn có thể đi săn chứng chỉ. 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 dev 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ỉ ra một tệp.

Tiếp theo, mở MMC.exe và thêm phần đính kèm Chứng chỉ. Nhập tệp chứng chỉ của bạn vào cửa hàng ủy quyền 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à đảm bảo 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 thuộc 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 việc này.

Bây giờ, toàn bộ máy tính của bạn sẽ hoàn toàn tin tưởng 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ý việc 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 miễn là bạn có 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 - điều đó sẽ rất tệ và nó sẽ không hoạt động đối với bất kỳ khách hàng nào khác ngoài những khách hàng trên chính máy chủ đó.


1

Điều này hoạt động cho .Net Core. Gọi cho khách hàng Xà phòng của bạn:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication =
                new X509ServiceCertificateAuthentication()
                {
                    CertificateValidationMode = X509CertificateValidationMode.None,
                    RevocationMode = X509RevocationMode.NoCheck
                };  
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.