Bạn nên biết về RFC3280 section 6.1 và RFC5280 section 6.1. Cả hai đều mô tả các thuật toán để xác thực đường dẫn chứng chỉ. Mặc dù Win32 API chăm sóc một số thứ cho bạn, nhưng vẫn có thể có giá trị để biết về quy trình nói chung.
Ngoài ra, đây là (theo ý kiến của tôi) tham khảo khá đáng tin cậy: Chromium certificate verification code.
Nói chung, tôi nghĩ mã của bạn không chính xác. Nhưng đây là một vài điều tôi muốn nhìn vào/thay đổi, nếu tôi là bạn:
1. Tách Common Name Validation
Chromium xác nhận giấy chứng nhận tên gọi chung tách biệt khỏi chuỗi. Rõ ràng họ đã nhận thấy một số vấn đề với nó. Xem các ý kiến cho lý do của họ:
cert_verify_proc.win.cc:731 // Certificate name validation happens separately, later, using an internal
cert_verify_proc.win.cc:732 // routine that has better support for RFC 6125 name matching.
2. Sử dụng CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT
Chromium cũng sử dụng lá cờ CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT thay vì CERT_CHAIN_REVOCATION_CHECK_CHAIN. Tôi thực sự bắt đầu xem xét điều này trước khi tôi tìm thấy mã của họ và nó củng cố niềm tin của tôi rằng bạn nên sử dụng CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT.
Mặc dù cả hai RFC nói trên chỉ ra rằng một neo tin cậy tự ký không được coi là một phần của chuỗi, tài liệu cho CertGetCertificateChain (http://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx) nói rằng nó xây dựng một chuỗi cho tới khi có thể. Chứng chỉ gốc đáng tin cậy được xác định (trên cùng một trang) dưới dạng chứng chỉ tự ký đáng tin cậy.
Điều này loại bỏ khả năng * EXCLUDE_ROOT có thể bỏ qua việc kiểm tra thu hồi đối với một neo tin cậy không phải gốc (Win32 thực sự yêu cầu các trust-anchor phải tự ký, mặc dù nó không được yêu cầu bởi bất kỳ RFC nào. tài liệu).
Bây giờ, vì chứng chỉ CA gốc không thể tự thu hồi (CRL không thể được ký/xác minh), có vẻ như với tôi rằng hai cờ này giống hệt nhau.
Tôi đã làm một số googling và vấp trên bài đăng trên diễn đàn này: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/9f95882a-1a68-477a-80ee-0a7e3c7ae5cf/x509revocationflag-question?forum=windowssecurity. Một thành viên của nhóm sản phẩm .NET (được cho là) tuyên bố rằng cờ trong thực tế cũng giống nhau, nếu thư mục gốc tự ký (theo lý thuyết, cờ ENTIRE_CHAIN sẽ kiểm tra chứng chỉ gốc để thu hồi nếu nó bao gồm phần mở rộng CDP, nhưng không thể xảy ra).
Ông cũng khuyên bạn nên sử dụng cờ * EXCLUDE_ROOT vì cờ khác có thể gây ra yêu cầu mạng không cần thiết, nếu CA gốc tự ký bao gồm phần mở rộng CDP.
Thật không may:
- tôi không thể tìm thấy bất kỳ lời giải thích chính thức ghi nhận về sự khác biệt giữa hai lá cờ.
- Mặc dù có khả năng là các cuộc thảo luận được liên kết áp dụng cho cùng một cờ Win32 API dưới mui xe của .NET, nó không được đảm bảo.
Để được hoàn toàn chắc chắn rằng đó là ok để sử dụng CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT, tôi googled hơn một chút và tìm thấy mã xác minh giấy chứng nhận SSL Chromium tôi liên kết với ở đầu trả lời của tôi.
Là một tiền thưởng thêm, các tập tin cert_verify_proc_win.cc Chromium chứa các gợi ý sau đây về mã xác minh IE:
618: // IE passes a non-NULL pTime argument that specifies the current system
619: // time. IE passes CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT as the
620: // chain_flags argument.
Không chắc cách họ muốn biết điều này, nhưng tại thời điểm này, tôi muốn cảm thấy thoải mái sử dụng CERT_CHAIN_REVOCATION_CHECK_EXCLUDE_ROOT.
3. Giấy chứng nhận được chấp nhận khác nhau Công dụng
tôi nhận thấy Chromium cũng quy định cụ thể 3 tập quán giấy chứng nhận thay cho 1:
szOID_PKIX_KP_SERVER_AUTH,
szOID_SERVER_GATED_CRYPTO,
szOID_SGC_NETSCAPE
Từ những gì tôi có thể thu thập thông qua Google, các tập quán khác có thể được yêu cầu của web cũ hơn trình duyệt, nếu không chúng có thể không thiết lập kết nối an toàn.
Nếu Chromium thích hợp để bao gồm các tập quán này, tôi sẽ làm theo.
Lưu ý rằng nếu bạn thay đổi mã, bạn cũng nên đặt params.RequestedUsage.dwType thành USAGE_MATCH_TYPE_OR thay vì USAGE_MATCH_TYPE_AND.
-
Tôi không thể nghĩ ra bất kỳ nhận xét nào khác vào lúc này.Nhưng nếu tôi là bạn, tôi sẽ tự mình kiểm tra nguồn Chromium (và có thể cả Firefox nữa) - chỉ để chắc chắn tôi đã không bỏ lỡ bất cứ điều gì.
Bạn không đề cập đến những gì bạn đang sử dụng cho, nhưng có, nói chung bạn nên vượt qua CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT nếu bạn đang sử dụng điều này trong một kịch bản HTTPS điển hình. – EricLaw
Tôi chủ yếu muốn sử dụng điều này để xác minh chứng chỉ SSL máy chủ LDAP (như bên trong hàm VERIFYSERVERCERT). Tôi cũng đang nghĩ đến việc sử dụng nó để xác minh chứng chỉ máy chủ HTTPS trong ứng dụng khách/máy chủ nơi khách hàng có thể chỉ định chứng chỉ SSL của riêng họ cho máy chủ. – briangreenery
Có thường sử dụng CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT thay vì CERT_CHAIN_REVOCATION_CHECK_CHAIN không? Tại sao bạn không kiểm tra chứng chỉ gốc để thu hồi? – briangreenery