42

我明白了

发生 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?我猜想默认情况下这应该是“开启”的。

我不想将此域放在信息 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>
4

5 回答 5

39

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

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

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

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

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

开发 SSL 实验室

于 2015-09-10T22:08:29.353 回答
12

您需要两件事才能让 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 完成)。

于 2015-09-17T09:34:07.500 回答
11

由于 S3 目前不完全兼容,根据AWS 博客上的这篇文章,他们的官方建议是通过将这组密钥添加到您Info.plist:

<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 在评论中指出的那样,尽管这是 AWS 的官方回答,但支持论坛中的一位 Apple 工程师表示这实际上是一个错误:

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

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

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

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

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

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

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

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

于 2015-09-18T20:23:32.223 回答
6

只是张贴指出亚马逊证书的问题是他们使用 SHA-1 并且应用程序传输安全需要 SHA-2/256。

NSExceptionRequiresForwardSecrecy 起作用的事实是苹果开发论坛上记录的一个错误。根据链接线程中的文档和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 最终将修复的错误的解决方案。现在这只是证书问题的修复:)

于 2015-09-25T22:40:14.277 回答
1

直到亚马逊从他们的 *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>
于 2015-10-27T03:25:58.813 回答