如何配置 IIS 7.5 SSL \ TLS 以与 iOS 9 ATS 一起使用

Rob*_*tal 11 ssl ios iis-7.5 safari tls

问题:由于 iOS 9 现在使用 ATS,我们的移动应用程序无法再与我们的网络服务建立安全连接。

背景: iOS 9 引入了应用传输安全

服务器设置: 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 位或更高的椭圆曲线(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

已经尝试过的:

  1. 在移动应用程序中添加例外以允许我们的域工作,但我不想使用这种不安全的方法,我想修复我们的 SSL。
  2. 使用IIS Crypto来使用“最佳实践”,尝试过“pci”和自定义设置。甚至尝试将加密套件修改为上面的列表,并重新排序。每次尝试后,服务器都会重新启动,并运行SSL Labs(清除缓存后)。我成功地从 F 级变为 A 级,甚至是 A-,但这只会导致 iOS 8 和 9 无法建立安全连接。(NSURLErrorDomain Code=-1200 和 _kCFStreamErrorCodeKey=-9806) 在此处输入图片说明
  3. 恢复虚拟机并尝试使用 powershell 脚本为 SSL 完美向前保密和 TLS 1.2 设置您的 IIS我什至进行了第二次尝试,我将电源脚本中的密码编辑为所需的最小列表。

结果:始终相似,评级为 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
Run Code Online (Sandbox Code Playgroud)

前三个数据包是建立 TCP 连接的经典 SYN - SYN-ACK - ACK 三向握手。第四个数据包是 iOS 向您的服务器发送 TLS Client Hello 消息,这是通过该 TCP 连接建立 TLS 连接的第一步。我已经拆开了这条消息,它看起来很合理。在第五个数据包中,服务器简单地断开连接(通过发送 RST)。

有谁知道为什么 IIS 7.5 会做 RST?

小智 5

这个问题很老了,但会在搜索过程中找到。我花了一些时间来寻找相同问题的解决方案。因此我决定写下答案与其他人分享我的结果。

简短回答:您不应该使用 IIS Crypto 来指定密码套件的顺序。我建议您单击“默认”按钮以删除先前设置的顺序,然后使用组策略(“计算机配置”\“管理模板”\“网络”\“SSL 配置设置”)通过本地策略配置密码套件。

错误“协议或密码套件不匹配”的原因可能是以下之一

  • 您的服务器支持一些“坏密码套件”
  • 您的服务器不支持某些密码套件,必须支持符合 TLS 规范。
  • 您的服务器支持 HTTP/2 并且它有一些来自其他协议之上黑名单 的协议,这些协议不在列表中。通常只需更改密码套件的顺序即可解决问题。

确切的黑名单在不同系统上可能不同。你可以在互联网上找到一些黑名单。例如,RFC 7540(超文本传输​​协议版本 2 (HTTP/2))的附录 A包含一个列表。该密码套件TLS_RSA_WITH_AES_128_CBC_SHA的TLS 1.2(见这里),并TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256使用TLS 1.3(见这里)。将TLS_ECDHE_ECDSA_*是重要的不仅是您使用证书与椭圆曲线。TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256Microsoft 尚未实施其他非常好的密码套件。此外,您可以考虑至少添加TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA以支持来自旧系统的连接并TLS_RSA_WITH_AES_128_CBC_SHA支持非常旧的系统(Android 2.3.7、Java 6u45、OpenSSL 0.9.8y)并且TLS_RSA_WITH_3DES_EDE_CBC_SHA仅当您需要支持 IE 8 / XP 时。因此,您可以使用今天,例如

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Run Code Online (Sandbox Code Playgroud)

禁用 TLS 1.0、TLS 1.1以获得更好的安全性或只是

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Run Code Online (Sandbox Code Playgroud)

如果您需要良好的安全性和最佳性能。

例如,您可以设置以下简短的密码套件来解决您的问题:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
Run Code Online (Sandbox Code Playgroud)

下面我包括一个在 Windows 10 上的配置示例。我将 IIS 10 配置为从 Qualys SSL Labs获得A+ 评级,使用 RSA 2048 密钥和来自 Let's Encrypt 的免费 SSL 证书

在此处输入图片说明

我禁用了 DES 56/56、RC2 128/128、RC2 40/128、RC2 56/128、RC4 128/128、RC4 40/128、RC4 56/128、RC4 64/128、三重 DES、16、16 MD5、多协议统一问候、PCT 1.0、SSL 2.0、SSL 3.0 和 TLS 1.0/1.1在注册表中手动(参见KB245030)。我禁用了 TLS 1.0 和 TLS 1.1 协议只是因为 TLS_FALLBACK_SCSV(降级攻击)目前在 IIS 中无法阻止,这使得www.ssllabs.com无法获得 A+ 评级。我认为这是一个缺点,但目前非常广泛地支持 TLS 1.2。顺便说一句,您可以使用DisabledByDefault: 1, 但Enabled: 1对于 TLS 1.0 和 TLS 1.1。如果您在计算机上运行 SQL Server 2008/2012,这可能会有所帮助。Web 服务器不会使用 TLS 1.0 和 TLS 1.1,但 SQL Server 会使用。

最重要的一步,它占用了我很多时间并且是您的主要问题是密码套件的配置。我使用gpedit.msc. 我选择了“计算机配置”\“管理模板”\“网络”\“SSL 配置设置”并将“SSL 密码套件顺序”值配置为以下

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
Run Code Online (Sandbox Code Playgroud)

上述顺序可能不是最佳顺序,我不确定 IIS 7.5 是否支持上述所有协议(我使用的是 Windows 10 中的 IIS 10.0)。尽管如此,我确信您的问题与密码套件列表有关,因为我遇到了与您在使用密码套件列表进行实验时所描述的完全相同的问题。

无论如何,在 Group Polity 中配置上述设置并重新启动计算机gpupdate /force /target:computer在我的测试中还不够)后,我获得了 A+ 评级和以下“握手模拟”部分的测试结果列表:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

可以看到 iOS 成功支持以下客户端:

Safari 6 / iOS 6.0.1
Safari 7 / iOS 7.1
Safari 8 / iOS 8.4
Safari 9 / iOS 9
Run Code Online (Sandbox Code Playgroud)

不支持 TLS 1.2 的客户端现在对我来说似乎不是那么重要,我认为上述配置是对旧客户端的支持和安全协议的使用之间的一个很好的折衷。


小智 0

如果您的 IIS 加密映像是最新的,请保持设置不变,但启用 SHA、Diffie-Hellman 和 PKCS。这将为您提供 A 评级,但允许 iOS 8 及更低版本进行连接。