如何configurationIIS 7.5 SSL \ TLS以使用iOS 9 ATS

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

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

服务器设置: Windows Server 2008 R2 SP1(VM)IIS 7.5,来自digicert的SSL证书。 Windows防火墙closures。

密钥RSA 2048位(e 65537)

发行商DigiCert SHA2安全服务器CA

签名algorithmSHA512withRSA

这些是应用程序传输安全性要求:

服务器必须至less支持传输层安全(TLS)协议版本1.2。 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表)。必须使用SHA256或更好的签名散列algorithm对证书进行签名,并使用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”和自定义设置。 甚至尝试修改encryption套件,只是上面的列表,并重新sorting。 每次尝试后,服务器都会重新启动,并且运行SSL Labs (清除caching后)。 我从F级到A级,甚至A-级都成功了,但这只能导致iOS 8和9无法build立安全连接。 (NSURLErrorDomain代码= -1200和_kCFStreamErrorCodeKey = -9806) 在这里输入图像描述
  3. 恢复虚拟机,并尝试了一个PowerShell脚本设置您的IIS SSL完美转发保密和TLS 1.2我甚至做了第二次尝试,我从电源脚本编辑出cyphers到最小的需求清单。

结果:总是相似的,评分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 

前三个数据包是build立TCP连接的经典的SYN-SYN-ACK-ACK三次握手。 第四个数据包是iOS向您的服务器发送TLS客户端Hello消息,这是通过该TCP连接build立TLS连接的第一步。 我已经拉开了这个消息,它看起来足够合理。 在第五个数据包中,服务器只是断开连接(通过发送RST)。

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

    问题是古老的,但在search过程中会发现。 我花了一些时间来解决同样的问题。 因此,我决定写回答与其他人分享我的结果。

    简短的回答:你不应该使用IISencryption来指定密码套件的顺序。 我build议您单击“默认”button以删除先前设置的顺序,然后使用组策略(“计算机configuration”\“pipe理模板”\“networking”\“SSLconfiguration设置”)通过本地策略configuration密码套件。

    “协议或密码套件不匹配”错误的原因可以从下面的一个

    • 你的服务器支持一些“坏密码套件”
    • 你的服务器不支持一些密码套件,它必须支持对应于TLS规范。
    • 你的服务器支持HTTP / 2,并且它有一些在其他协议之上的黑名单中的协议,它们不在列表中 。 通常改变密码套件的顺序来解决问题已经足够了。

    确切的黑名单可能在不同的系统上有所不同。 你可以在网上find一些黑名单。 例如,RFC 7540(超文本传输​​协议版本2(HTTP / 2))的附录A包含一个列表。 对于TLS 1.2(参见这里 ),密码套件是TLS_RSA_WITH_AES_128_CBC_SHA (请参见此处 ), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (参见此处 )。 TLS_ECDHE_ECDSA_*只有在使用椭圆曲线证书时才重要。 其他非常好的密码套件TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256尚未由Microsoft实施。 另外,如果您需要支持IE 8 / XP,您可以考虑添加至lessTLS_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 。 因此,您可以使用今天,例如

     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上的一个configuration示例。我configuration了IIS 10,使Qualys SSL Labs能够使用Let's Encrypt的RSA 2048密钥和免费SSL证书进行A +评级

    在这里输入图像描述

    I禁用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 168/168,NULL, MD5,多协议统一Hello,PCT 1.0,SSL 2.0,SSL 3.0和TLS 1.0 / 1.1 在registry中 (请参阅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可以使用。

    最重要的一步,这是我的时间,这是你的主要问题是configuration密码套件。 我使用gpedit.msc 。 我select了“计算机configuration”\“pipe理模板”\“networking\”\“SSLconfiguration设置\”,并将“SSL密码套件顺序”值configuration为以下

     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

    上述顺序可能不是最佳的,我不能确定,所有上述协议都支持IIS 7.5(我使用Windows 10的IIS 10.0)。 不过,我相信你的问题与密码套件的列表有关,因为我在你的密码套件列表的实验中遇到了和你一样的问题。

    在任何情况下,在Group Polity中configuration上述设置并重新启动计算机后gpupdate /force /target:computer在我的testing中是不够的),我会得到A +等级以及“Handshake Simulation”部分的testing结果列表:

    在这里输入图像描述 在这里输入图像描述 在这里输入图像描述 在这里输入图像描述

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

     Safari 6 / iOS 6.0.1 Safari 7 / iOS 7.1 Safari 8 / iOS 8.4 Safari 9 / iOS 9 

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

    如果您的IIS Crypto映像最近保持原样,但启用SHA,Diffie-Hellman和PKCS。 这会给你一个评分,但允许iOS 8和更低的连接。

    我为此奋斗了几天。 特别是我使用Xamarin Forms PCL从iOS应用程序连接到OAuth2承载令牌authentication的ASP.NET Web Api 2rest服务。

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

     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_ECDHE_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_CBC_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_ SHA256_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_WITH_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(安装模拟器证书)上成功,但失败,否则。 添加它在谈判中使用的套件有诀窍。 它似乎(?)代理正在与我的服务器,而不是iOS客户端支持我的rest服务重新谈判。

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