Bất kỳ ai có thể xác nhận rằng ký tự đại diện bị xóa bởi thư viện Indy hoặc OpenSSL, mặc dù cần xác minh tên máy chủ?
Không, OpenSSL không xóa nó.
Tôi không biết về thư viện Indy.
bất cứ ai có thể xác nhận rằng các ký tự đại diện được lấy ra bởi Indy hoặc các thư viện OpenSSL, mặc dù nó là cần thiết để xác minh tên máy?
tôi trích dẫn này hai lần vì một lý do :) Đặt tên máy chủ trong Common Name (CN) bị phản đối bởi cả IETF và Diễn đàn CA/B (những gì các trình duyệt theo).
Những gì bạn có thể gặp phải là một cái gì đó như CN=example.com
.Trong trường hợp này, example.com
không là một tên máy chủ; chứ không phải nó là một miền. Vì vậy, bạn không nên cho nó có nghĩa là để phù hợp với *.example.com
.
Và nếu một máy chủ trả lời tại https://example.com
, bạn chỉ nên chấp nhận giấy chứng nhận nếu Subject Alternate Name bao gồm example.com
vì tên miền được liệt kê trong CN bởi các CA công cộng. Public CAs đặt tên DNS trong SAN vì chúng tuân theo Diễn đàn CA/B.
Có ai có ý tưởng để xác minh tên máy trong những trường hợp?
OpenSSL trước 1.1.0 đã làm không thực hiện đối sánh tên máy chủ. Các nhà phát triển đã phải làm điều đó. OpenSSL 1.1.0 trở lên có chức năng được tích hợp. Xem X509_check_host(3)
và bạn bè.
Để phù hợp với một hostname, bạn nên thu thập tất cả các tên từ cả các Common Name (CN) và Subject Alternate Name (SAN). Sau đó, nó thường đơn giản như một biểu thức chính quy phù hợp.
IETF nhanh và lỏng, đồng thời cho phép tên máy chủ hiển thị trong CN hoặc SAN. Diễn đàn và trình duyệt CA/B nghiêm ngặt hơn: nếu tên máy chủ nằm trong CN, thì nó cũng phải có mặt trong SAN (có, nó phải được liệt kê hai lần). Nếu không, Diễn đàn và trình duyệt CA/B mong đợi tất cả tên máy chủ trong SAN.
Tôi tin rằng OpenSSL và Diễn đàn CA/B chỉ cho phép ký tự đại diện ở nhãn ngoài cùng bên trái. Tôi tin rằng IETF cho phép các ký tự đại diện xuất hiện ở bất cứ đâu.
Nếu bạn muốn xem mã mẫu, hãy kiểm tra triển khai của cURL. cURL sử dụng OpenSSL, nhưng không phụ thuộc vào X509_check_host(3)
và bạn bè của 1.1.0. cURL đã thực hiện riêng.
Cảnh báo nhanh. Đối sánh tên máy chủ là một nghệ thuật đen. Ví dụ:
IETF cho phép khớp với Tên miền cấp cao nhất toàn cầu (gTLD) như *.com
hoặc *.net
; và Tên miền cấp cao nhất quốc gia (ccTLD) như *.uk
hoặc *.us
. Tôi coi đây là một cuộc tấn công bởi vì tôi biết không có CA đơn lẻ nào có thể yêu cầu "sở hữu" hoặc "chứng nhận" một gTLD. Nếu tôi trải qua một trong những loại certs đó trong tự nhiên, thì tôi từ chối nó.
Diễn đàn CA/B không cho phép gTLD ký tự đại diện hoặc ccTLD. Các trình duyệt cố gắng tránh nó bằng cách sử dụng Public Suffix List (PSL). Mọi thứ trở nên tồi tệ hơn với các tên miền ảo, như *.google
.
Có một điều khác mà trình duyệt cố gắng thực hiện với PSL. Họ cố gắng khắc phục ranh giới hành chính trên các tên miền phụ. Ví dụ, Amazon sở hữu tất cả amazon.com, nhưng họ ủy quyền cho các tên miền phụ, như example.amazon.com.Vì vậy, PSL cố gắng cho phép Amazon kiểm soát miền của họ amazon.com
, nhưng không cho phép miền phụ có liên quan đến người bán của bạn là example.amazon.com
.
IETF đang cố gắng giải quyết các ranh giới hành chính trong DBOUND Working Group. Nhưng mọi thứ dường như bị đình trệ trong ủy ban.
Các dữ liệu chứng chỉ được cung cấp bởi OpenSSL riêng của mình. Lớp 'TIdX509' của Indy chỉ đơn giản là kết thúc xử lý' PX509' được cung cấp bởi OpenSSL bên trong hàm gọi lại xác minh của Indy. 'TIdX509' không lộn xộn xung quanh với dữ liệu chứng chỉ, nó trình bày nó như là. Thuộc tính 'Subject' bao bọc một xử lý' PX509_NAME' từ hàm 'X509_get_subject_name()' của OpenSSL và thuộc tính 'OneLine' trả về bất kỳ giá trị nào của hàm OpenSSL' X509_NAME_oneline() 'trả về. Vì vậy, chính OpenSSL đang loại bỏ ký tự đại diện. –
Điều đó đang được nói, OpenSSL có các hàm 'X509_check_host()' và 'certificate_host_name_override()'. Bạn có thể vượt qua chúng xử lý 'PX509' ban đầu (thành viên' TIdX509.FX509' - bạn sẽ phải sử dụng một lớp accessor để tiếp cận nó) và tên máy chủ mà bạn đã kết nối tới. –
Cảm ơn bạn đã phản hồi nhanh. Tôi sẽ cố gắng vào ngày mai và cho bạn biết về kết quả của tôi. – Cheesy