获取 CFNetwork SSLHandshake 失败 (-9806) 错误

Posted

技术标签:

【中文标题】获取 CFNetwork SSLHandshake 失败 (-9806) 错误【英文标题】:Getting CFNetwork SSLHandshake failed (-9806) error 【发布时间】:2013-11-27 14:16:29 【问题描述】:

我正在尝试使用

调用我的网址
NSDictionary *landingDetails=[appDelegate landingPage];

        NSString *devinf=[UIDevice currentDevice].systemVersion;
        NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

        NSMutableDictionary *reqDict=[NSMutableDictionary dictionary];
        [reqDict setObject:@"refillByScan" forKey:@"appId"];
        [reqDict setObject:@"extest1" forKey:@"affId"];
        [reqDict setObject:[landingDetails objectForKey:@"token"] forKey:@"token"];
        [reqDict setObject:@"0124400-59382" forKey:@"rxNo"];//medication or prescription id
        [reqDict setObject:@"appName://handleControlFromScanRefill" forKey:@"appCallBackScheme"];
        [reqDict setObject:@"callBackAction" forKey:@"appCallBackAction"];
        [reqDict setObject:@"chkExpRx" forKey:@"act"];
        [reqDict setObject:@"" forKey:@"trackingId"];
        [reqDict setObject:devinf forKey:@"devinf"];
        [reqDict setObject:appVersion forKey:@"appver"];

        NSString *landingUrl=[landingDetails objectForKey:@"landingUrl"];//my url
        request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:landingUrl]];
        NSString *jsonRequest = [reqDict JSONRepresentation];
        NSLog(@"jsonRequest is %@", jsonRequest);
        NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];

        [request setHTTPMethod:@"POST"];
        [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody: requestData];

        con=[[NSURLConnection alloc]initWithRequest:request delegate:self];
        [con start];

我的日志中出现此错误

2013-11-27 19:43:30.754 WallGreen[5594:3a03] CFNetwork SSLHandshake failed (-9806)
2013-11-27 19:43:31.273 WallGreen[5594:3a03] CFNetwork SSLHandshake failed (-9806)
2013-11-27 19:43:31.799 WallGreen[5594:3a03] CFNetwork SSLHandshake failed (-9806)
2013-11-27 19:43:31.800 WallGreen[5594:3a03] NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806)

【问题讨论】:

URL 的 SSL/TLS 证书是自签名的还是由系统钥匙串中列出的证书颁发机构签名的? OpenSSL 包含一个出色的 s_client 工具,用于调试此类问题:openssl.org/docs/apps/s_client.html 我认为它的 ssl/tls 认证 ***.com/questions/19922717/… 我也遇到了这个问题,在一个过去工作的应用程序中。我正在使用NSURLConnection 在端口 443 上使用 HTTPS 向 URL 发出 HTTP POST。我正在尝试连接到新配置的服务器,所以我认为配置与此有关。我的应用从来没有机会在connection:willSendRequestForAuthenticationChallenge: 中提供身份验证挑战信息。关于-9806的信息似乎很少。网络和互联网访问一切正常。 我只在调试时遇到类似的问题,否则它工作正常。 【参考方案1】:

FWIW:我得到了相同的错误号,这是由于证书过期,所以这是问题的另一个潜在来源。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 我不确定我是否完全理解这条评论。您是说“这可能是由于证书过期”不是答案,因为它不是 100% 确定的吗?或者它需要有关如何生成新证书的详细信息,如果过期的证书确实是问题(详细信息将根据颁发的 CA 有所不同)?您可以在我的回答中提供有关特定缺陷的任何详细信息,我们将不胜感激。 我遇到此错误,证书无效(证书中的主机名不匹配)。【参考方案2】:

ios 8 在使用带有哈希函数 SHA512 的证书时存在一个错误,最好使用 SHA256。我坚持这个错误好几个星期了。

【讨论】:

【参考方案3】:

通常当我收到 CFNetwork SSLHandshake failed -(*) 这是因为我的本地 wifi 网络(设备连接到网络但没有连接到互联网)

在另一个网络上再试一次(3G 对我来说是最快的解决方案)

【讨论】:

以上是关于获取 CFNetwork SSLHandshake 失败 (-9806) 错误的主要内容,如果未能解决你的问题,请参考以下文章

CFNetwork SSLHandshake 失败 iOS 9

CFNetwork SSLHandshake 失败 iOS 9

iOS 中的 Firebase:CFNetwork SSLHandshake 失败,尽管配置似乎正确。

CFNetwork SSLHandshake 仅在 3G/4G 上失败(-9806)(不在 Wifi 上)

CFNetwork SSLHandshake 因 AFNetworking 2.0、自签名 cer 和 [policy setAllowInvalidCertificates:YES] 而失败

iOS 8 在我的应用程序中断开了 SSL 连接 - CFNetwork SSLHandshake failed (-9806)