关于http转https签名的意见
Posted 萧家大公子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于http转https签名的意见相关的知识,希望对你有一定的参考价值。
一.前言简介
之前开发一直使用的是http,但是临时突然要改成https,把我折腾一番.最后总算是解决了问题.
二.两种签名
1.自签
——>1.1.如果你们后台使用的是自签证书的形式,那么很有可能在你请求的时候会出现下面这种错误的提示
Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo=NSErrorFailingURLKey=https://tsleasing.cs.xundatong.net/api/user/signout, NSLocalizedDescription=已取消, NSErrorFailingURLStringKey=https://tsleasing.cs.xundatong.net/api/user/signout
——>1.2.为什么会有这种错误出现呢?因为AFN无法识别这种自签的证书.
——>1.3.怎么解决这种问题呢?请看下面代码
AFHTTPSessionManager *manager = [XFJOcsNetRequestClass xfj_ocs_managerWithBaseURL:nil sessionConfiguration:NO];
if (httpHeaderParams.length != 0)
[manager.requestSerializer setValue:httpHeaderParams forHTTPHeaderField:@"X-Auth-Token"];
//这两行代码是解决上面出现的此种问题
manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
[manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
id dic = [XFJOcsNetRequestClass xfj_ocs_responseConfiguration:responseObject];
success(task,dic);
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
fail(task,error);
];
break;
——>1.4.为什么要添加这两句代码?查了一下资料,这两句代码是使得访问的时候可以说是完全信任此证书,不管证书是有效还是无效,只要添加了这两句,都能访问通过.
2.权威颁发的证书
—–>2.1.如果后台配置的证书是权威颁发的证书,那么手机端什么都不需要做处理,那两行代码也不需要添加.AFN会自己处理.
三.另类解决办法(不安全)
1.查了一下资料有很多人是这么解决的,但是本人认为,这么做的话,很容易泄露证书,所以并未采取.下面直接上代码.
—–>1.1.代码块一:
+ (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;
—–>1.2.代码块二
+ (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
// 1.获得请求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.申明返回的结果是text/html类型
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
// 3.设置超时时间为10s
mgr.requestSerializer.timeoutInterval = 10;
// 加上这行代码,https ssl 验证。
if(openHttpsSSL)
[mgr setSecurityPolicy:[self customSecurityPolicy]];
// 4.发送GET请求
[mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObj)
if (success)
success(responseObj);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
if (error)
failure(error);
];
以上是关于关于http转https签名的意见的主要内容,如果未能解决你的问题,请参考以下文章