全部产品
    HTTPDNS iOS SDK:报错 Error Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效。您可能正在连接到一个伪装成“XX.XX.XX.XX” (IP地址 )的服务器,这会威胁到您的机密信息的安全,或者 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)

HTTPDNS iOS SDK:报错 Error Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效。您可能正在连接到一个伪装成“XX.XX.XX.XX” (IP地址 )的服务器,这会威胁到您的机密信息的安全,或者 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843)

更新时间:2018-05-31 11:11:34

首先参考《HTTPS(含SNI)业务场景“IP直连”方案说明》需要基于文档基础做开发,不然在证书校验阶段有问题。在HTTPS,特别是SNI场景使用HTTPDNS,是需要一些开发投入的。

可以调整上文提到的证书校验步骤,改为如下:

  1. - (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust
  2. forDomain:(NSString *)domain {
  3. serverTrust = AFChangeHostForTrust(serverTrust,domain);
  4. /*
  5. * 创建证书校验策略
  6. */
  7. NSMutableArray *policies = [NSMutableArray array];
  8. if (domain) {
  9. [policies addObject:(__bridge_transfer id) SecPolicyCreateSSL(true, (__bridge CFStringRef) domain)];
  10. } else {
  11. [policies addObject:(__bridge_transfer id) SecPolicyCreateBasicX509()];
  12. }
  13. /*
  14. * 绑定校验策略到服务端的证书上
  15. */
  16. SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef) policies);
  17. /*
  18. * 评估当前serverTrust是否可信任,
  19. * 官方建议在result = kSecTrustResultUnspecified 或 kSecTrustResultProceed
  20. * 的情况下serverTrust可以被验证通过,https://developer.apple.com/library/ios/technotes/tn2232/_index.html
  21. * 关于SecTrustResultType的详细信息请参考SecTrust.h
  22. */
  23. SecTrustResultType result;
  24. SecTrustEvaluate(serverTrust, &result);
  25. if (result == kSecTrustResultRecoverableTrustFailure) {
  26. CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust);
  27. SecTrustSetExceptions(serverTrust, errDataRef);
  28. SecTrustEvaluate(serverTrust, &result);
  29. }
  30. return (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);
  31. }

注意添加了如下步骤

  1. if (trustResult == kSecTrustResultRecoverableTrustFailure)
  2. {
  3. CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust);
  4. SecTrustSetExceptions(serverTrust, errDataRef);
  5. SecTrustEvaluate(serverTrust, &trustResult);
  6. }

具体调整的原因可以参考: