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

Zso*_*olt 42 ssl ios9 tls1.2

我明白了

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

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

据我所知,亚马逊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>
Run Code Online (Sandbox Code Playgroud)

Ana*_*hat 39

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

原始答案:s3.amazonaws.com使用不符合ATS要求的SHA1证书,导致硬故障.根据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实验室


mie*_*ciu 12

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

  • 在服务器上启用了Forward Secrecy(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即可查看丑陋的内容1234wasdfawer421.cloudfront.net.将您的SSL证书上传到amazon并在Cloudfront分发设置中设置SSL保护.瞧!

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


mar*_*ada 11

S3是目前不完全符合,按照这个帖子在AWS的博客,他们的官方建议是,加入该组按键到你排除从应用传输安全S3 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>
Run Code Online (Sandbox Code Playgroud)

2015年10月27日更新:正如Pol在评论中指出的那样,即使这是AWS的官方回答,支持论坛中的Apple工程师也说这实际上是一个错误:

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

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

如果您使用的是特定的托管服务,则应咨询您的托管服务以获取最新的建议.

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

您应该尽快使服务器与ATS完全兼容.

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

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

强调我的.请注意,当前的计划是以不会破坏过去NSExceptionRequiresForwardSecrecy解决此问题的人的行为来修复错误,因此上述内容仍然是可行的答案.


tme*_*enh 6

只是张贴指出亚马逊证书的问题是他们使用SHA-1和app传输安全性需要SHA-2/256.

NSExceptionRequiresForwardSecrecy工作的事实是apple dev论坛中记录的错误.根据文档和链接线程中的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>
Run Code Online (Sandbox Code Playgroud)

我非常宽松地使用"更好"这个术语,并且只是意味着一个解决方案不能解决Apple最终会修复的错误.现在这只是证书问题的修复:)