zoukankan      html  css  js  c++  java
  • AFNetWorking https请求 SSL认证 自制证书

    1.服务器会给一个证书,一般为.pem格式证书

    2.将.pem格式的证书转换成.cer格式的证书

    打开电脑自带终端 ,进入到桌面  cd Desktop 回车回到桌面Desktop Admin$

    输入命令  openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der

    这句话的意思是 将你的证书.pem格式转换成.cer格式的证书

    3.双击打开在钥匙串中可以看到你的这个证书  ,右键导出证书 注意存储为名字格式为  www.baidu.com

    导出后,将证书拖入你的工程项目中

     4.在你的网络工具类.m文件中

    //  封装的网络请求工具类
    
    #import "YYCHttpTool.h"
    #import "AFNetworking.h"
    #import "YYCCommon.h"
    
    /**
     *  是否开启https SSL 验证
     *
     *  @return YES为开启,NO为关闭
     */
    #define openHttpsSSL YES
    /**
     *  SSL 证书名称,仅支持cer格式。“app.bishe.com.cer”,则填“app.bishe.com”
     */
    #define certificate @"baidu.com"
    
    
    @implementation YYCHttpTool
    /**
     *  GET请求
     *
     *  @param url     请求路径
     *  @param params  请求参数
     *  @param success 请求成功
     *  @param failure 请求失败
     */
    +(void)GET:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
    {
        // 1.创建请求管理者
        AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
        
        //设置加载时间
        mgr.requestSerializer.timeoutInterval = 5.0f;
     
    
        mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
        
        // 加上这行代码,https ssl 验证。
        if(openHttpsSSL)
        {
            [mgr setSecurityPolicy:[self customSecurityPolicy]];
        }
        
        
        // 2.发送请求
        [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (success) {
                
                //序列化  返回dict
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
                
                success(dict);
            }
    
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            if (failure) {
                failure(error);
            }
        }];
    
    }
    
    
    
    /**
     *  POST请求
     *
     *  @param url     请求路径
     *  @param params  请求参数
     *  @param success 请求成功
     *  @param failure 请求失败
     */
    +(void)POST:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
    {
        
        
        // 1.创建请求管理者
        AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
        
        //设置加载时间
        
        mgr.requestSerializer.timeoutInterval = 5.0f;
    
        
        mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
       
        
        // 加上这行代码,https ssl 验证。
        if(openHttpsSSL)
        {
            [mgr setSecurityPolicy:[self customSecurityPolicy]];
        }
    
    
        
        // 2.发送请求
        [mgr POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (success) {
                
                //序列化  返回dict
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
    
                success(dict);
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            if (failure) {
                failure(error);
            }
        }];
    
    }
    
    
    + (AFSecurityPolicy*)customSecurityPolicy
    {
        // /先导入证书
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:certificate ofType:@"cer"];//证书的路径
        NSData *certData = [NSData dataWithContentsOfFile:cerPath];
        
        // AFSSLPinningModeCertificate 使用证书验证模式
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        
        // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
        // 如果是需要验证自建证书,需要设置为YES
        securityPolicy.allowInvalidCertificates = YES;
        
        //validatesDomainName 是否需要验证域名,默认为YES;
        //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
        //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
        //如置为NO,建议自己添加对应域名的校验逻辑。
        securityPolicy.validatesDomainName = NO;
        
        securityPolicy.pinnedCertificates = @[certData];
        
        return securityPolicy;
    }
    
    
    
    
    
    
    
    @end
    View Code

    完毕

  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/ithongjie/p/5425404.html
Copyright © 2011-2022 走看看