具有SSL客户端证书的iPhone应用程序

时间:2010-01-10 13:48:57

标签: iphone objective-c ssl-certificate keychain

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

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

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

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

7 个答案:

答案 0 :(得分: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是正确的,但项目为空。发生了什么事?

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如果.p12文件不是太大,您可以使用Base64对其进行编码,然后在带有自定义网址方案的电子邮件中嵌入链接,例如:

myapp://certificate/<base 64 data>

用户点击该链接,您的应用会将证书保存在某处以备将来使用。只需确保iPhone上的Mail.app不会破坏电子邮件。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

Finding a Certificate In the Keychain中建议的代码是否适合您?

答案 6 :(得分:0)

哦,伙计,这会带来2009年10月/ 11月的痛苦回忆。我能够成功获得客户端证书,但我不得不将libcurl移植到iPhone上(由于NDA还在当时的影响)。

我一年多没有完成iPhone应用程序的开发,所以我不知道改变了多少,但如果我是你,我首先尝试没有客户端证书,如果你绝对必须他们可以使用带有PEM格式证书的libcurl。