美文网首页
iOS 适配 https 以及 code = -999 错误

iOS 适配 https 以及 code = -999 错误

作者: 唐师兄 | 来源:发表于2016-12-13 17:14 被阅读962次

1.生成.cer文件,并且拖入到自己的项目中
在终端操作:
openssl s_client -connect www.baidu.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer
注: 将 www.baidu.com 换成你的接口域名 , 最后面的 https.cer 就是你导出的cer证书名字
2.Xcode info.plist 添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3.使用 AFN

  • (void)testATS {
    //先导入证书,找到证书的路径
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];

    //AFSSLPinningModeNone 这个模式表示不做 SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。
    //AFSSLPinningModeCertificate 这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致。
    //AFSSLPinningModePublicKey 这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息。只要公钥是正确的,就能保证通信不会被窃听,因为中间人没有私钥,无法解开通过公钥加密的数据。
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    if (certData) {
    securityPolicy.pinnedCertificates = @[certData];
    }
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    [sessionManager setSecurityPolicy:securityPolicy];
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    sessionManager.responseSerializer.acceptableContentTypes = [sessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

    NSString *urlStr = @"https:www.baidu.com";
    [sessionManager GET:urlStr parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"responseObject = %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
    NSLog(@"error = %@", error);
    }];
    }
    因为之前使用了 AFSSLPinningModeCertificate 模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    改成现在的 AFSSLPinningModeNone 模式,解决问题。
    因为我的证书是 Symantec 的 DV SSL 证书,所以 securityPolicy 的 allowInvalidCertificates 和 validatesDomainName 属性都是默认值😁。之前没有改成默认一直在报 code = -999.

相关文章

网友评论

      本文标题:iOS 适配 https 以及 code = -999 错误

      本文链接:https://www.haomeiwen.com/subject/zddbmttx.html