AFNetworking需要绕过ssl检查

时间:2015-09-21 10:25:35

标签: ios ssl https afnetworking afnetworking-2

我有一个直接连接到硬件路由器的应用程序。自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];
    }];

5 个答案:

答案 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)

来自Apple's documentation

  

默认行为

     

使用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中添加以下行

定义_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1