1. 一.项目中的网络交互都是基于AFN,要求AFN版本在3.0及其以上;  
2.   
3. 二.代码部分  
4. 设置AFN请求管理者的时候 添加 https ssl 验证。  
5. // 1.获得请求管理者  
6. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
7. // 2.加上这个函数,https ssl 验证。  
8. [manager setSecurityPolicy:[self customSecurityPolicy]];  
9.   
10. // https ssl 验证函数  
11.   
12. - (AFSecurityPolicy *)customSecurityPolicy {  
13.       
14. // 先导入证书 证书由服务端生成,具体由服务端人员操作  
15. NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径  
16. NSData *cerData = [NSData dataWithContentsOfFile:cerPath];  
17.       
18. // AFSSLPinningModeCertificate 使用证书验证模式  
19. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  
20. // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
21. // 如果是需要验证自建证书,需要设置为YES  
22. .allowInvalidCertificates = YES;  
23.       
24. //validatesDomainName 是否需要验证域名,默认为YES;  
25. //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
26. //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
27. //如置为NO,建议自己添加对应域名的校验逻辑。  
28. .validatesDomainName = NO;  
29.       
30. .pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil nil];  
31.       
32. return securityPolicy;  
33. }  
34.   
35.   
36. 三.关于证书 参考文章:http://www.2cto.com/Article/201510/444706.html  
37. 服务端给的是crt后缀的证书,其中iOS客户端用到的cer证书,是需要开发人员转换:  
38. 1.证书转换  
39. 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句  
40.   
41. openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der  
42.   
43. 这样你就可以得到cer类型的证书了。双击,导入电脑。  
44. 2.证书放入工程  
45. 1、可以直接把转换好的cer文件拖动到工程中。  
46. 2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了  
47. kyfw.12306.cn:443的:
48.   openssl s_client -connect kyfw.12306.cn:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer
49. 参考链接:http://www.jianshu.com/p/97745be81d64。  
50.    
51. 四.在info.plist去掉之前允许http加载的代码 就是删除下面的代码(么有的就省了这一步)  
52.  <key>NSAppTransportSecurity</key>  
53.     <dict>  
54.  <key>NSAllowsArbitraryLoads</key>  
55. true/>  
56.     </dict>






[objc]  view plain  copy


 


1. 一、  
2. 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS。  
3. .plist 的 NSAllowsArbitraryLoads  
4. 1.这要求所有通过APP发送的网络请求都需要https  
5.    
6. 2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;  
7.    
8. 3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES ,  
9.  可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。  
10. 9 中并不会起作用.  
11.    
12. 4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码  
13.      <key>NSAppTransportSecurity</key>  
14.      <dict>  
15.          <key>NSExceptionDomains</key>  
16.          <dict>  
17. .com</key>  
18.              <dict>  
19.                  <!--适用于这个特定域名下的所有子域-->  
20.                  <key>NSIncludesSubdomains</key>  
21. true/>  
22.                  <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码-->  
23.                  <key>NSExceptionRequiresForwardSecrecy</key>  
24. false/>  
25.                  <!--允许App进行不安全的HTTP请求-->  
26.                  <key>NSExceptionAllowsInsecureHTTPLoads</key>  
27. true/>  
28.                  <!--在这里声明所支持的 TLS 最低版本-->  
29.                  <key>NSExceptionMinimumTLSVersion</key>  
30. 1.1</string>  
31.              </dict>  
32.          </dict>  
33.      </dict>  
34.    
35.  二、  
36.  目前项目中用到的第三方已经支持https的有  
37.  WKWebView  
38.  UIWebView  
39.  SDWebImage  
40.  支付宝SDK  
41.  微信支付SDK  
42.  友盟SDK  
43.  极光推送SDK  
44.    
45.  其中用到的UIWebView 以后要逐步替换为WKWebView





如果报错



Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (
0 : <cert(0x15f3559e0) s: dbh i: dbh>
)}}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0}



可能是服务器配置的证书不对,苹果要求是TLS1.2,服务端配置是TLS1.0。



也有可能是后台签名算法问题 







iOS适配https参考链接:

https://github.com/ChenYilong/iOS9AdaptationTips


证书生成的参考链接:http://www.2cto.com/Article/201510/444706.html

证书转换的参考链接:http://www.jianshu.com/p/97745be81d64





