主机支持 TLS 1.2,AFNetworking 握手失败
Host supports TLS 1.2, AFNetworking handshake failing
我正在尝试 post 连接到支持 TLS 1.2 的服务器——至少当我在浏览器中执行 GET 时,我可以验证通信是否使用 TLS 1.2 以及证书是否由证书颁发机构。但是,当我尝试使用 AFNetworking iOS 9.0 (13A4305g) / Xcode 7-beta4 在我的代码中 POST 到该服务器时,我遇到了握手失败。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializerWithContentType:@"application/x-www-form-urlencoded"];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:requestString parameters:@{ @"apiKey" : MY_API_KEY,
@"payload" : [MyParams paramsForPOSTAsJSON] }
success:^(AFHTTPRequestOperation *operation, NSDictionary *responseDict) {
...
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
myLog(@"Communication failed: %@", error);
}];
失败:
2015-08-06 15:01:08.398 MyApp[1795:394055] CFNetwork SSLHandshake failed (-9824)
2015-08-06 15:01:08.409 MyApp[1795:394055] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
2015-08-06 15:01:08.412 MyApp[1795:393999] MyClass sendDataToServer Communication failed: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." ...
我错过了什么吗?我怎样才能深入挖掘?假设这是服务器问题而不是代码问题——我怎么能窥探到呢?
Steffen 让我找到了答案,确实我需要合适的密码。查看端口上支持的密码的一种简单方法是 cipherscan tool. The ciphers supported for App Transport Security can be found here。一旦我能够在一个完全配置的网站上进行测试,我就不需要任何类型的白名单了。对于没有密码的 TLS 站点,我可以将 NSThirdPartyExceptionRequiresForwardSecrecy
设置为 false。
更新
如果您使用 OS X El Capitan 的 Beta 3 或更高版本,您可以使用以下命令:
nscurl --verbose --ats-diagnostics <host>
这将告诉您需要将哪些条目添加到白名单中才能使连接成功。这对于揭开类型 CFNetwork SSLHandshake failed (-9801)
.
的 SSL 故障的神秘面纱很有帮助。
我正在尝试 post 连接到支持 TLS 1.2 的服务器——至少当我在浏览器中执行 GET 时,我可以验证通信是否使用 TLS 1.2 以及证书是否由证书颁发机构。但是,当我尝试使用 AFNetworking iOS 9.0 (13A4305g) / Xcode 7-beta4 在我的代码中 POST 到该服务器时,我遇到了握手失败。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializerWithContentType:@"application/x-www-form-urlencoded"];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:requestString parameters:@{ @"apiKey" : MY_API_KEY,
@"payload" : [MyParams paramsForPOSTAsJSON] }
success:^(AFHTTPRequestOperation *operation, NSDictionary *responseDict) {
...
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
myLog(@"Communication failed: %@", error);
}];
失败:
2015-08-06 15:01:08.398 MyApp[1795:394055] CFNetwork SSLHandshake failed (-9824)
2015-08-06 15:01:08.409 MyApp[1795:394055] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
2015-08-06 15:01:08.412 MyApp[1795:393999] MyClass sendDataToServer Communication failed: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." ...
我错过了什么吗?我怎样才能深入挖掘?假设这是服务器问题而不是代码问题——我怎么能窥探到呢?
Steffen 让我找到了答案,确实我需要合适的密码。查看端口上支持的密码的一种简单方法是 cipherscan tool. The ciphers supported for App Transport Security can be found here。一旦我能够在一个完全配置的网站上进行测试,我就不需要任何类型的白名单了。对于没有密码的 TLS 站点,我可以将 NSThirdPartyExceptionRequiresForwardSecrecy
设置为 false。
更新
如果您使用 OS X El Capitan 的 Beta 3 或更高版本,您可以使用以下命令:
nscurl --verbose --ats-diagnostics <host>
这将告诉您需要将哪些条目添加到白名单中才能使连接成功。这对于揭开类型 CFNetwork SSLHandshake failed (-9801)
.