iOS HTTPS请求101

前端之家收集整理的这篇文章主要介绍了iOS HTTPS请求101前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
NSURLConnection/CFURLConnection HTTP load Failed (kcfStreamErrorDomainSSL,-9813)

非常非常沮丧!我一直在拉我的头发几个小时.我在Linode服务器上使用自签名证书.港口是8000,不能在443工作.我不相信这是原因.这是我的代码,它是99%的样板:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.myserver.com:8000/test.json"]];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

底部

#pragma mark NSURLConnectionDelegate

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    NSLog(@"protectionSpace: %@",[protectionSpace authenticationMethod]);

    // We only know how to handle NTLM authentication.
    if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodNTLM])
        return YES;

    // Explicitly reject ServerTrust. This is occasionally sent by IIS.
    if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust])
        return NO;

    return NO;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"%@",response);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"%@",data);
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"didFailWithError");
    NSLog([NSString stringWithFormat:@"Connection Failed: %@",[error description]]);
}

OMG帮助!

UPDATE

它与此委托方法配合使用.我收到回复,但有一个问题.

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [[challenge sender] useCredential:[NSURLCredential
                                       credentialWithUser:@"user"
                                       password:@"password"
                                       persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge];

}

我提供的“用户”和“密码”是完全随机的,不被服务器检查.在我的服务器上接受连接之前,如何验证凭据?

编辑:我正在运行一个Node.js服务器

解决方法

获取相应的错误描述可能有助于:

因此,首先错误kcfStreamErrorDomainSSL意味着错误代码是Security / SecureTransport.h中定义的SSL错误代码

kcfStreamErrorDomainSSL,-9813表示:

erRSSLNoRootCert = -9813,/ *证书链未通过root验证* /

这只是意味着您没有受信任的根证书,并且由于该身份验证失败而导致连接失败.

在设备上提供用于服务器信任身份验证的根证书,你没事.

实现具有自签名证书的服务器信任认证有几种方法,一种比另一种更安全.

最简单的方法需要存储在应用程序包中的自签名证书,然后检索并简单地进行字节比较.这是一个例子:

Implementing server trust authentication with a self-signed certificate.

这些都必须阅读:Technical Note TN2232
HTTPS Server Trust Evaluation
Technical Q&A QA1360 Describing the kSecTrustResultUnspecified error.

更优选的方法是使用您可以自己使用的CA(证书颁发机构).也就是说,您创建自己的CA和您使用此CA签署的证书.

步骤类似:

>在您的应用程序中绑定CA的根证书的DER文件.
>处理服务器信任身份验证如下:

>获得认证挑战>从挑战中检索信任对象>从包中的数据创建一个证书对象>使用函数SecTrustSetAnchorCertificates将证书对象设置为信任对象的锚点.>评估信任

原文链接:https://www.f2er.com/iOS/337238.html

猜你在找的iOS相关文章