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

Posted

技术标签:

【中文标题】从 Amazon S3 SSL 错误下载 iOS 9 应用程序:TLS 1.2 支持【英文标题】:iOS 9 app download from Amazon S3 SSL error: TLS 1.2 support 【发布时间】:2015-12-06 16:02:28 【问题描述】:

我明白了

发生 SSL 错误,无法与服务器建立安全连接 制作。

如果我尝试从 amazon s3 下载文件,则在 ios 9 上: 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 错误。该帐户应配置为利用 TLS 1.2? 我猜这应该默认是“开启”的。

我不想将此域放在信息列表中。

编辑: 我最终使用了

<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>

【问题讨论】:

将这些键和字典值添加到我的 plist 使此错误消息消失... 对。这已在mobile.awsblog.com/post/Tx2QM69ZE6BGTYX/… 中进行了概述,这是一种将东西扫到地毯下的好方法。我真的希望亚马逊在不需要开发人员为他们编写异常的情况下解决这个问题 一位长期且备受尊敬的 Apple 工程师在 forums.developer.apple.com/thread/13472 上表示,不应使用 NSExceptionRequiresForwardSecrecy 来解决此问题:“事实证明,NSExceptionRequiresForwardSecrecy 放松了 SHA- 2/256 要求是一个错误”。请改用NSExceptionAllowsInsecureHTTPLoads 【参考方案1】:

2016-01-03 编辑: s3.amazonaws.com 的续订证书使用 SHA256 算法并符合 ATS 要求。

原答案:s3.amazonaws.com 使用的 SHA1 证书不符合 ATS 要求,导致硬故障。根据App Transport Security Technote,iOS9 中的 ATS 有以下要求:

    服务器必须至少支持传输层安全 (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 或更好的签名哈希算法进行签名,使用 2048 位或更大的 RSA 密钥或 256 位或更大的椭圆曲线 (ECC) 密钥。

无效的证书会导致硬故障和无连接。

SSL Labs 的 SSL 服务器测试 (https://www.ssllabs.com/ssltest/analyze.html?d=s3.amazonaws.com) 包括针对 iOS 9 中的 ATS 的握手模拟,表明 s3.amazonaws.com 失败。

【讨论】:

It appears 亚马逊已经更新了他们的证书。 谢谢!更新答案以表明此更改【参考方案2】:

要让 iOS 9 应用成功到达 SSL 端点,您需要做两件事(S3 只是一个示例):

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

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

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

一旦您通过 Cloudfront 获得文件,当您点击 URL (https://somethinghashed1234wasdfawer421.cloudfront.net) 时,您会注意到那里的 SSL 证书使用 SHA-1。多么糟糕... 解决方案是使用您的私有 SHA-256 SSL 证书来保护它。为此,您需要为域中的 Cloudfront 端点指定 CNAME。这将允许您使用自己的 SSL 证书保护存储桶。只需将您的 DNS 配置为让入口指向 cloudfront-bucket.mydomain.com 到那个丑陋的东西 hashed1234wasdfawer421.cloudfront.net。将您的 SSL 证书上传到亚马逊并在 Cloudfront 分发设置中设置 SSL 保护。瞧!

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

【讨论】:

S3 不支持前向保密的来源是什么?我找不到任何明显的东西。 想不出任何来源,我已经用我的一个 SSL 调试工具(nmap、openssl 客户端或一些在线浏览器应用程序)验证了这一点。 这是一般 AWS S3 实例的问题,还是在这些服务器上运行的特定服务器的问题? (我正在运行我自己的自定义服务器)。【参考方案3】:

由于 S3 目前不完全合规,根据 AWS 博客上的 this post,他们的官方建议是通过将这组密钥添加到您的 Info.plist,将 S3 从应用程序传输安全中排除:

<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>

2015 年 10 月 27 日更新: 正如 Pol 在 cmets 中指出的那样,即使这是来自 AWS 的官方回答,the support forums 的 Apple 工程师表示这实际上是一个错误:

事实证明,NSExceptionRequiresForwardSecrecy 放宽了 SHA-2/256 要求这一事实是一个错误; NSExceptionRequiresForwardSecrecy 的预期行为是应用程序传输安全技术说明中记录的行为,即它应该只启用特定的密码套件。

我们的计划是在未来某个时候修复此错误。我们希望以某种兼容的方式解决此问题,因此错误地使用 NSExceptionRequiresForwardSecrecy 禁用 SHA-2/256 要求的人不会破坏。然而,预测未来始终是一个挑战。 这让我们想到了你现在应该做的事情。 [这篇文章的前一个版本给出了不太具体的建议。以下是一个使事情变得更加紧凑的更新。] 在与 ATS Engineering 讨论后,我们的建议是:

如果您使用特定的托管服务,您应该咨询您的托管服务以获得最新建议。

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

您应该尽快尝试使您的服务器与 ATS 完全兼容。

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

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

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

【讨论】:

这对我有用,我使用的是最新的 AWS SDK v2.2.6,您可能需要更新您的 SDK。 一位长期且备受尊敬的 Apple 工程师在 forums.developer.apple.com/thread/13472 上表示,不应使用 NSExceptionRequiresForwardSecrecy 来解决此问题:“事实证明,NSExceptionRequiresForwardSecrecy 放松了 SHA- 2/256 要求是一个错误”。请改用NSExceptionAllowsInsecureHTTPLoads【参考方案4】:

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

NSExceptionRequiresForwardSecrecy 起作用的事实是apple dev forums 记录的一个错误。根据链接线程中的文档和 Apple 工程师,“更好”的解决方案将是

<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>

我非常宽松地使用“更好”一词,仅表示一种解决方案,该解决方案不涉及 Apple 最终会修复的错误。现在这只是针对证书问题的修复:)

【讨论】:

当我第一次尝试这个解决方案时,它对我不起作用,然后我注意到 S3 URL 略有不同。尝试使用 amazonaws.com(不带 s3)而不是 s3.amazonaws.com。这对我有用。 @Vladan:按照您的描述更改网址对我不起作用。【参考方案5】:

直到亚马逊在这个问题上摆脱他们的 *ss,正如@Zsolt 建议的那样,在您的 plist 文件中插入以下键和值。

但请务必将 NSExceptionDomain 设置为 amazonaws.com 而不是 s3.amazonaws.com, 这取决于您的资产的服务方式以及亚马逊可以从哪个区域为它们提供服务,例如 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>

【讨论】:

以上是关于从 Amazon S3 SSL 错误下载 iOS 9 应用程序:TLS 1.2 支持的主要内容,如果未能解决你的问题,请参考以下文章

WinHttp 不会从 WinXP 上的 Amazon S3 下载

如何为 Amazon S3 存储桶配置 SSL

无法从 Amazon S3 下载具有特殊字符的文件

ios amazon s3 上传视频文件

Amazon S3 - HTTPS/SSL - 有可能吗? [关闭]

Amazon S3 分段上传期间的 javax.net.ssl.SSLException