对于AFNetworking HTTP转HTTPS请求证书问题

By | 12月12日
Advertisement

iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题

字数991 阅读3830 评论14 喜欢16

公司之前的请求都是HTTP的,现在要把HTTP改成HTTPS,如果我们只是单单的把http改成https,在进行网络请求的时候,会报下面的一大堆错误,大概意思也就是说证书无效,影响请求的安全性:



Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效。您可能正在连接到一个伪装成“m.dks.com”的服务器,这会威胁到您的机密信息的安全。" UserInfo=0x1741abb40 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1740cdd60>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x1740520f0
"未能完成操作。(“kCFErrorDomainCFNetwork”错误 -1202。)", NSLocalizedDescription=此服务器的证书无效。您可能正在连接到一个伪装成“m.dks.com”的服务器,这会威胁到您的机密信息的安全。, NSErrorFailingURLKey=https://m.dks.com//user/login!login.do,
NSErrorFailingURLStringKey=https://m.dks.com//user/login!login.do, _kCFStreamErrorDomainKey=3}



我们要做的就是,从后台那里拿到一个.crt后缀的证书文件,把这个文件变成.cer后缀的文件,我此处使用的是命令行;当然你也可以使用Mac上面的钥匙串去访问,让后从政府颁发机构导出.cer的文件;打开你的终端,写下面的命令:

openssl x509 -in 后台给的.crt -out 想要的名字.cer -outform der

然后把生成的:想要的名字.cer文件导入到工程中,在自己封装AFNetworking的类中,写如下代码:

+ (AFSecurityPolicy *)customSecurityPolicy
{
    //先导入证书,找到证书的路径
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Admin" 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;
    NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
    securityPolicy.pinnedCertificates = set;

    return securityPolicy;
}

然后在封装的get请求或者是是post请求的地方,调用上面的这段代码:

+ (void)postWithURLString:(NSString *)urlString
               parameters:(id)parameters
                  success:(SuccessBlock)successBlock
                  failure:(FailureBlock)failureBlock
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.requestSerializer.timeoutInterval = outTime;
    //HTTPS SSL的验证,在此处调用上面的代码,给这个证书验证;
    [manager setSecurityPolicy:[SYNetworkingManager customSecurityPolicy]];
    [manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (successBlock) {
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
            successBlock(dic);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failureBlock) {
            failureBlock(error);
            NSLog(@"网络异常 - T_T%@", error);
        }
    }];
}

Similar Posts:

  • AFNetworking 3.0 https请求忽略证书验证

    1.修改AFNetworking中修改源码,在AFSecurityPolicy.m注释掉这几句 - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain { // if (domain && self.allowInvalidCertificates && self.validatesDomainName && (self.SSLPinningMode

  • iOS 用自签名证书实现 HTTPS 请求的原理实例讲解

    在16年的WWDC中,Apple已表示将从2017年1月1日起,所有新提交的App必须强制性应用HTTPS协议来进行网络请求.默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info.plist中添加NSAllowsArbitraryLoads设置绕过ATS(App Transport Security)的限制(否则须在应用审核时进行说明并很可能会被拒).所以还未进行相应配置的公司需要尽快将升级为HTTPS的事项提上进程了. 本文将简述HTTPS及配置数字证书的原理并以配置实例

  • Nodejs后台发送https请求验证证书

    项目中用到了很多第三方的库,这些库在生产环境使用的时候的都会发送https的请求出去,但是再发送请求的时候nodejs会验证证书,没有证书的时候都会无法通过,这里可以修改代码进行修改这个问题, 1.在发送https请求的时候添加如下代码: rejectUnauthorized: false, 如图,某个库: 2.还有就是全局设置. 启动程序的时候设置: process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

  • Https请求忽略证书验证最新实现

    最近工作中需要和一个第三方公司进行https交互请求,但是对方的证书有一些问题,所以在发送请求的时候需要忽略证书验证.百度之后,发现已经有很多这方面的介绍,不过在使用其代码的时候总会有一些类不推荐使用了.下面是参考网上的常见方面并结合最新的官方API实现的一个最新方法(使用的主要jar包括httpclient-4.5.1.jar和httpcore-4.4.3.jar). public static List doPostByClient(String url, Map<?, ?> postDa

  • iOS客户端校验https网络请求证书

    其实iOS系统的网络请求都有校验,比如NSURLConnection.NSURLSession都有系统的自动校验.具体的校验可进行百度 我使用的是NSURLConnection进行的网络请求,NSURLConnection是代理回调的请求方式,其中有两个代理方法是用于进行校验证书的 另外我说一下我们的需求,我们要求使用指定的CA证书进行校验不能使用系统的校验,系统的校验可自行百度,他校验证书的信任列表.但是如果我使用fiddler 进行抓取https,让fiddler自己生成一个自签名的证书,然

  • Fiddler工具使用-抓取https请求

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获手机发出的HTTP/HTTPS请求,总结下Fiddler截获IPhone和Android发出的HTTP/HTTPS包,前提条件是:安装Fiddler的机器,跟Iphone.Android在同一个网络里, 否则手机不能把HTTP发送到Fiddler的机器上来. PS:这里踩到过一个坑,手机上已经设置好代理,开启代理后,却发现手机上不了网,而且Fiddler没有请求过来,弄了半天,发现和电脑防火墙有关系. 一.准备工作 不论IPhon

  • C#模拟Http与Https请求框架类实例

    本文实例讲述了C#模拟Http与Https请求框架类.分享给大家供大家参考. 具体实现方法如下: 代码如下: using System.Text; using System.Net; using System.IO; using System.Text.RegularExpressions; using System.Security.Cryptography.X509Certificates; using System.Net.Security; namespace WebRequestTes

  • java利用https请求服务器

    废话不多说上一个例子: 这个例子屏蔽了证书. /** * https请求类 */ package com.zte.ucm.ssologin.ssoclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Stri

  • 通过JSSE来发起Https请求

    工作中会遇到https请求和接受相关的问题,这篇文章介绍的挺不错,转来记录一下,抽时间还会在这篇文章的基础上增加一些自己理解的东东. 摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新

  • [置顶] Java 和 HTTP 的那些事(四) HTTPS 和 证书

    说起 HTTP 的那些事,则不得不提 HTTPS ,而说起 HTTPS ,则不得不提数字证书.这篇博客将从 Java 的角度,学习 HTTPS 和数字证书技术,并分享爬虫开发的过程中针对爬取 HTTPS 站点时可能遇到的一些问题. 在前面的几篇博客里,其实已经略微提到过 HTTPS 了,譬如使用 HttpsURLConnection 类发送 HTTPS 请求,在使用代理时 HTTP 和 HTTPS 的一些差异等等.关于 HTTPS 的概念就不废话了,下面直接进入正题. 一.访问 HTTPS 站点

Tags: