2009-11-17 50 views
9

Ứng dụng của tôi kết nối với Schwab OFX server bằng cách sử dụng NSURLConnection. Thật không may là máy chủ sử dụng một chứng chỉ trung gian gần đây được tin cậy trên máy tính để bàn Mac nhưng chưa phải là iPhone. (Hãy thử URL — bạn sẽ gặp phải lỗi xác thực trên iPhone.)Nhập chứng chỉ SSL trong SDK iPhone

Không có cách nào dễ dàng để nói NSURLConnection để bỏ qua chứng chỉ không hợp lệ mà tôi biết. Vì vậy, tôi đang cố gắng nhập khẩu cert vào Keychain bằng tay và thiết lập mức độ tin cậy của nó nhưng tôi đã nhấn một khối.

Tôi gọi SecCertificateCreateWithData để nhập chứng chỉ thành công từ tệp .cer. Trên máy tính để bàn, tôi sẽ gọi SecTrustSettingsSetTrustSettings nhưng không tồn tại trong SDK iPhone.

Bất kỳ giải pháp nào khác?

Trả lời

12

Hỗ trợ kỹ thuật của Apple đã trả lời tôi kịp thời với câu trả lời hoàn hảo.

Trước tiên, tôi không chính xác khi nói rằng Schwab sử dụng "chứng chỉ trung gian gần đây được tin cậy trên máy tính để bàn Mac nhưng chưa phải là iPhone". Chứng chỉ trung gian không bao giờ nằm ​​trong kho lưu trữ chứng chỉ gốc có sẵn. Vấn đề là hầu hết các máy chủ SSL tất cả các chứng chỉ trung gian cần thiết để xác minh, nhưng Schwab sử dụng quy trình SSL thay thế dự kiến ​​bạn tìm nạp chứng chỉ trung gian từ một URL. Máy tính để bàn Mac hỗ trợ tìm nạp chứng chỉ trung gian, nhưng không hỗ trợ hệ điều hành iPhone hiện tại.

Dưới đây là các ý chính của đoạn code thực tế:

OSStatus   err; 
NSString *   path; 
NSData *   data; 
SecCertificateRef cert; 

path = [[NSBundle mainBundle] pathForResource:@"OFX-G3" ofType:@"cer"]; 
assert(path != nil); 

data = [NSData dataWithContentsOfFile:path]; 
assert(data != nil); 

cert = SecCertificateCreateWithData(NULL, (CFDataRef) data); 
assert(cert != NULL); 

err = SecItemAdd(
    (CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys: 
     (id) kSecClassCertificate, kSecClass, 
     cert,      kSecValueRef, 
     nil 
    ], 
    NULL 
); 
assert(err == noErr); 

CFRelease(cert); 

này giả định rằng OFX-G3.cer là Giấy chứng nhận SSL trung gian và nằm trong thư mục Resources.

+0

Lạ - Tôi có thể tự mình gửi chứng chỉ qua thư điện tử và nó phân tích cú pháp chính xác, nhưng nếu tôi cố gắng tải nó theo cách này, tôi nhận được một giá trị null cho chứng chỉ. –

+0

Tôi đã thay đổi khẳng định cuối cùng để: 'assert (err == noerr || err == errSecDuplicateItem); ' vào tài khoản cho "lỗi" nếu nó đã được cài đặt Đối với tôi, tôi đã phải chuyển đổi chứng chỉ sang định dạng DER khác mã này sẽ không hoạt động. Tôi đã làm điều đó theo cách này: 'openssl x509 -in UTN-USERFirst-Hardware.cer -out UTN-USERFirst-Hardware.der -outform DER' –

0

Bạn đang cố gắng thực hiện điều này theo lập trình hoặc có thể thực hiện điều đó thông qua giao diện người dùng thông thường không?

Tiện ích cấu hình iPhone từ Apple cho phép bạn thêm chứng chỉ vào điện thoại. Bạn cũng có thể gửi email chứng chỉ cho người dùng có thể đọc email trên điện thoại, sau đó mở chứng chỉ trên điện thoại và nó sẽ hỏi bạn có muốn cài đặt chứng chỉ hay không.

Tôi rất tiếc, tôi không thể cung cấp cho bạn thêm hướng dẫn chi tiết ngay bây giờ, nhưng tôi không ở trong iphone của mình. Tôi sẽ kiểm tra lại sau khi tôi có thể vào iphone để xem bạn có gặp thành công không.

+0

Cài đặt chứng chỉ theo cách này sẽ cho phép người dùng duyệt đến trang web đó trong Mobile Safari mà không gặp lỗi - nhưng KHÔNG hỗ trợ cho các yêu cầu được mở trong Ứng dụng (ít nhất là trong thử nghiệm của tôi với iPod Touch Gen 2, iOS 3.0). –

2

Bạn có thể bỏ qua cài đặt ssl bằng đối tượng CFStream của CoreFoundation. Bạn cần phải làm một việc gì đó như tạo luồng kết nối với cổng thích hợp trên máy chủ OFX, sau đó sử dụng CF(Read|Write)StreamSetProperty để cung cấp CFDictionary (bạn có thể đúc NSDictionary) bằng các phím như kCFStreamSSLLevel, kCFStreamSSLAllowsAnyRoot, kCFStreamSSLValidatesCertificateChain, v.v.

+0

Câu trả lời hay. Tuy nhiên, hỗ trợ kỹ thuật của Apple đã phản hồi với một câu trả lời tốt hơn - hãy xem câu trả lời của riêng tôi cho câu hỏi này. –

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