关于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签名的意见的主要内容,如果未能解决你的问题,请参考以下文章

对 HTTP 请求进行身份验证和签名

在windows下安装gulp[转]

关于从 php 发送电子邮件的意见

13 http转https

springboot http转https

消息认证-数字签名-报文鉴别-到底是什么