2010-06-23 35 views
7

Khi thực hiện yêu cầu HTTPS đối với máy chủ web từ xa, tôi sử dụng WebRequest, thiết lập kết nối an toàn với máy chủ web từ xa. Trong quá trình phát triển, tôi sử dụng cert tự ký trên máy chủ và WebRequest không thiết lập được kết nối an toàn vì cert không hợp lệ, đó là hành vi được mong đợi.Xác minh chứng chỉ SSL từ xa trong khi yêu cầu HTTPS

Tôi đã tìm thấy mã này "kiểm soát lại" kiểm tra cert, được kích hoạt bằng cách gọi phương thức SetCertificatePolicy() trong mã sau.

public static void SetCertificatePolicy() 
{ 
    ServicePointManager.ServerCertificateValidationCallback 
       += RemoteCertificateValidate; 
} 

/// <summary> 
/// Remotes the certificate validate. 
/// </summary> 
private static bool RemoteCertificateValidate(
    object sender, X509Certificate cert, 
    X509Chain chain, SslPolicyErrors error) 
{ 
    // trust any certificate!!! 
    System.Console.WriteLine("Warning, trust any certificate"); 
    return true; 
} 

tôi tự hỏi, nếu nó có thể làm kiểm tra đặc biệt về cert SSL từ xa (sử dụng trên mã, ví dụ), vì vậy mà tôi có thể xác minh rằng máy chủ web từ xa sử dụng cert SSL hợp lệ, và không chỉ bất kỳ hợp lệ cert, nhưng chính xác một trong những tôi muốn? Ví dụ: tôi muốn đảm bảo rằng tôi đang nói chuyện với trang web www.someplace.com, chứng nhận được cấp cho ACME Inc, với dấu vân tay 00:11:22: .....

"Phương pháp hay nhất là gì "phương pháp tiếp cận cho kịch bản này?

Cảm ơn!

Trả lời

7

Nếu bạn thực sự muốn gắn nó xuống một chứng chỉ cụ thể, bạn có thể so sánh dữ liệu chứng chỉ (theo định dạng DER) với byte[] trong certificate.GetRawCertData().

Bạn cũng có thể sử dụng GetCertHashString()Subject trên thông số certificate trong RemoteCertificateValidate để nhận thông tin bạn đang theo dõi. Tên máy chủ phải nằm trong tên thay thế chủ đề của chứng chỉ hoặc, nếu không có tên thay thế chủ đề, trong CN của tên chủ đề (phân biệt). Xem xét các định dạng .NET chuỗi chủ đề, điều này nên được CN đầu tiên = bạn tìm thấy ở đó.

Bạn cũng sẽ nhận được nhiều dữ liệu hơn nếu certificate là phiên bản của X509Certificate2. Sau đó, bạn sẽ có thể nhận được SubjectName làm X500PrincipalName và cũng là Extensions (để kiểm tra tiện ích mở rộng tên thay thế của chủ đề). Có thể hữu ích khi sử dụng các công cụ như BouncyCastle để phân tích cú pháp tên chủ đề.

Bạn cũng có khả năng nhận thêm thông tin về tên máy chủ mà bạn đang cố gắng liên hệ trong số sender, tùy thuộc vào loại thời gian chạy của máy chủ.

+0

Cảm ơn, đó là những gì tôi đã được loại thông tin tôi đang tìm kiếm. Chỉ cần một Q nhanh chóng, về gợi ý đầu tiên (so sánh dữ liệu cert để byte []) - tôi có cần so sánh mảng byte của chứng chỉ hợp lệ đã biết với mảng tôi đang xác minh không? –

+0

Tôi nghĩ mảng byte sẽ là chứng chỉ trong mã hóa DER, vì vậy bạn nên so sánh với chứng chỉ tham chiếu của mình ở định dạng DER (nhiều công cụ, bao gồm công cụ chứng chỉ Windows có thể xuất sang định dạng đó). Bạn thậm chí có thể tải trực tiếp từ kho chứng chỉ (không chắc chắn cách thực hiện). – Bruno

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