SecPKCS12Import, когда p12 требует пустую кодовую фразу

У меня есть закрытый ключ в p12, который имеет пустую кодовую фразу. Теперь, когда я пытаюсь импортировать этот закрытый ключ, используя SecPKCS12Import в OS X или iOS, у меня есть ошибка (эквивалент работы Windows).

- (NSError *)setClientIdentityCertificateFromPKCS12Data: (NSData *)PKCS12Data withPassword: (NSString *)password
{
    OSStatus securityError = errSecSuccess;

    const void *keys[] =   { kSecImportExportPassphrase };
    const void *values[] = { (__bridge CFStringRef)password };
    CFDictionaryRef optionsDictionary = NULL;

    optionsDictionary = CFDictionaryCreate(
                                           NULL, keys,
                                           values, (password?1:0),
                                           NULL, NULL);
    CFArrayRef items = NULL;

    securityError = SecPKCS12Import((__bridge CFDataRef)PKCS12Data,
                                    optionsDictionary,
                                    &items);

Я пробовал разные комбинации, когда пароль пуст:

  • optionsDictionary = NULL
  • optionsDictionary без значений
  • optionsDictionary с @"" значением для клавиши kSecImportExportPassphrase

Он всегда заканчивается securityError, не равным errSecSuccess. Соответственно:

  • securityError=-25260 "Парольная фраза требуется для импорта/экспорта".
  • securityError=-25260 "Парольная фраза требуется для импорта/экспорта".
  • securityError=-25264 "Ошибка MAC-аутентификации при импорте PKCS12 (неверный пароль?)"

Теперь я уверен, что это не сработает. Я не понимаю, что p12 без пароля является угрозой безопасности, но если это причина, почему она не работает, мне нужна документация, в которой говорится об этом. Я пытался Google, что пока не повезло.

Я также попытался импортировать этот файл в приложение OS X Keychain с таким же результатом (неверный пароль), поэтому это должно быть проблемой с SecPKCS12Import.

Или, может быть, есть способ преодолеть эту проблему?

Ответ 1

Я считаю, что это дефект с SDK Cocoa, см. rdar://22909471.

К сожалению, этот радар был закрыт как обман существующего радара. Я бы опубликовал дополнительный отчет об ошибке с Apple, чтобы поднять эту проблему. Я могу представить себе две альтернативы:

  • Добавьте пароль p22 blob.

  • Преобразование сертификата в кодировку DER. Этот ответ может помочь.

Ответ 2

Кажется, что это уже исправлено, я тестировал его на iOS 10. Я могу использовать пустую строку в качестве пароля для моего p12. Однако похоже, что kSecImportExportPassphrase по-прежнему требуется.