20

我正在构建一个需要使用客户端证书通过 https 访问 Web 服务的 iphone 应用程序。如果我将客户端证书(以 pkcs12 格式)放在应用程序包中,我可以将其加载到应用程序中并进行 https 调用(主要感谢 stackoverflow.com)。

但是,我需要一种方法来分发没有任何证书的应用程序,并将其留给用户提供自己的证书。我想我会通过指示用户在 iphone 的配置文件(设置->常规->配置文件)中导入证书来做到这一点,这是通过在 Mail.app 中打开一个 .p12 文件得到的,然后我会访问该项目在我的应用程序中。我希望配置文件中的证书可以通过钥匙串 API 获得,但我想我错了。

1)有没有办法访问我已经在我的应用程序中的 iphone 配置文件中加载的证书?

2) 在我的应用程序中加载用户指定的证书还有哪些其他选项?我唯一能想到的就是提供一些界面,用户可以在其中提供指向他的 .p12 证书的 URL,然后我可以将其加载到应用程序的钥匙串中供以后使用,但这并不完全是用户友好的。我正在寻找允许用户将证书放在手机上(通过电子邮件发送给自己)然后将其加载到我的应用程序中的东西。

4

7 回答 7

3

我试过这个:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"p12"]; 
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath]; 
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data; 
CFStringRef password = CFSTR("pass"); 
const void *keys[] = { kSecImportExportPassphrase }; 
const void *values[] = { password }; 
CFDictionaryRef optionsDictionary = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); 
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
SecPKCS12Import(inPKCS12Data, optionsDictionary, &items); 

inPKCS12Data 正确,但 items 为空。怎么了?

于 2010-01-27T09:27:34.977 回答
2

我通过使应用程序的文档文件夹可通过 iTunes 访问,为最近的应用程序完成了此操作。然后指示我们的用户将他们生成的密钥(在 p12 格式文件中)拖到 iTunes 中我们应用程序的文档面板中。当应用程序启动时,它会检查 p12 文件是否存在,如果存在,则将文件导入钥匙串。

这不是最简单的过程,但它是最安全的,因为您没有通过电子邮件发送的私钥文件。

于 2011-04-25T19:13:12.817 回答
1

Apple 确实将设备范围的密钥/证书的使用限制在其自己的应用程序/服务中,例如 WiFi、VPN、Mail 等。第三方应用程序无法使用这些密钥/证书中的任何一个(无需越狱)。但是,应用程序可以在应用内钥匙串中导入、存储和使用密钥和证书。此外,您可以使用iOS 中的keychain-access-group功能在多个应用程序之间共享密钥/证书。

我最近发表了一篇名为In-App Mobile Certificates Made Easy with mCMS的博文,这可能对您有所帮助。我们公司正在开发一种 API,可以轻松支持直接从基于 Microsoft 的 PKI 获得的应用内证书。我们的解决方案还提供设备上的密钥生成,而不是在另一台机器上生成 P12 并尝试将其导入您的应用程序。

于 2012-07-27T14:32:24.807 回答
1
于 2010-01-10T14:24:14.233 回答
1

如果您使用 AirWatch 进行应用分发,他们的 SDK 可以将证书从您的证书颁发机构提供给您的注册设备。这允许您配置您的证书,然后从您的应用程序代码中访问它们。

于 2015-12-04T16:23:56.023 回答
0

哦,伙计,这让我想起了 2009 年 10 月/11 月的痛苦回忆。我能够成功地让客户端证书工作,但我不得不将 libcurl 移植到 iPhone(这并不容易,因为 NDA 在时间)。

我一年多没有做过 iPhone 应用程序开发,所以我不知道有多少变化,但如果我是你,我会首先尝试在没有客户端证书的情况下过关,如果你绝对必须拥有它们,你可以将 libcurl 与 PEM 格式的证书一起使用。

于 2010-04-02T02:04:59.433 回答
0

在钥匙串中查找证书中建议的代码是否适合您?

于 2010-01-10T13:58:58.917 回答