问题:由于iOS 9现在使用ATS,因此我们的移动应用程序无法再与我们的Web服务建立安全连接。
背景: iOS 9引入了App Transport Security
服务器设置: Windows Server 2008 R2 SP1(VM)IIS 7.5,来自digicert的SSL证书。Windows防火墙关闭。
密钥RSA 2048位(e 65537)
发行者DigiCert SHA2安全服务器CA
签名算法SHA512withRSA
这些是应用程序传输安全性要求:
服务器必须至少支持传输层安全性(TLS)协议版本1.2。连接密码仅限于提供前向保密性的密码(请参阅下面的密码列表。)证书必须使用SHA256或更好的签名哈希算法进行签名,并使用2048位或更高的RSA密钥或256位或更高的Elliptic-Curve (ECC)键。无效的证书会导致严重故障并且无法连接。这些是公认的密码:
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
已经尝试了什么:
- 在移动应用程序中添加例外以允许我们的域工作,但是我不想使用这种不安全的方法,我想修复我们的SSL。
- 使用IIS Crypto来使用“最佳实践”,尝试过“ pci”和自定义设置。甚至尝试将加密套件修改为上面的列表,然后重新排序。每次尝试后,服务器将重新启动,并且SSL Labs已运行(清除缓存后)。我成功地从F等级升级到A甚至A-,但这仅导致iOS 8和9无法建立安全连接。(NSURLErrorDomain代码= -1200和_kCFStreamErrorCodeKey = -9806)
- 恢复了VM,并尝试了Powershell脚本为SSL完美的IIS和TLS 1.2设置了IIS我什至进行了第二次尝试,在该过程中,我将Power脚本中的密码加密为所需内容的最小清单。
结果:始终相似,等级为A或A-。iOS8和iOS9无法协商安全连接。握手模拟会导致Safari和iOS产品出现“协议或密码套件不匹配”的情况。
更新在获得Apple支持之后,我们进行了一些数据包跟踪捕获:
$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0
前三个数据包是建立TCP连接的经典SYN-SYN-ACK-ACK三向握手。第四个数据包是iOS向您的服务器发送TLS客户端问候消息,这是在该TCP连接上建立TLS连接的第一步。我把这个信息拆开了,看起来很合理。服务器在第五个数据包中简单地丢弃连接(通过发送RST)。
有谁知道为什么IIS 7.5会执行RST?