从iOS设备获取证书列表

时间:2013-02-08 16:24:40

标签: ios macos ssl certificate keychain

我想获取iPhone或iPad上安装的证书列表。所以我可以使用它来选择一个并在服务器上用于ssl验证。但是我无法获得此列表。 我在下面的链接中看到,在iOS中无法获取证书,因为只能访问自己的钥匙串。 iOS get Configuration Profiles that are installed

但我怀疑:)。

从以下链接 Get Certificates in Keychain 我使用代码获取证书。但是我得到了无数据。

NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
                           (__bridge id)(kSecClassCertificate), kSecClass,
                           [NSNull null], kSecMatchSearchList,
                           kCFBooleanTrue, kSecReturnRef,
                           kSecMatchLimitAll, kSecMatchLimit,
                           nil];
    CFDataRef *items = nil;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, ((CFTypeRef *)&items));

我给搜索列表[NSNull null]假设如果keychain ref为NULL,则设备采用默认的keychain。

我的问题是 1)是否可以从iPhone获取已安装证书的列表。 2)如果是这样如何?上面的代码有什么问题?

2 个答案:

答案 0 :(得分:5)

  

我的问题是1)是否可以从iPhone获取已安装证书的列表。

当然。

  2)如果是这样怎么样?上面的代码有什么问题?

代码很好,就我而言(如果不是,我能想到的唯一问题是设置NSNull - 尝试省略它)。您缺少的是使用适当的权利签署您的二进制文件,即:

<key>keychain-access-groups</key>
<array>
    <string>*</string>
</array>

你可以找到一个示例Entitlements属性列表here - 顺便说一下,查看整个项目,这很有趣。

答案 1 :(得分:2)

请参阅“GenericKeychain”的Apple示例代码 - 可从“SecItemCopyMatching”文档访问。 “在钥匙串中查找证书”文档包含查找命名证书的详细代码 - 它将根据kSecAttrLabel键/值对获得一个。