27

我想允许无效的 SSL 证书。我的主要代码如下:

myClient = [[MyClient alloc] init];
[myClient getHtml:@"/path/to/the/distination.html"];

MyClient 类代码如下:

#import <Foundation/Foundation.h>
#import "AFNetworking.h"

@interface MyClient : NSObject

- (void)getHtml:(NSString *)path;

@end

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_

@implementation MyClient

- (void)getHtml:(NSString *)path
{
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://trusted.server.net"]];
    [httpClient getPath:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"%@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"error = %@", error);
    }];
}

@end

我阅读了下面的页面并尝试了宏,但这不起作用。

自签名证书 SSL · 问题 #189 · AFNetworking/AFNetworking https://github.com/AFNetworking/AFNetworking/issues/189

请帮我...

4

13 回答 13

45

在 AFNetworking 2.0 中,您可以使用以下内容:

[AFHTTPRequestOperationManager manager].securityPolicy.allowInvalidCertificates = YES;
于 2014-01-04T02:26:25.957 回答
41

允许使用 AFNetworking 的 SSL 证书无效。在 #import Availability.h 下方的 AFURLConnectionOperation.h 中添加以下行

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1
于 2013-02-20T13:38:44.927 回答
24

您现在可以使用 AFHTTPClient 的allowInvalidSSLCertificate 属性。无需在最新版本的 AFNetworking 中使用定义。

AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:@"url"];
client.allowsInvalidSSLCertificate = YES; //this defaults to no
于 2013-05-16T15:43:30.667 回答
12

我正在使用 RestKit

client.allowsInvalidSSLCertificate = YES;

不起作用。该选项不会传播到由 restkit 创建的操作。

我正在使用 cocoapods,因此 pch 文件或 pods 项目中的任何更改都会被覆盖。我一直在使用的“hack”是一个 cocoapod 安装后操作,它添加了所需的预处理器定义。在我的 pod 文件的末尾,我添加了:

post_install do |installer_representation|
  installer_representation.project.targets.each do |target|
    if target.name == 'Pods-AFNetworking'
      target.build_configurations.each do |config|
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
        config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << '_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1'
      end
    end
  end
end
于 2013-09-06T21:03:40.167 回答
8

注意,如果你是通过 CocoaPods 安装的,#define在你的项目中 -ing 这个宏是不够的——编译静态库时必须设置编译器宏才能生效。

于 2012-10-30T07:05:07.043 回答
5

这是使用管理器进行 POST 操作的方法。

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //initialize
 manager.securityPolicy.allowInvalidCertificates=YES;    //allow unsigned
 manager.responseSerializer=[AFJSONResponseSerializer serializer];   //set up for JSOn  
 [manager POST:@"myweb.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
     //success stuff
 }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
     //error stuff
}];

编辑 - 快速版本:

    var securityPolicy = AFSecurityPolicy()
    securityPolicy.allowInvalidCertificates = true;
    manager.securityPolicy = securityPolicy;
    manager.POST(
        "https://exmaple.com/foobar.php",
        nil,
    ...
于 2014-03-02T22:03:12.623 回答
4

您应该继承 AFHttpClient,并覆盖

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request 
                                                success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                                                failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

这是我的代码。

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure
{
    AFHTTPRequestOperation *operation = [super HTTPRequestOperationWithRequest:urlRequest success:success failure:failure];

    [operation setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace) {
        return YES;
    }];
    [operation setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) {
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
        }
    }];
    return operation;
}

您使用此 httpclient,它可以成功访问自未签名的网络。

于 2013-01-20T09:14:14.440 回答
4

我在我的代码中扩展了 AFHTTPSessionManager。在针对测试服务器进行测试时,我只需要添加如下一行:

mySessionManager.securityPolicy.allowInvalidCertificates = YES;
于 2015-06-14T14:46:38.323 回答
3

AFHTTPRequestOperation *操作 = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; operation.securityPolicy.allowInvalidCertificates = YES;

于 2014-08-26T07:49:28.540 回答
2

如果您使用 RestKit 使用

client.allowsInvalidSSLCertificate = YES;

不会工作,而是这样做:

在您的项目中,单击 RestKit.xcodeproj 转到项目 > 构建设置 > 预处理器宏

并添加_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

就这样结束了。

于 2014-01-27T15:45:53.917 回答
1

是使用 AFNetworking 允许无效 SSL 证书的最佳方法。

使用添加 _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 到

项目>构建设置>预处理器宏并将其添加到调试条目。

希望能帮助到你

于 2013-05-31T04:42:53.767 回答
1

如果您使用 RestKit 使用

client.allowsInvalidSSLCertificate = YES;

不会工作,而是这样做:

如果你手动添加了rest kit到你的项目中,点击 RestKit.xcodeproj 去 project > Build Settings > Preprocessor Macros

并添加_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

就这样结束了。

于 2014-01-27T15:44:00.863 回答
0

我遇到了同样的问题,我阅读的解决方案都没有。

对我来说,唯一的解决方法是像这样设置AFSecurityPolicy

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;

我决定回答虽然问题很老,但也许可以帮助某人。

于 2015-05-25T13:54:03.480 回答