2012-01-13 89 views
25

我在UIWebView中嵌入了一个网站。在开发过程中,我把它指向了localhost。问题是,无论何时点击“https://”网址,它都不会加载。当我加载移动Safari浏览器的网址,我得到这个弹出:在UIWebview中允许未经验证的SSL证书

enter image description here

有没有办法用一个UIWebView来覆盖这使得未验证的网址是什么?

回答

8

Nick的答案会阻止您的应用在App Store中被Apple接受,George的答案将无法加载具有.css或.js或任何其他次级下载的页面的其余部分。有一个完整的答案here,它允许UIWebView从具有不可信证书的站点加载页面。

+4

+1,我刚收到我的应用程序被拒绝,因为使用“私有API”(allowsAnyHTTPSCertificateForHost法) – Yanchi 2013-06-19 08:23:20

+1

我在答复中提到两次,这个解决方案是用于仅测试目的。使用不受信任的证书指向HTTPS服务器的实时应用程序无论如何都不会提供安全性,因此您可能只需使用HTTP即可。 – 2013-11-28 11:05:40

56

如果在开发过程中只是测试你可以创建的NSURLRequest一个类别,并覆盖下面的私有方法:

#if DEBUG 

@implementation NSURLRequest (NSURLRequestWithIgnoreSSL) 

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

@end 

#endif 

只要把你的.m文件之一(例如应用程序委托)这在任何地方,或把它放在它自己的.m文件中。你不需要一个匹配的头文件。

#if DEBUG是一种预防措施,可防止您在提交给Apple时意外启用它,但如果您需要它在发布版本中工作,请将其删除(并确保您记得恢复它或删除此类别在提交给Apple之前)。

+0

难道我加在里面受信任主机列表对证? – 2012-01-14 01:51:17

+0

你可以在你想要的功能中放入任何逻辑。您可以将主机参数与可信主机数组进行比较,只有匹配时才返回YES。但是,如果这仅仅是为了测试的目的,我真的不明白这一点 - 记住你不能用这个代码发布一个应用程序(除非你想冒险,并希望Apple不会注意到)。 – 2012-01-24 11:05:25

+2

此解决方案对我无效。当我将它写入我的代码中时,应用程序确实忽略了抛出涉及安全证书的错误,但是它也没有完成加载页面。我不确定它在做什么。我已经在每一个我能找到的相关方法(didFailLoadWithError,didFinishLoading等)中设置NSLogs,并且它没有达到任何一个。这可能是我的网站的问题吗? – Andrew 2012-03-02 20:17:18

2

有一种合法的方法(至少通过App Store法律)。当您使用NSURLConnection的有2种方法可以用来允许自签名的SSL证书使用:

How to use NSURLConnection to connect with SSL for an untrusted cert?

如果实现UIWebViewDelegate使用

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 

不返回到该以便WebView不会自行加载。然后构建一个NSURLConnection(可通过上面的链接与未签名的证书一起使用)。

当然,通常的SSL建议适用于此:
- 不要在生产服务器上使用未签名的证书!
- 总是会出现警告,让用户决定是否接受证书。

3

使用以下两种方法,我们可以允许未经验证SSL在UIWebView的

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; 

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

我已经详细回答了如何实现这一here

7

在iOS系统中9,SSL连接将失败全部无效或自我签名的证书。这是iOS 9.0或更高版本以及OS X 10.11和更高版本中新功能App Transport Security的默认行为。

您可以通过在NSAppTransportSecurity字典中将NSAllowsArbitraryLoads设置为YES来覆盖Info.plist中的此行为。 但是,我建议仅为测试目的覆盖此设置。

enter image description here

有关信息,请参阅应用交通运输技术说明here

+0

如果您有自签名证书,我建议您在移动版Safari中打开URL并首先接受认证。这应该建立信任。 – johnnieb 2016-08-06 17:34:10

0

我知道它的晚了一些,但它可以帮助别人,我发现了一篇文章,以绕开SSL在iOS应用中,所有你需要做的是设置你的WebView,做从申请一个POST请求到服务器,如果你得到这意味着你没有你的服务器上安装有效证书,为了SSL错误绕过你必须使用的WebView委托methonds这是 1)可以验证保护以防止空间 2)应该开始负载要求 3)没有接收认证挑战 您可以从这URL复制这些功能,对我来说它工作得很好。希望它可以帮助

10

斯威夫特3/4版的尼克·洛克伍德的答案。

这只是用于测试/开发目的:

extension NSURLRequest { 
    #if DEBUG 
    static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool { 
     return true 
    } 
    #endif 
}