2010-10-22 29 views
5

Tôi đang cố gắng sử dụng khung bảo mật iOS để giao tiếp an toàn với máy chủ của mình. Tôi có một tập tin chứng chỉ mà từ đó tôi có thể nhận được một tài liệu tham khảo khóa công khai. Đây là những gì tôi đang làm.SecTrustCreateWithCertificates treo trên iPad

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"supportwarriors.com" ofType:@"cer"]; 
SecCertificateRef myCertificate = nil; 

NSData *certificateData = [[NSData alloc] initWithContentsOfFile:certPath]; 
myCertificate  = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef)certificateData); 

//got certificate ref..Now get public key secKeyRef reference from certificate.. 
SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); 
SecTrustRef myTrust; 
OSStatus status  = SecTrustCreateWithCertificates(myCertificate,myPolicy,&myTrust); 

    SecTrustResultType trustResult; 
    if (status == noErr) { 
     status = SecTrustEvaluate(myTrust, &trustResult); 
    } 
publicKey  = SecTrustCopyPublicKey(myTrust); 

Đoạn mã hoạt động hoàn hảo trên iPhone và tôi đã thử nghiệm điều đó. Tôi có thể giao tiếp an toàn với máy chủ của mình. Nhưng khi tôi cố gắng chạy ứng dụng của tôi trên iPad (ở chế độ 2x) mã trên bị lỗi. Sau khi gỡ lỗi, tôi phát hiện ra rằng secTrustCreateWithCertificate đang gặp sự cố và bản ghi sự cố được đưa ra bên dưới .. Chứng chỉ tôi đã sử dụng giống nhau cho cả iPad và iPhone ... Hàm trên secCertificateCreateWithData trả về một chứng chỉ tham chiếu và không phải là ... Vì vậy, đó là không phải là nguyên nhân gây ra tai nạn .. Tôi đang làm gì sai.

*** -[NSCFType count]: unrecognized selector sent to instance 0x14af24 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***  -[NSCFType count]: unrecognized selector sent to instance 0x14af24' 
+0

Bạn có thể đăng chứng chỉ không? – rook

Trả lời

4

Tài liệu cho số SecTrustCreateWithCertificates tuyên bố rằng bạn có thể vượt qua một chứng chỉ hoặc một mảng. Ngoại lệ bạn nhận được trạng thái là -[NSCFType count]: unrecognized selector sent to instance. Điều gì đang xảy ra trong iOS 3.2 là SecTrustCreateWithCertificates đang xử lý giá trị đầu vào như CFArray mà không kiểm tra trước để xem đó có phải là số ít SecCertificateRef hay không.

Để làm được việc này, bạn có thể làm điều gì đó tương tự như đoạn mã sau:

SecCertificateRef certs[1] = { certificate }; 
    CFArrayRef array = CFArrayCreate(NULL, (const void **) certs, 1, NULL); 
    if(SecTrustCreateWithCertificates(array, x509Policy, &trustChain) == errSecSuccess) 

chỉ cần nhớ để CFRelease(array) ở phạm vi thích hợp.