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

从Amazon S3下载iOS 9应用程序SSL错误:TLS 1.2支持,ssl,ios9,tls1.2,Ssl,Ios9,Tls1.2,我明白了 发生SSL错误,无法与服务器建立安全连接 被制造出来 在iOS 9上,如果我尝试从amazon s3下载文件: 据我所知,AmazonS3支持TLS1.2 见: S3和Kinesis此时支持TLS 1.2 “此时S3和运动支持TLS 1.2。”2015年8月23日晚上9:19 不确定为什么会出现这个SSL错误。应将帐户配置为利用TLS 1.2? 我猜这应该是默认的“开” 我不想把这个域名放在信息列表上 编辑: 我最终使用了 <key>NSAppTransportSecur

我明白了

发生SSL错误,无法与服务器建立安全连接 被制造出来

在iOS 9上,如果我尝试从amazon s3下载文件:

据我所知,AmazonS3支持TLS1.2 见:

S3和Kinesis此时支持TLS 1.2

“此时S3和运动支持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>
NSAppTransportSecurity
NSExceptionDomains
s3.amazonaws.com
NSExceptionRequiresForwardSecretary
n包括多个域

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

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

  • 服务器必须至少支持传输层安全(TLS)协议版本1.2

  • 连接密码仅限于提供前向保密的密码,即

    TLS_ECDHE_ECDSA_与_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_与_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_与_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_与_AES_256_CBC_SHA TLS_ECDHE_ECDSA_与_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_与_AES_128_CBC_SHA TLS_ECDHE_RSA_与_AES_256_GCM_SHA384 TLS_ECDHE_RSA_与_AES_128_GCM_SHA256 TLS_ECDHE_RSA_与_AES_256_CBC_SHA384 TLS_ECDHE_RSA_与_AES_128_CBC_SHA256 TLS_ECDHE_RSA_与_AES_128_CBC_SHA

  • 证书必须使用SHA256或更好的签名哈希算法进行签名,使用2048位或更高的RSA密钥或256位或更高的椭圆曲线(ECC)密钥。

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

    SSL实验室的SSL服务器测试()包括iOS 9中ATS的握手模拟,表明s3.amazonaws.com出现故障


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

    • 服务器上已启用前向保密()

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

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

      一旦您的文件通过Cloudfront可用,当点击URL()时,您会注意到那边的SSL证书使用SHA-1。真糟糕。。。 解决方案是使用您的私有SHA-256 SSL证书来保护此功能。为此,您需要为域中的Cloudfront端点指定CNAME。这将允许您使用自己的SSL证书保护bucket。只需将您的DNS配置为具有指向cloudfront-bucket.mydomain.com的条目,指向丑陋的东西hashed1234wasdfawer421.cloudfront.net。将SSL证书上载到amazon,并在Cloudfront分发设置中设置SSL保护。瞧


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

    根据AWS博客上的说法,由于S3目前不完全兼容,他们的官方建议是通过将这组密钥添加到您的
    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>
    
    NSAppTransportSecurity
    NSExceptionDomains
    亚马逊网站
    第三方例外最小版本
    TLSv1.0
    N第三方例外要求转发保密
    n包括多个域
    亚马逊网站
    第三方例外最小版本
    TLSv1.0
    N第三方例外要求转发保密
    n包括多个域
    

    2015年10月27日更新:正如Pol在评论中指出的那样,尽管这是AWS的官方答案,但一位苹果工程师表示这实际上是一个bug:

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

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

    如果你正在使用一个特定的托管服务,你应该咨询你的托管服务,以获得最新的建议

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

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

    那是什么时候
    <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>
    
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>amazonaws.com</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>