AFN Https单向认证详解

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

从名字我们就能看出来, 验证证书中的域名是否匹配, 就是验证我们访问的域名和证书中的域名是不是一致的, 也就是做域名校验.

就是证书中下图这个位置

image

一般一致的话我们就设成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, 导入到你工程里边就可以了.

你可能感兴趣的:(AFN Https单向认证详解)