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

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

问题:由于 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_使用_AES_128_CBC_SHA256 TLS_ECDHE_RSA_使用_AES_128_CBC_SHA

已尝试的方法:

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

结果:总是类似,评级为 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

前三个数据包是经典的 SYN - SYN-ACK - ACK 三方握手,用于建立 TCP 连接。第四个数据包是 iOS 向您的服务器发送 TLS 客户端 Hello 消息,这是在该 TCP 连接上建立 TLS 连接的第一步。我已将这条消息分解开来,它看起来很合理。在第五个数据包中,服务器只是断开连接(通过发送 RST)。

有人知道为什么 IIS 7.5 会执行 RST 吗?

答案1

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

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

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

  • 你的服务器支持一些“坏密码套件”
  • 您的服务器不支持某些密码套件,但必须支持该密码套件以符合 TLS 规范。
  • 你的服务器支持 HTTP/2,并且它有一些来自黑名单 多于未列入列表中的其他协议。通常,改变密码套件的顺序就足以解决问题。

不同的系统上黑名单的具体定义可能有所不同。你可以在网上找到一些黑名单。例如,附录 ARFC 7540(超文本传输​​协议版本 2 (HTTP/2))包含一个列表。密码套件适用TLS_RSA_WITH_AES_128_CBC_SHA于 TLS 1.2(请参阅这里)以及TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA2561.3(请参阅这里)。TLS_ECDHE_ECDSA_*重要的是您使用椭圆曲线证书。其他非常好的密码套件TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256尚未由 Microsoft 实现。此外,您可以考虑至少添加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

禁用 TLS 1.0、TLS 1.1拥有更好的安全保障,或者只是

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

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

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

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

下面我提供了 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、Triple DES 168/168、NULL、MD5、多协议统一 Hello、PCT 1.0、SSL 2.0、SSL 3.0 和 TLS 1.0/1.1在注册表中手动(看KB245030)。我禁用了 TLS 1.0 和 TLS 1.1 协议,因为到目前为止,IIS 中无法阻止 TLS_FALLBACK_SCSV(降级攻击),这使得无法获得 A+ 评级www.ssllabs.com。我认为这是一个缺点,但目前 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

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

无论如何,在组策略中配置上述设置后,重新启动计算机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

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

答案2

如果您的 IIS Crypto 映像是最新的,请保留原有设置,但启用 SHA、Diffie-Hellman 和 PKCS。这将为您带来 A 级评分,但允许 iOS 8 及更低版本连接。

答案3

我为此苦苦挣扎了几天。特别是我使用 Xamarin Forms PCL 从 iOS 应用程序连接到使用 OAuth2 Bearer Token 身份验证的 ASP.NET Web Api 2 rest 服务。

最终对我有用的是使用 IIS Crypto 的最佳实践。然后编辑它为密码套件顺序设置的注册表项:

KEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Function

我成功获得了以下值:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDH E_RSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ RSA_WITH_AES_128_CBC_SHA_P384、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256、TLS_RSA_WITH_AES_256_GCM_SHA384、TLS_RSA_WITH_AES_128_GCM_SHA256、TLS_RSA_WITH_AES_256_CBC_SHA256、TLS_RSA_WITH_AES_256_CBC_SHA、TLS_RSA_WITH_AES_128_CBC_SHA256、TLS_RSA_WITH_AES_128_CB C_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SH A256_P256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256,TLS_ECDHE_ECDSA_WITH_AES _128_CBC_SHA256_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256,TLS_DHE_RSA_WI TH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_RSA_WITH_RC4_128_ SHA,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_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_RC4_128_MD5,TLS_RSA_WITH_DES_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

最后一个是使用 Charles Proxy 发现的,它自动协商了 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。导致我出现这种情况的原因是,在启用 Charles Proxy(安装了模拟器证书)的情况下,连接成功,但在其他情况下则失败。添加它在协商中使用的套件即可解决问题。看起来(?)代理正在与我的 rest 服务重新协商,协商的内容受我的服务器支持,但 iOS 客户端不支持。

请注意,许多密码套件都是从 ssllabs 针对各种 iOS/OSX 设备的首选套件规范中获得的。 上述值应该与 XP 上除 IE 6 之外的所有浏览器握手根据 ssllabs 的评价,其评级为 A。

相关内容