2009-08-09 28 views
6

Tôi hiện đang mở kết nối https tới máy chủ web bằng NSURLConnection. Tất cả mọi thứ hoạt động như nó cần và tôi có thể lấy lại nội dung trang tôi đang làm. Chứng chỉ được VeriSign cấp và tôi giả định NSURLConnection thực hiện một số công việc để xác minh tính xác thực của chứng chỉ ở một mức độ nào đó? Nếu tôi kết nối với cùng một trang web thông qua safari di động, nó sẽ trích xuất từ ​​chứng chỉ và hiển thị Tổ chức (của trang web) trong thanh điều hướng. Có thể trích xuất các chi tiết tương tự này trong Cocoa Touch vì tôi cũng muốn trình bày chúng cho người dùng không? Ngoài ra, việc xác minh tên máy chủ của máy chủ đối với chứng chỉ đó đủ hợp lý để giả sử trang web là hợp pháp?Cách xác minh chứng chỉ trang web trong Cocoa Touch?

Trả lời

5

NSURLConnection sẽ cung cấp cho bạn một lỗi (NSURLErrorDomain) nếu bạn cố kết nối với máy chủ có chứng chỉ không hợp lệ (ví dụ: ký tự, đã lỗi thời, có máy chủ không đúng, v.v.). Vì vậy, bạn không thực sự cần phải tự mình thực hiện bất kỳ xác minh nào vì tất cả đều được xử lý cho bạn.

Nếu bạn thực sự muốn/cần hiển thị tóm tắt chứng chỉ SSL trong giao diện người dùng của mình, bạn cần phải thả xuống một lớp từ NSURLConnection và sử dụng API cấp thấp CFNetwork thay thế. Một khi bạn có một CFReadStreamRef đó là trong tình trạng kCFStreamEventEndEncountered, bạn sẽ có thể làm như sau (giả sử dòng xử lý của bạn được gọi readStream):

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
    SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
    NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
    NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
} 

Bạn sẽ cần phải giải mã các thông tin được tổ chức tại data nếu bạn muốn để truy cập các thuộc tính khác nhau của chứng chỉ, nhưng tóm tắt được giữ trong description có thể là đủ cho các mục đích của bạn.

+1

Cảm ơn sự giúp đỡ của Nathan, hãy thả một lớp như bạn đã đề xuất làm thủ thuật! Mặc dù không thực sự là một vấn đề, không nên NSDictionary * cast của bạn là một NSArray * thay vào đó? – dbotha

+0

Bạn có thể đăng một mẫu mã Deon không? – Pripyat

+0

@Deon Phải rồi! Tôi đã cập nhật mã mẫu. –

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