来自Amazon S3的iOS 9应用程序下载SSL错误:TLS 1.2支持

我明白了

发生SSL错误,无法build立与服务器的安全连接。

在iOS 9上,如果我尝试从亚马逊S3下载文件: https : //s3.amazonaws.com/xyz/qer/IMG_0001.JPG

从我所了解的Amazon S3支持TLS 1.2中可以看到: https : //forums.aws.amazon.com/thread.jspa? threadID =192512

S3和Kinesis目前支持TLS 1.2。 在这里输入图像说明

“S3和Kinesis目前支持TLS 1.2。” 2015年8月23日晚9:19

不知道为什么我会得到这个SSL错误。 该帐户应configuration为利用TLS 1.2? 我会猜想,这应该是默认情况下“开”。

我不想把这个域放在信息plist上。

编辑:我结束了使用

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>s3.amazonaws.com</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

编辑2016-01-03: s3.amazonaws.com的更新证书使用SHA256algorithm并符合ATS要求。

原始答案:s3.amazonaws.com使用不符合ATS要求的SHA1authentication,导致严重故障。 根据App Transport Security Technote ,iOS9中的ATS具有以下要求:

  1. 服务器必须至less支持传输层安全性(TLS)协议版本1.2。

  2. 连接密码仅限于提供前向保密的密码,

    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

  3. 证书必须使用SHA256或更好的签名散列algorithm进行签名,并使用2048位或更大的RSA密钥或256位或更大的椭圆曲线(ECC)密钥。

无效的证书导致硬故障并且没有连接。

SSL实验室的SSL服务器testing( https://www.ssllabs.com/ssltest/analyze.html?d=s3.amazonaws.com )包含了针对iOS 9中的ATS的握手模拟,表明s3.amazonaws.com的失败。

开发SSL实验室

您需要两件事才能让iOS 9应用程序成功到达SSL端点(S3只是一个例子):

  • 正向保密( https://www.wikiwand.com/en/Forward_secrecy )在服务器上启用。

    AWS S3目前不支持此function。 解决方法是,您可以在S3存储桶前configurationAWS CloudFront服务(支持FS)。 设置起来相当简单。 如果您使用的是CORS,请记住正确的标题需要通过CloudFront代理传递。

  • SHA-256保护服务器上的SSL证书。

    一旦你通过Cloudfront获得你的文件,当点击URL( https://somethinghashed1234wasdfawer421.cloudfront.net )时,你会注意到那里的SSL证书使用SHA-1。 有多糟糕…解决scheme是用您的私有SHA-256 SSL证书来保护这一点。 为此,您需要为域中的Cloudfront端点指定CNAME。 这将允许您使用您自己的SSL证书来保护存储桶。 简单地configuration您的DNS有条目cloudfront-bucket.mydomain.com到丑陋somethinghashed1234wasdfawer421.cloudfront.net。 将您的SSL证书上传到Amazon,并在Cloudfront分配设置中设置SSL保护。 瞧!

所有提到的内容都可以从AWS控制台轻松点击(除了上传SSL证书,需要通过AWS CLI完成)。

由于S3目前并不完全兼容,所以根据AWS博客上的这篇文章,他们的官方build议是通过将这组密钥添加到您的Info.plist ,将S3从App Transport Security中排除:

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> <key>amazonaws.com.cn</key> <dict> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.0</string> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

UPDATE 10/27/15: Pol在评论中指出,尽pipe这是AWS的正式答案, 但支持论坛的一位苹果工程师表示这实际上是一个错误:

事实certificate,NSExceptionRequiresForwardSecrecy放宽SHA-2/256要求的事实是一个错误; NSExceptionRequiresForwardSecrecy的预期行为是App Transport Security Technote中logging的行为,即应该启用特定的密码套件。

我们的计划是在未来某个时候修复这个bug。 我们希望以某种兼容的方式解决这个问题,所以错误地使用NSExceptionRequiresForwardSecrecy来禁用SHA-2/256要求的人不会中断 。 但是,预测未来总是一个挑战。 这使我们知道你现在应该做什么。 [这篇文章的以前的版本提供了较less的具体build议。 下面是一个更紧凑的更新。]在与ATS Engineering讨论之后,我们的build议是:

如果您使用特定的托pipe服务,则应咨询您的托pipe服务以获取最新的build议。

在这种情况下,除了SHA-2/256证书签名要求外,服务器与ATS完全兼容,我们build议您使用NSExceptionAllowsInsecureHTTPLoads准确logging事件状态。

您应尽可能使您的服务器与ATS完全兼容。

发生这种情况时,应使用更安全的ATS设置更新您的应用程序。

我应该强调NSExceptionAllowsInsecureHTTPLoads实际上并不安全。 它与您的应用程序当前在iOS 8上运行时一样安全。相反,这意味着您的应用程序不会从ATS提供的额外安全性中受益。 分享和享受

强调我的。 请注意,目前的计划是以一种不会破坏已经使用NSExceptionRequiresForwardSecrecy来解决这个问题的人的行为的方式修复这个错误,所以上述方法仍然是一个可行的答案。

只是发布指出,与亚马逊的证书问题是他们使用SHA-1和应用程序传输安全性需要SHA-2/256。

NSExceptionRequiresForwardSecrecy的工作原理是在苹果开发论坛上logging的一个bug。 根据文档和链接线程中的苹果工程师,“更好”的解决scheme将是

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>s3.amazonaws.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> 

我非常松散地使用术语“更好”,只是意味着不能解决苹果最终会修复的错误。 现在,这只是证书问题的解决scheme:)

直到亚马逊的头部出现在这个* ss上 ,@Zsoltbuild议在你的plist文件中插入下面的键和值。

但是一定要把NSExceptionDomain设置为amazonaws.com而不是s3.amazonaws.com,这取决于你的资产是如何服务的,以及从哪个地区amazon可以为他们服务,比如这个s3-us-west-1.amazonaws.com ,所以不明确设置子域将允许从任何AWS地区标识符正确提供资产。

 <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>amazonaws.com</key> <dict> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>