我的应用程序连接到施瓦布OFX服务器使用NSURLConnection
.不幸的是,服务器使用了最新的中间证书,该证书在Mac桌面上是可信任的,但还不是iPhone.(尝试使用URL - 您将在iPhone上获得证书错误.)
没有简单的方法可以NSURLConnection
忽略我所知道的无效证书.因此,我试图手动将证书导入Keychain并设置其信任级别,但我遇到了阻塞.
我SecCertificateCreateWithData
成功调用从.cer
文件导入证书.然后在桌面上我会调用SecTrustSettingsSetTrustSettings
,但iPhone SDK中不存在.
任何解决方法?
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文件夹中.