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, 并设置NSExceptionAllowsInsecureHTTPLoadstrueNSIncludesSubdomains表示是否包括子域名.

<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

一些资料