2013-08-15 5 views
1

Я хочу добавить некоторые сертификаты CA для проверки TLS в брелок моего приложения iOS 6. Сертификаты включены в пакет приложений. Я делаю не хочу добавить идентификатор (закрытый ключ/сертификат), который описан в нескольких примерах.SecPKCS12Import не возвращает никаких элементов

Звонок SecPKCS12Import не возвращает никаких ошибок, но, к сожалению, он также не возвращает сертификат.

Для того, чтобы вы воспроизвести мои шаги, которые я взял Google промежуточный сертификат («Google Internet Authority») в качестве примера, и побежал следующие команды на загруженном сертификата PEM:

COT.

#convert PEM certificate to PKCS12 
openssl pkcs12 -export -in google.pem -nokeys -out google.p12 -passout "pass:google" 
#verification 
openssl pkcs12 -in google.p12 -passin "pass:google" 
MAC verified OK 
Bag Attributes: <No Attributes> 
subject=/C=US/O=Google Inc/CN=Google Internet Authority 
issuer=/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
-----BEGIN CERTIFICATE----- 
MIICsDCCAhmgAwIBAgIDFXfhMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT 
MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 
[...] 
ARlIjNvrPq86fpVg0NOTawALkSqOUMl3MynBQO+spR7EHcRbADQ/JemfTEh2Ycfl 
vZqhEFBfurZkX0eTANq98ZvVfpg= 
-----END CERTIFICATE----- 

После этого я в комплекте файл в моем приложении, где следующий код был выполнен: выходной результат

NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease]; 
[options setObject:@"google" forKey:(id)kSecImportExportPassphrase]; 
CFArrayRef items = NULL; 
NSData *certData = [NSData dataWithContentsOfFile:[NSBundle pathForResource:@"google" ofType:@"p12" inDirectory:[[NSBundle mainBundle] bundlePath]]]; 
OSStatus result = SecPKCS12Import((CFDataRef)certData, (CFDictionaryRef)options, &items); 
assert(result == errSecSuccess); 
CFIndex count = CFArrayGetCount(items); 
NSLog(@"Certificates found: %ld",count); 

Консоль «Сертификаты найдено: 0». Значение переменной certData заполняется правильным количеством байтов, и если я изменю предоставленный пароль, результаты будут изменены на errSecAuthFailed.

Вы не знаете, в чем проблема?

+0

В моем случае сделал работу. Одно дело заметить, что кодовые фразы не равны. "google"! = "pass: google". – Ramis

ответ

3

Я бы сказал, что это ошибка, см. Соответствующий вопрос SSL Identity Certificate to run an HTTPS Server on iOS и ошибку SecPKCS12Import returns empty array when certificate expires after Jan 1st 10000.

Поскольку вам нужен только сертификат без личного ключа, я бы импортировал сертификат из файла формата DER.

$ openssl x509 -in google.pem -out google.der -outform DER 
$ openssl x509 -in google.der -noout -text 

файл сертификата Bundle МЭД и импортировать его:

NSString *path = [[NSBundle mainBundle] pathForResource:@"google" ofType:@"der"]; 
NSData *derData = [NSData dataWithContentsOfFile:path]; 
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)derData); 

// add cert to KeyChain or use it as you need 

CFRelease(cert); 
Смежные вопросы