AFNetworking3.x使用自签名证书建立https连接

这是第一次在写东西,也是第一次在网络上写这类文章,所以写得不好的话,也请谅解下。

在网上找了许久,没找到一个完整的关于afn设置自签名证书进行https链接的文章,也许是我搜索的方式不对,好在现在实现了afn使用自签名证书进行https链接。

https://example.com/jianshu.php

配置前准备

  • cer证书文件


    AFNetworking3.x使用自签名证书建立https连接_第1张图片
    屏幕快照 2016-11-26 下午3.31.00.png
  • AFNetworking3

导入工程啥的也就不说了

下面开始干正经事

  • 导入文件到项目
AFNetworking3.x使用自签名证书建立https连接_第2张图片
cer、afn导入工程
  • 为站点添加白名单
白名单
  • 添加主要代码
-(void)postToWeb{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    // 安全验证
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    /*
     AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。
     AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
     AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。
     */
    securityPolicy.allowInvalidCertificates = YES;//是否信任非法证书(自建证书)
    securityPolicy.validatesDomainName = NO;//是否验证域名有效性
    manager.securityPolicy = securityPolicy;
    NSDictionary *postDic = @{@"jianshu":@"1"};
    
    [manager POST:@"https://example.com/jianshu.php" parameters:postDic progress:^(NSProgress * _Nonnull uploadProgress) {
        
    }success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *resultStr = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"请求成功,%@",resultStr);
    }failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败:%@",error);
    }];
}

工程一览

AFNetworking3.x使用自签名证书建立https连接_第3张图片
工程

抓包查看

AFNetworking3.x使用自签名证书建立https连接_第4张图片
抓包结果

已经加密访问了web了

假设服务器与内置证书不符

另一个cre证书文件

那么好像就请求失败了

AFNetworking3.x使用自签名证书建立https连接_第5张图片
失败

而如果将

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

换成

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];

AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书。
AFSSLPinningModePublicKey: 代表客户端会将服务器端返回的证书与本地保存的证书中,PublicKey的部分进行校验;如果正确,才继续进行。
AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。

那么返回的结果则

AFNetworking3.x使用自签名证书建立https连接_第6张图片
不校验证书的交互

11月29日,由于写的时候想上传demo的,后来忘了补充一点:

AFNetworking3.x使用自签名证书建立https连接_第7张图片
注释afn中的两行代码

以上是我的一些学习分享,做为自己的学习笔记

  来自一名ios初学者的文章

对于这篇https链接的理解是:与服务器进行交互时,用AFSSLPinningModeCertificate 验证了是我的服务器,然后使用https链接。 有出现中间人的话,那么必定是不正确的服务器证书,我的app验证不过 也就不能交互了吧。不知道我理解错了没有

也还有一个疑问,不知道我这模拟虚假服务器的方式是否正确。

有哪里不对,望纠正我的无知~ 感激

你可能感兴趣的:(AFNetworking3.x使用自签名证书建立https连接)