我正在构建一个需要使用客户端证书通过https访问Web服务的iPhone应用程序。如果我将客户端证书(以pkcs12格式)放入应用程序包中,我就可以将其加载到应用程序中并进行https调用(主要得益于stackoverflow.com)。
但是,我需要一种方法来分发没有任何证书的应用程序,并留给用户提供自己的证书。我以为我会这样做,指示用户在iphone的配置文件中导入证书(settings-> general-> profiles),这是你在Mail.app中打开.p12文件然后我会访问的我的应用中的该项目。我希望配置文件中的证书可以通过keychain API获得,但我想我错了。
1)有没有办法在我的应用程序中访问我已经加载到iphone配置文件中的证书?
2)我在我的应用中加载用户指定证书还有哪些其他选项?我唯一能想到的就是提供一些界面,用户可以在其中提供他的.p12证书的URL,然后我可以将其加载到应用程序的钥匙串中供以后使用,但这并不完全是用户精简的。我正在寻找一些允许用户将证书放在手机上的东西(通过电子邮件发送给自己),然后将其加载到我的应用程序中。
答案 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)
我最近发布了一篇名为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。