1. 一.项目中的网络交互都是基于AFN,要求AFN版本在3.0及其以上;  
2.   
3. 二.代码部分  
4. 设置AFN请求管理者的时候 添加 https ssl 验证。  
5. // 1.获得请求管理者  
6. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  
7. // 2.加上这个函数,https ssl 验证。  
8. [manager setSecurityPolicy:[self customSecurityPolicy]];  
9.   
10. // https ssl 验证函数  
11.   
12. - (AFSecurityPolicy *)customSecurityPolicy {  
13.       
14. // 先导入证书 证书由服务端生成,具体由服务端人员操作  
15. NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径  
16. NSData *cerData = [NSData dataWithContentsOfFile:cerPath];  
17.       
18. // AFSSLPinningModeCertificate 使用证书验证模式  
19. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];  
20. // allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO  
21. // 如果是需要验证自建证书,需要设置为YES  
22. .allowInvalidCertificates = YES;  
23.       
24. //validatesDomainName 是否需要验证域名,默认为YES;  
25. //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。  
26. //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。  
27. //如置为NO,建议自己添加对应域名的校验逻辑。  
28. .validatesDomainName = NO;  
29.       
30. .pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil nil];  
31.       
32. return securityPolicy;  
33. }  
34.   
35.   
36. 三.关于证书 参考文章:http://www.2cto.com/Article/201510/444706.html  
37. 服务端给的是crt后缀的证书,其中iOS客户端用到的cer证书,是需要开发人员转换:  
38. 1.证书转换  
39. 在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句  
40.   
41. openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der  
42.   
43. 这样你就可以得到cer类型的证书了。双击,导入电脑。  
44. 2.证书放入工程  
45. 1、可以直接把转换好的cer文件拖动到工程中。  
46. 2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了  
47. kyfw.12306.cn:443的:
48.   openssl s_client -connect kyfw.12306.cn:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer
49. 参考链接:http://www.jianshu.com/p/97745be81d64。  
50.    
51. 四.在info.plist去掉之前允许http加载的代码 就是删除下面的代码(么有的就省了这一步)  
52.  <key>NSAppTransportSecurity</key>  
53.     <dict>  
54.  <key>NSAllowsArbitraryLoads</key>  
55. true/>  
56.     </dict>






[objc]  view plain  copy


 


    1. 一、  
    2. 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS。  
    3. .plist 的 NSAllowsArbitraryLoads  
    4. 1.这要求所有通过APP发送的网络请求都需要https  
    5.    
    6. 2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;  
    7.    
    8. 3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES ,  
    9.  可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。  
    10. 9 中并不会起作用.  
    11.    
    12. 4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码  
    13.      <key>NSAppTransportSecurity</key>  
    14.      <dict>  
    15.          <key>NSExceptionDomains</key>  
    16.          <dict>  
    17. .com</key>  
    18.              <dict>  
    19.                  <!--适用于这个特定域名下的所有子域-->  
    20.                  <key>NSIncludesSubdomains</key>  
    21. true/>  
    22.                  <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码-->  
    23.                  <key>NSExceptionRequiresForwardSecrecy</key>  
    24. false/>  
    25.                  <!--允许App进行不安全的HTTP请求-->  
    26.                  <key>NSExceptionAllowsInsecureHTTPLoads</key>  
    27. true/>  
    28.                  <!--在这里声明所支持的 TLS 最低版本-->  
    29.                  <key>NSExceptionMinimumTLSVersion</key>  
    30. 1.1</string>  
    31.              </dict>  
    32.          </dict>  
    33.      </dict>  
    34.    
    35.  二、  
    36.  目前项目中用到的第三方已经支持https的有  
    37.  WKWebView  
    38.  UIWebView  
    39.  SDWebImage  
    40.  支付宝SDK  
    41.  微信支付SDK  
    42.  友盟SDK  
    43.  极光推送SDK  
    44.    
    45.  其中用到的UIWebView 以后要逐步替换为WKWebView





    如果报错



    Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = ( 
      
    0 : <cert(0x15f3559e0) s: dbh i: dbh> 
      
     )}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = ( 
      
    0 : <cert(0x15f3559e0) s: dbh i: dbh> 
      
     )}}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0}

    可能是服务器配置的证书不对,苹果要求是TLS1.2,服务端配置是TLS1.0。



    也有可能是后台签名算法问题 







    iOS适配https参考链接:

    https://github.com/ChenYilong/iOS9AdaptationTips


    证书生成的参考链接:http://www.2cto.com/Article/201510/444706.html

    证书转换的参考链接:http://www.jianshu.com/p/97745be81d64




    如果报错 Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (

    0 : <cert(0x15f3559e0) s: dbh i: dbh>


    )}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = (


    0 : <cert(0x15f3559e0) s: dbh i: dbh>


    )}}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0}



    可能是服务器配置的证书不对,苹果要求是TLS1.2,服务端配置是TLS1.0。 也有可能是后台签名算法问题