AFNetworking3.1.0源码分析(十一)之AFSecurityPolicy验证服务器信任

通过上篇文章总体的了概述了AFSecurityPolicy的功能。

先了解下数字证书和原理,这篇文章非常详细的讲解了证书以及认证的原理。

下面继续详细分析AFSecurityPolicy验证服务器信任的过程涉及的方法:

1:设置本地证书集合,和获取本地证书的公钥并创建公钥集合

1.1设置本地证书集合

- (void)setPinnedCertificates:(NSSet *)pinnedCertificates {
    //保存特定的证书集合
    _pinnedCertificates = pinnedCertificates;

    if (self.pinnedCertificates) {
        NSMutableSet *mutablePinnedPublicKeys = [NSMutableSet setWithCapacity:[self.pinnedCertificates count]];
        //解析证书中的公钥
        for (NSData *certificate in self.pinnedCertificates) {
            
            
            id publicKey = AFPublicKeyForCertificate(certificate);
            if (!publicKey) {
                continue;
            }
            NSLog(@"%@",publicKey);
            [mutablePinnedPublicKeys addObject:publicKey];
        }
        self.pinnedPublicKeys = [NSSet setWithSet:mutablePinnedPublicKeys];
    } else {
        self.pinnedPublicKeys = nil;
    }
}
1.2 获取公钥函数

static id AFPublicKeyForCertificate(NSData *certificate) {
    id allowedPublicKey = nil;
    SecCertificateRef allowedCertificate;
    SecPolicyRef policy = nil;
    SecTrustRef allowedTrust = nil;
    SecTrustResultType result;
    //DER编码方式的X.509证书数据来创建SecCertificateRef
    allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate);
    
//#ifndef __Require_Quiet
//#define __Require_Quiet(assertion, exceptionLabel)                            \
//do                                                                          \
//{                                                                           \
//if ( __builtin_expect(!(assertion), 0) )                                \
//{                                                                       \
//goto exceptionLabel;                                                \
//}                                                                       \
//} while ( 0 )
//#endif
    
//根据以上函数的逻辑,这个地方的含义是如果allowedCertificate 为null则程序跳转至_out片段继续执行
    
    __Require_Quiet(allowedCertificate != NULL, _out);

    //创建X509格式的证书策略(此为默认的策略)
    policy = SecPolicyCreateBasicX
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值