在UIWebview中允许未验证的ssl证书

时间:2012-01-13 23:32:54

标签: ios ssl uiwebview

我在UIWebView中嵌入了一个网站。在开发过程中,我指向localhost。问题是每当它命中“https://”url时它就不会加载。当我在移动safari中加载网址时,我会看到这个弹出窗口:

enter image description here

有没有办法用UIWebView覆盖它以允许未验证的URL?

7 个答案:

答案 0 :(得分:59)

如果它仅用于开发期间的测试,您可以在NSURLRequest上创建一个类别并覆盖以下私有方法:

#if DEBUG

@implementation NSURLRequest (NSURLRequestWithIgnoreSSL) 

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

@end

#endif

将它放在你的.m文件中的任何位置(例如app delegate),或者将它放在它自己的.m文件中。您不需要匹配的头文件。

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

答案 1 :(得分:9)

Swift 3/4版本为Nick Lockwood回答。

这仅用于测试/开发目的:

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

答案 2 :(得分:8)

尼克的回答将使您的应用程序不被Apple在App Store中接受,而乔治的回答将无法加载具有.css或.js或任何其他二次下载的页面的其余部分。有一个完整的答案here,允许UIWebView从具有不受信任证书的站点加载页面。

答案 3 :(得分:8)

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

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

enter image description here

有关信息,请参阅App Transport Technote here

答案 4 :(得分:3)

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

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

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

我已经详细解答了如何实现这个here

答案 5 :(得分:2)

有一种方法可以合法地执行此操作(至少通过App Store法律)。使用NSURLConnection时,有两种方法可用于允许使用自签名SSL证书:

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

如果您实现UIWebViewDelegate,请使用

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

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

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

答案 6 :(得分:0)

我知道它有点晚了但它可以帮助其他人,我发现一篇文章绕过iOS应用程序中的ssl,所有你需要做的就是设置你的webview并从应用程序到你的服务器做一个帖子请求,如果你得到一个ssl错误,这意味着你的服务器上没有有效的证书,为了绕过你必须使用webview委托的方法,这是 1.)可以对保护空间进行身份验证 2.)应该按要求开始加载 3.)接收认证挑战 你可以从这个URL复制这些功能,对我而言,它的效果非常好。希望它有所帮助