通过上篇文章总体的了概述了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