我有一个直接连接到硬件路由器的应用程序。自iOS 9
我更新AFNetworking
后,当我尝试通过ssl
进行连接时,我发现错误https
。
这不是iOS 9
App Transport Security
问题,因为我添加了相关的.plist
条目以绕过它,并且连接在http
上正常工作。
我需要绕过证书检查,因为每个路由器都有自己的自签名证书,因此我显然无法将证书添加到我的应用中,因为每个用户都不同。
我使用AFHTTPRequestOperation
子类进行连接并设置了self.securityPolicy.allowInvalidCertificates = YES;
但是我收到以下错误:
连接期间出错:错误域= NSURLErrorDomain代码= -1200" An 发生SSL错误,并且无法与服务器建立安全连接 由&#34。的UserInfo = {_ kCFStreamErrorCodeKey = -9806, NSLocalizedRecoverySuggestion =您想要连接到服务器吗? 无论如何?,NSUnderlyingError = 0x7fa9f3611b40 {错误 Domain = kCFErrorDomainCFNetwork Code = -1200"发生了SSL错误 并且无法与服务器建立安全连接。" 的UserInfo = {NSErrorFailingURLStringKey = https://myserver.com:4780/Info.htm, NSLocalizedRecoverySuggestion =您想要连接到服务器吗? 无论如何?,_ kCFNetworkCFStreamSSLErrorOriginalValue = -9806, _kCFStreamPropertySSLClientCertificateState = 0,NSLocalizedDescription =发生了SSL错误并且安全 无法建立与服务器的连接。,_ kCFStreamErrorDomainKey = 3, NSErrorFailingURLKey = https://myserver.com:4780/Info.htm, _kCFStreamErrorCodeKey = -9806}},NSLocalizedDescription =发生SSL错误,无法与服务器建立安全连接。 NSErrorFailingURLKey = https://myserver.com:4780/Info.htm, NSErrorFailingURLStringKey = https://myserver.com:4780/Info.htm, _kCFStreamErrorDomainKey = 3}
我还尝试添加setWillSendRequestForAuthenticationChallengeBlock:
但是块永远不会被调用。
有人可以帮忙吗?
由于
编辑-----
设置self.securityPolicy.validatesDomainName = NO;
也不起作用。我想知道硬件上的证书类型是否存在问题。
编辑2 ----- 这是证书
新增,TLSv1 / SSLv3,密码是DES-CBC3-SHA服务器公钥是2048 bit不支持安全重新协商压缩:无 扩展:无SSL会话:协议:SSLv3密码:DES-CBC3-SHA 会话ID: 010000000C6B8632215649C0665E9DCC9EC59E22F8F021672B6B50B84222A342 Session-ID-ctx:主密钥: D71EC7D8F7A4A3581E25CDAD9C532B2C7B4DA8B513AF337095496B575F525CFBA02A40797B2D2A4F0B5911EFEFC3623F Key-Arg:无开始时间:1443102149超时:300(秒)验证 返回码:18(自签名证书)
编辑3 --------
将此代码添加到我的AFHTTPRequestOperation
子类使其可以在iOS 8上运行,但是在iOS 9上甚至无法调用该块。
[self setWillSendRequestForAuthenticationChallengeBlock:^(NSURLConnection * _Nonnull connection, NSURLAuthenticationChallenge * _Nonnull challenge)
{
NSLog(@"**** HERE ****");
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}];
答案 0 :(得分:2)
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;
答案 1 :(得分:1)
我遇到了类似的问题,在我的情况下,我解决了将安全策略设置为 AFSSLPinningModeNone 并明显允许无效证书的问题。
Obj-C中的一个例子:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;
[manager POST:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"Response: %@",responseObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
}];
答案 2 :(得分:1)
默认行为
使用NSURLConnection,CFURL或NSURLSession API的所有连接 在为iOS 9.0构建的应用程序中使用App Transport Security默认行为 或更高版本,以及OS X v10.11或更高版本。不遵循的连接 要求将失败。有关各种连接的更多信息 方法,请参阅NSURLConnection类参考,CFURL参考或 NSURLSession类参考。
这些是App Transport Security要求:
服务器必须至少支持传输层安全性(TLS) 协议版本1.2。连接密码仅限于那些 提供前向保密(见下面的密码列表。)证书 必须使用SHA256或更大的签名哈希算法进行签名, 使用2048位或更高的RSA密钥或256位或更高的密钥 椭圆曲线(ECC)键。无效的证书导致困难 失败,没有联系。这些是公认的密码:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
您可能希望升级硬件中的安全设置以与上述兼容和/或将NSExceptionMinimumTLSVersion
设置为 TLSv1.0
答案 3 :(得分:0)
在AFHTTPRequestOperation的子类中,实现以下内容:
- (BOOL)connection:(NSURLConnection *)connection
canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
return YES;
}
return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace];
}
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
return;
}
return [super connection:connection didReceiveAuthenticationChallenge:challenge];
}
答案 4 :(得分:0)
允许使用AFNetworking的无效SSL证书。在#import Availability.h
下面的AFURLConnectionOperation.h中添加以下行