【问题标题】:iOS 5 NSURLConnection to HTTPS ServersiOS 5 NSURLConnection 到 HTTPS 服务器
【发布时间】:2012-02-03 01:58:55
【问题描述】:

我已经搜索了几个小时关于 NSURLConnection 代表/方法的信息,这些代理/方法允许我用来连接到任何 HTTPS 服务器。即使我在这个网站上搜索,我也找到了答案,这些答案对我不起作用。

如果你们想要我,我会上传代码链接。但我更喜欢连接到任何HTTPS Servers 的简单UIWebView 的教程/示例代码/源代码。我会从那里拿走它。

提前致谢。

【问题讨论】:

    标签: iphone ios5 https nsurlconnection


    【解决方案1】:

    无论是连接到 HTTPS 还是 HTTP 站点,对于 NSURLConnection 和 UIWebView 控件都应该是完全透明的。您可能需要做的唯一一件事是,如果服务器站点证书是自签名或不可验证的证书,请添加代码以绕过浏览器获取的身份验证质询。 (即证书由未知机构签署并且您要接受它的消息的等价物)。

    只需使用 @"https://www.myhttpsite.com/" URL,它的工作方式应该与普通 HTTP url 相同。

    要绕过无法识别的证书签名者的安全问题,对于 NSURLConnection,将以下内容添加到您的委托方法中:

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
        NSArray *trustedHosts = [NSArray arrayWithObjects:@"mytrustedhost",nil];
    
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
            if ([trustedHosts containsObject:challenge.protectionSpace.host]) {
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
            }
        }
        [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
    }
    

    在 iOS4.3 之前,您需要做一些不同的事情,您可以向 URLRequest 类添加一个类别,该类别为来自无法识别的主机的证书实现安全绕过。

    请注意,任何忽略证书不是由公认机构签署的解决方案都需要小心,因为这样做会带来潜在的安全漏洞,但至少对于测试具有上面有自签名/内部签名的证书。

    在 Web 视图中打开 URL 连接:

    NSURL *websiteUrl = [NSURL URLWithString:@"https://www.mysecuresite.com/"];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:websiteurl];
    [myWebView loadRequest:urlRequest];
    

    【讨论】:

    • if the server sites certificate is a self-signed or non-verifiable certificate 我如何知道该站点是自签名的还是不可验证的?我刚刚测试了那个代码,我仍然得到一个白屏。 [webView loadRequest:requestObj];之前有没有需要输入的方法?
    • 通常,当您在标准 Web 浏览器(例如桌面上的 safari)中访问同一站点时,您会收到一条警告消息,询问您是否愿意信任由未知证书颁发机构签名的证书。
    • 添加了将 https 请求加载到作为出口连接的 web 视图的代码示例,例如在我们的视图控制器中。
    • 好的...一开始就这样做了,但是没有用。我担心的是,我在 .h 中添加了一个 <NSURLConnectionDelegate>,尽管您提供了 -(void)connection: 方法,但在 connection: 方法处放置一个断点表明它不会进入它。当然我知道为什么它不执行该方法,但是如果我声明NSURLConnectionDelegate,它不会自动执行吗?
    • 您是否检查过是否可以加载非 https 的 URL?它不是像忘记连接 UIWebView 插座这样简单的事情吗?此外,如果您在 safari 浏览器中没有收到与证书相关的任何错误,则也不会在 iphone 中调用此委托方法 - 只有在问题由未知证书颁发机构签名时才会调用它。
    【解决方案2】:

    好的,我找到了答案。也感谢 gamozzii 帮助我。我根据您的代码进行了搜索:)

    Load HTTPS url in a UIWebView

    这对我有用。我还尝试了https://www.google.com

    之类的链接

    【讨论】:

    • 嗨,梅尔文 - 很抱歉我之前的简短评论 - 很高兴你坚持并找到了解决方案 - 干得好。
    • 嘿,没问题。但是你告诉我的帮助我找到了可行的方法:) 但是我意识到代码有一些东西,returns YES 意味着它总是会返回一个真实的输出。现在我必须找到一种通过某种身份验证返回YES 的方法。 :(
    • 嗨 Melvin Lai,你有没有办法通过身份验证返回 YES?因为如果我输入了错误的用户名或密码,它是空白的。谢谢..
    • @AlfredAngkasa 我使用的那个方法根本不需要我使用用户名或密码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多