AFN Https单向认证详解
本篇文章不是 https 认证的流程, 主要是对流程中几个关键的参数做一些详细的解析.
好让我们知其所以然, 适用于 (AFN3.0之后的版本)
如果我们本地不放证书, 不设置公钥, 你的ssl证书是正规申请的, 那设置
securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.validatesDomainName = YES;
securityPolicy.allowInvalidCertificates = NO;
我们依次对这些设置做一个详细说明
AFSSLPinningModeNone
这个是一个枚举值, 一共有三个选项
AFSSLPinningModeNone,
AFSSLPinningModePublicKey,
AFSSLPinningModeCertificate,
先明确一点, 这三个参数都是说明, 要不要做本地证书或公钥的验证, 就是你工程中是否加入了证书或公钥.
AFSSLPinningModeNone 这个当然就是说不做本地证书或公钥验证
AFSSLPinningModePublicKey 做本地公钥验证
AFSSLPinningModeCertificate 做本地证书验证
当为 AFSSLPinningModeNone 时, 会有一些特殊的地方, 我们讲完下边两个参数再说
validatesDomainName
从名字我们就能看出来, 验证证书中的域名是否匹配, 就是验证我们访问的域名和证书中的域名是不是一致的, 也就是做域名校验.
就是证书中下图这个位置
一般一致的话我们就设成YES就可以了.
allowInvalidCertificates
是否允许无效证书, 首先我们明确一下什么是无效证书.
有效证书, 就是被世界统一认可的root CA颁发的, 一般这种根证书都默认装在我们系统里了, 我们是不用自己装的.(关于https的交互和证书认证原理, 大家不懂自己上网查查)
无效证书, 当然就不是上边这种, 一般也就是自签名的证书, 也就是自己认证自己.
好了, 如果我们是正规证书,这个就要设置成 NO了.
这里要说一个特殊情况, 如果这个值你设置成 YES , 也就是允许无效证书,你会发现本来能访问的, 现在访问不了了. 这个是为什么呢?
原理就在下边这段代码里
if (domain && self.allowInvalidCertificates && self.validatesDomainName && (self.SSLPinningMode == AFSSLPinningModeNone || [self.pinnedCertificates count] == 0)) {
NSLog(@"In order to validate a domain name for self signed certificates, you MUST use pinning.");
return NO;
}
这个返回NO就说明不让访问了, 总体的意思就是,如果你验证域名, 还想要允许非有效证书,但没有本地证书, 那抱歉, 这种情况不允许.
也就是你想要允许自签名证书, 就必需工程中加入本地证书.
好了, 这下我们大概就明白了, 如果你想要做自签名的验证访问, 那设置就应该是下边这样
securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.validatesDomainName = NO;
securityPolicy.allowInvalidCertificates = YES;
一般自签名证书, 都要验证本地证书了, 验证域名也就没有必要了.
这时你就需要服务端的将它的自签名的证书, 导出一个der格式的, 其实它也是服务端那个证书, 只是换了个格式而已, 因为我们客户端就认识这种格式.
后缀命名成.cer, 导入到你工程里边就可以了.