我的应用使用NSURLConnection
连接到Schwab OFX server。不幸的是,服务器使用了最新的中间证书,该证书在Mac桌面上是可信任的,但还不是iPhone。 (尝试使用URL - 您将在iPhone上获得证书错误。)
没有简单的方法可以告诉NSURLConnection
忽略我所知道的无效证书。因此,我试图手动将证书导入Keychain并设置其信任级别,但我遇到了阻塞。
我成功呼叫SecCertificateCreateWithData
以从.cer
文件导入证书。在桌面上,我会调用SecTrustSettingsSetTrustSettings
,但它在iPhone SDK中不存在。
任何解决方法?
答案 0 :(得分:12)
Apple技术支持迅速回复了我,并给出了完美答案。
首先,我说Schwab使用的“最新的中间证书在Mac桌面上是可靠的,但还不是iPhone”,这是不正确的。中间证书永远不会出现在内置根证书库中。问题是大多数SSL服务器捆绑验证所需的所有中间证书,但Schwab使用备用SSL流程,该流程要求您从URL获取中间证书。 Mac桌面支持中间证书提取,但不支持当前的iPhone OS。
以下是实际代码的要点:
OSStatus err;
NSString * path;
NSData * data;
SecCertificateRef cert;
path = [[NSBundle mainBundle] pathForResource:@"OFX-G3" ofType:@"cer"];
assert(path != nil);
data = [NSData dataWithContentsOfFile:path];
assert(data != nil);
cert = SecCertificateCreateWithData(NULL, (CFDataRef) data);
assert(cert != NULL);
err = SecItemAdd(
(CFDictionaryRef) [NSDictionary dictionaryWithObjectsAndKeys:
(id) kSecClassCertificate, kSecClass,
cert, kSecValueRef,
nil
],
NULL
);
assert(err == noErr);
CFRelease(cert);
这假设OFX-G3.cer是中间SSL证书,位于Resources文件夹中。
答案 1 :(得分:2)
您可以使用CoreFoundation的CFStream
对象绕过ssl设置。您需要执行类似创建连接到OFX服务器上相应端口的流的操作,然后使用CF(Read|Write)StreamSetProperty
提供CFDictionary
(您可以将NSDictionary
转换为)使用kCFStreamSSLLevel
,kCFStreamSSLAllowsAnyRoot
,kCFStreamSSLValidatesCertificateChain
等密钥
答案 2 :(得分:1)
您可以直接将证书安装到模拟器的TrustStore.sqlite3文件中。 Charles Proxy使用它将根证书安装到模拟器中。 http://www.charlesproxy.com/documentation/faqs/ssl-connections-from-within-iphone-applications/
答案 3 :(得分:0)
您是尝试以编程方式执行此操作还是可以通过普通用户界面执行此操作?
Apple的iPhone配置实用程序允许您向手机添加证书。您也可以将证书通过电子邮件发送给可以在手机上阅读电子邮件的用户,然后在手机上打开证书,它会询问您是否要安装证书。
对不起,我现在不能给你更详细的说明,但是我离开了我的iphone。我可以在看到你是否能够获得成功之后再回来查看。