ios - SecPKCS12Import when p12 requires an empty passphrase

标签 ios objective-c swift macos security

我在 p12 中有一个私钥,它设置了空密码。 现在,当我尝试在 OS X 或 iOS 上使用 SecPKCS12Import 导入此私钥时,出现错误(在 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“PKCS12 导入期间 MAC 验证失败(密码错误?)”

现在我知道它不起作用了。我了解到没有密码的 p12 是一种安全威胁,但如果这是它不起作用的原因,我需要一些说明这一点的文档。 到目前为止,我已经尝试用谷歌搜索它,但没有成功。

我还尝试将此文件导入 OS X Keychain 应用程序,结果相同(密码无效),所以这一定是 SecPKCS12Import 的问题。

或者也许有办法克服这个问题?

最佳答案

我认为这是 Cocoa SDK 的缺陷,请参阅 rdar://22909471 .

不幸的是,该雷达作为现有雷达的复制品已被关闭。我会向 Apple 提交一份额外的错误报告来提升这个问题。我可以想到两种选择:

  1. 为您的 p12 blob 添加密码。

  2. 将证书转换为 DER 编码。 This answer可能有帮助。

关于ios - SecPKCS12Import when p12 requires an empty passphrase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392338/

相关文章:

ios - 更新到XE2 Update 2后,Delphi/FPC代码不再在XCode下编译

ios - 将 XIB 粘贴到导航栏 ios

ios - 在 Objective-C 中从网站获取 HTML 数据 - 解析 HTML

ios - xCode Cocoapods 无法构建项目 ios(9.3)

ios - 在没有临时配置文件的情况下部署应用程序

ios - PFQueryTableViewController 忽略分页设置

ios - UITableView 标题中的按钮仅在 1/3 的时间内起作用

objective-c - 应用程序 :didFinishLaunchingWithOptions equivalent for cases where the app is already running?

swift - 在 UITtableView 中显示 navigationItem

ios - 将选择器传递给扩展