【问题标题】:Allow unverified ssl certificate in UIWebview在 UIWebview 中允许未经验证的 ssl 证书
【发布时间】:2012-02-10 03:14:05
【问题描述】:

我在 UIWebView 中嵌入了一个网站。在开发过程中,我将它指向本地主机。问题是,只要它点击“https://”网址,它就不会加载。当我在移动 Safari 中加载 url 时,我得到了这个弹出窗口:

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

【问题讨论】:

    标签: ios ssl uiwebview


    【解决方案1】:

    如果只是为了在开发过程中进行测试,您可以在 NSURLRequest 上创建一个类别并覆盖以下私有方法:

    #if DEBUG
    
    @implementation NSURLRequest (NSURLRequestWithIgnoreSSL) 
    
    + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
    {
        return YES;
    }
    
    @end
    
    #endif
    

    只需将其放在您的一个 .m 文件(例如应用程序委托)中的任何位置,或将其放在它自己的 .m 文件中。您不需要匹配的头文件。

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

    【讨论】:

    • 我可以在其中添加一个受信任主机列表以进行检查吗?
    • 你可以在你想要的函数中加入任何逻辑。您可以将主机参数与受信任的主机数组进行比较,并且仅在匹配时才返回 YES。但如果这只是为了测试目的,我真的不明白这一点 - 请记住,您不能使用此代码发布应用程序(除非您想冒险并希望 Apple 不会注意到)。
    • 这个解决方案对我不起作用。当我将其写入我的代码时,该应用程序确实忽略了引发涉及安全证书的错误,但它也没有完成页面加载。我不确定它在做什么。我已经在我能找到的每个相关方法(didFailLoadWithError、didFinishLoading 等)中设置了 NSLogs,但它从来没有到达任何一个。这可能是我网站的问题吗?
    • 这在我的模拟器中似乎不起作用,因此您可能想在设备上尝试。
    • 这对我帮助很大!它适用于我的 iPad 3 和模拟器。您只需要创建 .h 和 .m 文件,我将它们命名为 NSURLRequest+Additions.h 和 NSURLRequest+Additions.m,然后将其导入到我的 .m 文件中,其中我有一些 NSURLRequest 调用以覆盖父级班级。此外,我还添加了这些方法,(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 和 (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
    【解决方案2】:

    Nick Lockwood 答案的 Swift 3/4 版本。

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

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

    【讨论】:

    • @LorenzoB 也许你的问题不在证书上?
    【解决方案3】:

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

    【讨论】:

    • +1,我刚刚因为使用“私有 api”(allowsAnyHTTPSCertificateForHost 方法)而被我的应用程序拒绝
    • 我在回答中两次提到,此解决方案仅用于测试目的。将您的实时应用程序指向具有不受信任证书的 HTTPS 服务器无论如何都会提供零安全性,因此您最好只使用 HTTP。
    【解决方案4】:

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

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

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

    【讨论】:

    • 如果您有自签名证书,我建议您在移动版 Safari 中打开 URL 并首先接受认证。这应该建立信任。
    【解决方案5】:

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

    -(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
    
    -(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
    

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

    【讨论】:

      【解决方案6】:

      有一种方法可以合法地做到这一点(至少根据 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 建议在这里适用:
      - 不要在生产服务器上使用未签名的证书!
      - 始终显示警告,让您的用户决定是否接受证书。

      【讨论】:

        【解决方案7】:

        我知道它有点晚了,但它可以帮助其他人,我发现一篇文章在 iOS 应用程序中绕过 ssl,你需要做的就是设置你的 webview 并从应用程序向你的服务器发出一个发布请求,如果你得到一个ssl 错误,这意味着您的服务器上没有有效的证书,为了绕过您必须使用 webview 委托方法,这些方法是 1.) 可以针对保护空间进行身份验证 2.) 应根据请求开始加载 3.) 是否收到身份验证质询 你可以从这个URL 复制这些函数,对我来说效果很好。希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2012-01-17
          • 1970-01-01
          • 2015-05-24
          • 1970-01-01
          • 2017-06-13
          • 2019-03-29
          • 2015-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多