【问题标题】:AFNetworking 2.0 certificate not readAFNetworking 2.0 证书未读取
【发布时间】:2013-12-02 20:45:20
【问题描述】:

我使用代码读取JSON数据:

[[DVAPIManager sharedManager] setUsername:user andPassword:pass];

NSLog(@"Using %d pinned certificates", [[DVAPIManager sharedManager].securityPolicy.pinnedCertificates count]);
[[DVAPIManager sharedManager] GET:@"/areas" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
}];

但出于调试原因我拥有的 NSLong 给出:使用 0 个固定证书

我已经将 apache.cer 文件复制到项目和我的单例类文件中:

- (id)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];
    if(!self)
        return nil;

    self.requestSerializer = [AFJSONRequestSerializer serializer];

    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    AFSecurityPolicy *mySecurityPolicy = [[AFSecurityPolicy alloc] init];
    [mySecurityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];


    [self  setSecurityPolicy:mySecurityPolicy];


    return self;
}

当我运行时,我得到了错误:

错误:Error Domain=NSURLErrorDomain Code=-1012“操作无法完成。(NSURLErrorDomain错误-1012。)

知道为什么无法获取 JSON 数据以及系统无法读取 my.cer 文件的原因吗?

当我尝试手动读取 .cer 文件时

[mySecurityPolicy setPinnedCertificates:[[NSArray alloc] initWithObjects:@"apache.cer", nil]];

它崩溃了!

【问题讨论】:

  • 请修正您的标题、格式和拼写...

标签: ios7 afnetworking-2


【解决方案1】:

我通过手动加载证书使我的证书正常工作:

- (void)setupSSL
{
    self.securityPolicy.SSLPinningMode = AFSSLPinningModePublicKey;
    NSString *sslPublicKeyPath = [[NSBundle mainBundle] pathForResource:@"mydomain" ofType:@"cer"];
    NSData *sslPublicKey = [NSData dataWithContentsOfFile:sslPublicKeyPath];
    [self.securityPolicy setPinnedCertificates:@[
        sslPublicKey
    ]];
}

我使用以下内容从我的 pem 生成了我的密钥:

openssl x509 -in mydomain.pem -out mydomain.cer -outform der

【讨论】:

    【解决方案2】:

    我解决了在我的单例类中添加此代码以读取证书文件:

    NSString* fileRoot = [[NSBundle mainBundle] pathForResource:@"apache" ofType:@"cer"];
    
    NSData *certData = [[NSData alloc] initWithContentsOfFile:fileRoot];
    
    self.requestSerializer = [AFJSONRequestSerializer serializer];
    
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    AFSecurityPolicy *mySecurityPolicy = [[AFSecurityPolicy alloc] init];
    [mySecurityPolicy setSSLPinningMode:AFSSLPinningModeCertificate];
    
    [mySecurityPolicy setAllowInvalidCertificates:YES];
    [mySecurityPolicy setPinnedCertificates:[[NSArray alloc] initWithObjects:certData, nil]];
    

    可能是默认读取 .cer 文件不起作用,您必须手动执行(如上面的代码)

    【讨论】:

    • 仅供参考,此实现实际上完全跳过 SSL 固定,因为您将AllowInvalidCertificates 设置为 YES。
    • @drewag 你有没有跳过 SSL pinning 的解决方案?
    • 是的,我让它为我自己的证书工作,而不必求助于允许无效证书。我将我的解决方案添加到问题本身,但简而言之,我手动加载了证书并将其设置在现有的安全策略上(在将其设置为 AFSSLPinningModePublicKey 之后)。
    • 这并不能解决任何问题(对我而言)
    猜你喜欢
    • 2013-12-23
    • 2012-09-10
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2014-06-22
    • 2015-10-25
    • 2014-03-30
    相关资源
    最近更新 更多