iOS 9和macOS 10.11及以上系统版本,苹果会默认开启App Transport Security(应用通讯安全)
模式,要求所有HTTP请求都要使用HTTPS,如果开发者不做任何特殊处理,不规范HTTP请求都会失败。一个符合ATS要求的 HTTPS,应该满足如下条件:
- HTTPS的TLS(Transport Layer Security)版本不低于1.2
- HTTPS证书必须是授权机构颁发的证书,或者是用户、或系统已经认可的证书,而自签名证书
- TLS加密算法Ciphers配置要支持Forward Secrecy(前向保密),即必须是以下算法之一
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
概念解释
HTTPS
即使用TLS加密的HTTP通信,避免了明文传播,防止第三方窃听;具有校验机制,防止第三方篡改内容;配备身份证书,防止第三方冒充。
TLS
是SSL增强版,具体介绍查看SSL与TLS 区别 以及介绍
Forward secrecy
的大致意思是:用来产生会话密钥(session key)的长期密钥(long-term key)泄露出去,不会造成之前通讯时使用的会话密钥(session key)的泄露,也就不会暴漏以前的通讯内容。如何理解前向安全性?
ATS模式配置
1,关闭ATS模式
如果Server完全不支持HTTPS,我们只能关闭ATS模式。则需要在Info.plist增加配置:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我们非常不建议关闭ATS,特别是应用有账号登陆、涉及到用户隐私、资金的HTTP的,是极其不安全的。
2,某些服务器关闭ATS模式
如果只是某个或几个服务器需要关闭ATS,可以增加NSExceptionDomains
, 并设置NSExceptionAllowsInsecureHTTPLoads
为true
。NSIncludesSubdomains
表示是否包括子域名.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>video.futu5.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
3,降低某些服务器TLS要求
如果要支持某些TLS低于1.2的服务器,可以增加NSTemporaryExceptionMinimumTLSVersion
配置,可设置值为“TLSv1.0”、“TLSv1.1”。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>video.futu5.com</key>
<dict>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
调试工具
1, 如何查看一个Server是否开启了HTTPS, 以及TLS版本可以用curl命令
curl https://futu5.com --verbose
* Rebuilt URL to: https://futu5.com/
* Trying 119.29.116.90...
* Connected to futu5.com (119.29.116.90) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: *.futu5.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
2, 对一个某个域名应该做怎样的ATS设置,苹果还提供了一个很方便的工具
nscurl --verbose --ats-diagnostics https://auth.futu5.com
3, 在Xcode项目中增加环境变量,会有额外的日志
CFNETWORK_DIAGNOSTICS=1
一些资料
- 苹果官方文档 搜索
NSAppTransportSecurity
- 苹果新『应用通信安全』的理解和使用
- 【加密解密】HTTPS