9

我的应用程序使用.连接到Schwab OFX 服务器NSURLConnection。不幸的是,服务器使用了一个最近的中间证书,该证书在 Mac 桌面上受信任,但在 iPhone 上还不受信任。(试试这个 URL——你会在 iPhone 上得到一个证书错误。)

没有简单的方法可以告诉NSURLConnection忽略我知道的无效证书。因此,我尝试手动将证书导入钥匙串并设置其信任级别,但我遇到了障碍。

我成功调用以从文件SecCertificateCreateWithData中导入证书。.cer然后我会在桌面上调用SecTrustSettingsSetTrustSettings,但它在 iPhone SDK 中不存在。

任何解决方法?

4

4 回答 4

12

Apple 技术支持及时回复了我一个完美的答案。

首先,我说施瓦布使用“在 Mac 桌面上受信任但在 iPhone 上不受信任的最新中间证书”是不正确的。中间证书永远不会在内置根证书存储中。问题是大多数 SSL 服务器捆绑了验证所需的所有中间证书,但 Schwab 使用备用 SSL 过程,希望您从 URL 获取中间证书。Mac 桌面支持中间证书获取,但不支持当前的 iPhone 操作系统。

这是实际代码的要点:

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 文件夹中。

于 2009-11-18T23:25:56.590 回答
2

CFStream您可以使用 CoreFoundation 的对象绕过 ssl 设置。您需要执行一些操作,例如创建一个连接到 OFX 服务器上适当端口的流,然后使用CF(Read|Write)StreamSetProperty提供一个CFDictionary(您可以将其NSDictionary转换为)带有 、 、 等键kCFStreamSSLLevelkCFStreamSSLAllowsAnyRootkCFStreamSSLValidatesCertificateChain

于 2009-11-17T04:22:40.703 回答
1

您可以将证书直接安装到模拟器的 TrustStore.sqlite3 文件中。Charles Proxy 使用它来将他们的根证书安装到模拟器中。http://www.charlesproxy.com/documentation/faqs/ssl-connections-from-within-iphone-applications/

于 2012-02-24T20:17:40.543 回答
0

您是尝试以编程方式执行此操作,还是可以通过普通 UI 执行此操作?

Apple 的 iPhone 配置实用程序允许您向手机添加证书。您也可以将证书通过电子邮件发送给可以在手机上阅读电子邮件的用户,然后在手机上打开证书,它会询问您是否要安装证书。

很抱歉,我现在不能给你更多的细节说明,但我不在我的 iPhone 上。稍后我会在我可以使用 iphone 后回来查看您是否遇到了成功。

于 2009-11-17T04:14:25.057 回答