2010-06-11 89 views
10

Tôi có một ứng dụng giao tiếp với nhiều trang web khác nhau và mỗi trang web có chứng chỉ SSL của riêng nó được ký bởi CA nội bộ của chính chúng tôi. Việc này ngăn chúng tôi phải mua chứng chỉ SSL cho mỗi trang web (hàng trăm hoặc hàng nghìn) và an toàn hơn sau đó sử dụng chứng chỉ ký tự đại diện có khóa chia sẻ trên mỗi trang web đó. Vì vậy, về cơ bản sử dụng chứng chỉ CA là cách duy nhất.Chứng chỉ CA tùy chỉnh iPhone cho một ứng dụng sử dụng NSURLConnection?

Hiện tại, tôi có tệp mobileprovision sẽ cài đặt chứng chỉ CA làm hồ sơ trên điện thoại. Khi ứng dụng iPhone của chúng tôi khởi chạy nếu nó gặp lỗi Chứng chỉ SSL, nó chuyển hướng đến tệp dự phòng di động này thông qua Safari và người dùng sẽ được nhắc cài đặt CA.

Vấn đề là tôi lo ngại rằng Apple AppStore có thể từ chối ứng dụng của tôi để thực hiện việc này (chỉ cần một số phản hồi từ các nhà phát triển khác tại thời điểm này) và tôi muốn nghiên cứu các cách khác để thực hiện việc này.

Về cơ bản những gì tôi cần thực hiện là cho phép kết nối SSL sẽ xác minh dựa vào chứng chỉ CA tùy chỉnh sẽ được nhúng trong ứng dụng của tôi. Điều này sẽ làm cho chứng chỉ CA chỉ hoạt động cho các cuộc gọi tôi thực hiện. Tôi đang sử dụng các phương pháp NSURLConnection tiêu chuẩn để giao tiếp với dịch vụ.

Điều này có khả thi không? Ai đó có thể chỉ cho tôi cách tải CA (biểu mẫu PEM?) Và thêm nó vào danh sách chứng chỉ CA đáng tin cậy cho ứng dụng của tôi không? Nếu điều đó là không thể, tôi có những lựa chọn nào khác? Chỉ cần tin tưởng tất cả các chứng chỉ không thực sự là bất kỳ tùy chọn nào, chúng tôi muốn ngăn chặn người đàn ông trong các cuộc tấn công ở giữa và chỉ tin tưởng các chứng chỉ được cấp CA của chúng tôi.

Cảm ơn!

+1

-1 mà không nhận xét. tốt đẹp! –

Trả lời

1

Sử dụng dưới hai phương pháp đại biểu của NSURLConnection để truy cập bất kỳ trang web với giấy chứng nhận hợp lệ

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
    { 

      NSLog(@"canAuthenticateAgainstProtectionSpace"); 
     if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      // Note: this is presently only called once per server (or URL?) until 
      //  you restart the app 
       NSLog(@"Authentication checking is doing"); 
      return YES; // Self-signed cert will be accepted 
      // Note: it doesn't seem to matter what you return for a proper SSL cert 
      //  only self-signed certs 
     } 
     return NO; 
    } 

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
    { 
      NSLog(@"didReceiveAuthenticationChallenge"); 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
     { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
       NSLog(@"chalenging protection space authentication checking"); 
     } 
    } 
+0

Hiện tại tôi đã triển khai thực hiện những điều này nhưng không được gọi là :([NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost: [[NSURL URLWithString: url] host]]; – jsetting32

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