NSURLRequest的私有方法“setAllowsAnyHTTPSCertificate:forHost:”有替代方法吗?

17

我的iPhone应用程序仅因为使用了(看起来非常安全的)私有方法+setAllowsAnyHTTPSCertificate:forHost:而被拒绝,该方法是针对NSURLRequest的。是否有非私有API可以模仿此功能?


2
你为什么要首先允许无效的HTTPS证书? - Javier Soto
你好,你的问题已经解决了,但是你的源代码中是否排除了上述方法? - Sunil Targe
5个回答

7

谢谢!很奇怪谷歌没有显示这个结果。 - Michael

6

实际上,我正在使用10.6.8进行测试,这段代码仍然有效——它使用了私有API,但检查了选择器是否存在(myurl是我尝试加载到WebView或NSURLConnection中的NSURL):

SEL selx = NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:");
if ( [NSURLRequest respondsToSelector: selx] )
{
    IMP fp;

    fp = [NSURLRequest methodForSelector:selx];

    (fp)([NSURLRequest class], selx, YES, [myurl host]);
}

请注意,没有使用“@selector”,因此所有工作都将在运行时完成。这使它几乎完全安全,并且对于苹果的检查来说是最隐蔽的,尤其是如果你模糊了字符串。

1
不推荐使用以下解决方案:(1)您没有给用户选择接受或拒绝的选项。(2)如果苹果公司偶然发现,他们可能会变得聪明起来,因为您是在公共论坛上写作。(3)请参考Yonel的答案:https://dev59.com/X3I-5IYBdhLWcg3wI0t9#2145367。 - George
只是想说,这对我有效,直到5S和iPad Air出现 - 在这两个设备上(在投射时)会崩溃。 - Luke

1

一个非常愚蠢的解决方法是创建自己的类别方法:

@implementation NSURLRequest (IgnoreSSL)

+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
    return YES;
}

@end

这应该可以通过苹果的私有API检查,但它仍然是同样的事情(使用私有、未记录的API[1],可能随时会出现问题)。实际上,它更糟糕,因为它允许一切,而不仅仅是那个主机。

[1]: 一个本应该公开的私有API,但仍然是私有API。


1
据我所知,这仍然无法通过苹果的检查,因为他们似乎仅基于选择器而不是它们的使用进行了相当简单的分析。 - Mike Abdullah
@Mike: 你确定吗?我根本没有“使用”选择器,只是重新定义它。是苹果的内部调用它。虽然这样做并不安全,但我不明白为什么它不能通过苹果的检查。 - Michael
1
这种方式肯定会导致您的应用被拒绝。 - Franklin

0

这不是一个解决方案,而是一个建议。你有没有考虑使用ASIHttpRequest Framework来实现这个功能?这个框架在各个方面都非常完整。查看文档,也许它能帮到你。


0

setAllowsAnyHTTPSCertificate 在 OS X 10.6.6 上似乎已经完全不再被支持。

我是说 10.6.6 吗?也许我应该说“雪景”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接