来自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具有以下要求:
服务器必须至less支持传输层安全性(TLS)协议版本1.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
证书必须使用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的失败。
您需要两件事才能让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>
- Swift 2在协议扩展中使用变异函数的错误“不能在不可变的值上使用变异成员:'self'是不可变的
- 在Xcode UItesting的testing案例中延迟/等待
- Facebook共享内容仅在iOS 9中共享URL
- 以编程方式在UIStackView中添加视图
- Xcode 7.2:在“存档”中:解决问题:找不到“Cordova / CDVViewController.h”文件。 虽然在构build应用程序时没有这样的问题
- 在iOS 9 Safari上打开Bootstrap模式时,屏幕会放大
- iOS 9新function免费configuration(在设备上运行您的应用程序,只需使用您的Apple ID,不需要Apple开发人员)
- 传输安全已经阻止了明文HTTP
- 在iOS 9中可以滑动的表格视图单元格