我在UIWebView中嵌入了一个网站。在开发过程中,我把它指向了localhost。问题是,无论何时点击“https://”网址,它都不会加载。当我加载移动Safari浏览器的网址,我得到这个弹出:在UIWebview中允许未经验证的SSL证书
有没有办法用一个UIWebView来覆盖这使得未验证的网址是什么?
我在UIWebView中嵌入了一个网站。在开发过程中,我把它指向了localhost。问题是,无论何时点击“https://”网址,它都不会加载。当我加载移动Safari浏览器的网址,我得到这个弹出:在UIWebview中允许未经验证的SSL证书
有没有办法用一个UIWebView来覆盖这使得未验证的网址是什么?
Nick的答案会阻止您的应用在App Store中被Apple接受,George的答案将无法加载具有.css或.js或任何其他次级下载的页面的其余部分。有一个完整的答案here,它允许UIWebView从具有不可信证书的站点加载页面。
如果在开发过程中只是测试你可以创建的NSURLRequest一个类别,并覆盖下面的私有方法:
#if DEBUG
@implementation NSURLRequest (NSURLRequestWithIgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
#endif
只要把你的.m文件之一(例如应用程序委托)这在任何地方,或把它放在它自己的.m文件中。你不需要一个匹配的头文件。
#if DEBUG
是一种预防措施,可防止您在提交给Apple时意外启用它,但如果您需要它在发布版本中工作,请将其删除(并确保您记得恢复它或删除此类别在提交给Apple之前)。
难道我加在里面受信任主机列表对证? – 2012-01-14 01:51:17
你可以在你想要的功能中放入任何逻辑。您可以将主机参数与可信主机数组进行比较,只有匹配时才返回YES。但是,如果这仅仅是为了测试的目的,我真的不明白这一点 - 记住你不能用这个代码发布一个应用程序(除非你想冒险,并希望Apple不会注意到)。 – 2012-01-24 11:05:25
此解决方案对我无效。当我将它写入我的代码中时,应用程序确实忽略了抛出涉及安全证书的错误,但是它也没有完成加载页面。我不确定它在做什么。我已经在每一个我能找到的相关方法(didFailLoadWithError,didFinishLoading等)中设置NSLogs,并且它没有达到任何一个。这可能是我的网站的问题吗? – Andrew 2012-03-02 20:17:18
有一种合法的方法(至少通过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建议适用于此:
- 不要在生产服务器上使用未签名的证书!
- 总是会出现警告,让用户决定是否接受证书。
使用以下两种方法,我们可以允许未经验证SSL在UIWebView的
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
我已经详细回答了如何实现这一here
在iOS系统中9,SSL连接将失败全部无效或自我签名的证书。这是iOS 9.0或更高版本以及OS X 10.11和更高版本中新功能App Transport Security的默认行为。
您可以通过在NSAppTransportSecurity
字典中将NSAllowsArbitraryLoads
设置为YES
来覆盖Info.plist
中的此行为。 但是,我建议仅为测试目的覆盖此设置。
有关信息,请参阅应用交通运输技术说明here。
如果您有自签名证书,我建议您在移动版Safari中打开URL并首先接受认证。这应该建立信任。 – johnnieb 2016-08-06 17:34:10
我知道它的晚了一些,但它可以帮助别人,我发现了一篇文章,以绕开SSL在iOS应用中,所有你需要做的是设置你的WebView,做从申请一个POST请求到服务器,如果你得到这意味着你没有你的服务器上安装有效证书,为了SSL错误绕过你必须使用的WebView委托methonds这是 1)可以验证保护以防止空间 2)应该开始负载要求 3)没有接收认证挑战 您可以从这URL复制这些功能,对我来说它工作得很好。希望它可以帮助
斯威夫特3/4版的尼克·洛克伍德的答案。
这只是用于测试/开发目的:
extension NSURLRequest {
#if DEBUG
static func allowsAnyHTTPSCertificate(forHost host: String) -> Bool {
return true
}
#endif
}
+1,我刚收到我的应用程序被拒绝,因为使用“私有API”(allowsAnyHTTPSCertificateForHost法) – Yanchi 2013-06-19 08:23:20
我在答复中提到两次,这个解决方案是用于仅测试目的。使用不受信任的证书指向HTTPS服务器的实时应用程序无论如何都不会提供安全性,因此您可能只需使用HTTP即可。 – 2013-11-28 11:05:40