AFN 中的 https 安全策略

前言

在 AFNetworking 框架中,有一个 AFSecurityPolicy 类,这个类就是 AFN 的安全策略类。

一、AFSecurityPolicy 默认的 SSL 证书处理模式

先上代码:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSLog(@"%tu", manager.securityPolicy.SSLPinningMode);

首先,AFSecurityPolicy 类中有一个 SSLPingingMode属性。这里简单介绍一下:

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
    AFSSLPinningModeNone,
    AFSSLPinningModePublicKey,
    AFSSLPinningModeCertificate,
};
  • AFSSLPinningModeNone:代表客户端无条件地信任服务器端返回的证书。
  • AFSSLPinningModePublicKey:代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
  • AFSSLPinningModeCertificate:
    代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。
结论:
1> 根据打印结果可知,默认的 `SSLPingingMode` 是
 `AFSSLPinningModeNone`。
2> 也就是说,AFSecurityPolicy 默认的 SSL 证书处理模式是: `客户端无条件地信任服务端返回的证书`。
3> 实际开发中,可以根据实际需求的安全级别,进行相应配置。

二、自定义 AFSecurityPolicy 属性

1、创建 安全策略 对象

// 创建安全策略对象
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];

通过这种方式创建,可以指定 SSLPingingMode 属性。

2、设置是否信任含有非法/过期证书的服务器

其实,就是设置 allowInvalidCertificates 属性

/**
 Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`.
是否信任包含无效的或者过期SSL证书的服务器,默认是 NO(不信任)
 */
@property (nonatomic, assign) BOOL allowInvalidCertificates;

1> 一般来说,每个版本的iOS设备中,都会包含一些既有的CA根证书。如果接收到的服务器证书是iOS信任的CA根证书签名的,那么则为合法证书;否则则为“非法”证书。
2> 当然,也可以给iOS加入新的信任的CA证书。

3、设置是否校验证书的域名字段

就是设置 validatesDomainName

/**
 Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES`.
是否检验证书中的 域名 字段
 */
@property (nonatomic, assign) BOOL validatesDomainName;

1> 每个证书都会包含一个DomainName, 它可以是一个IP地址,一个域名或者一端带有通配符的域名。如*.google.com, www.google.com 都可以成为这个证书的DomainName。
2> 设置validatesDomainName=YES将严格地保证其安全性。

整体代码如下

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
// 创建安全策略对象
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
   
// 设置允许信任非法证书
securityPolicy.allowInvalidCertificates = YES;
    
// 设置禁止域名校验
securityPolicy.validatesDomainName = NO;
    
// 将创建的 安全策略 赋值给 manager
manager.securityPolicy = securityPolicy;

你可能感兴趣的:(AFN 中的 https 安全策略)