首页 > 解决方案 > Cloudfront 从不同位置返回 403

问题描述

我有一个 S3 存储桶托管对象,我的用户可以通过我的应用程序下载这些对象。我正在将 Cloudfront 用于带有签名 URL 的 CDN。在美国一切正常,但是当我在另一个国家(印度)的用户尝试下载相同的对象时,他们会收到一条错误消息 The remote server returned an error : (403) Forbidden

我确认我没有在 CloudFront 分配中设置任何地理限制 在此处输入图像描述

CloudFront 中配置的我的源名称和域路径的格式为xyz-final-bucket.s3.us-west-2.amazonaws.com

下面是为 CloudFront 生成签名 URL 的代码:

    Public Shared Function CreateCannedSignedURL(ByVal urlString As String, ByVal durationUnits As String, ByVal durationNumber As String, ByVal CannedPolicy As String, ByVal privateKey As String, ByVal privateKeyId As String) As String
        Dim timeSpanInterval As TimeSpan = GetDuration(durationUnits, durationNumber)
        Dim strPolicy As String = CreatePolicyStatement(CannedPolicy, urlString, DateTime.Now, DateTime.Now.Add(timeSpanInterval), "0.0.0.0/0")
        If "Error!" = strPolicy Then Return "Invalid time frame.  Start time cannot be greater than end time."
        Dim strExpiration As String = CopyExpirationTimeFromPolicy(strPolicy)
        Dim bufferPolicy As Byte() = Encoding.ASCII.GetBytes(strPolicy)

        Using cryptoSHA1 As SHA1CryptoServiceProvider = New SHA1CryptoServiceProvider()
            bufferPolicy = cryptoSHA1.ComputeHash(bufferPolicy)
            Dim providerRSA As RSACryptoServiceProvider = New RSACryptoServiceProvider()
            Dim xmlPrivateKey As XmlDocument = New XmlDocument()

            Dim pemText As String

            pemText = privateKey

            Dim xmlContent = RsaKeyConverterHelper.PemToXml(pemText)
            xmlPrivateKey.LoadXml(xmlContent)
            providerRSA.FromXmlString(xmlPrivateKey.InnerXml)
            Dim rsaFormatter As RSAPKCS1SignatureFormatter = New RSAPKCS1SignatureFormatter(providerRSA)
            rsaFormatter.SetHashAlgorithm("SHA1")
            Dim signedPolicyHash As Byte() = rsaFormatter.CreateSignature(bufferPolicy)
            Dim strSignedPolicy As String = ToUrlSafeBase64String(signedPolicyHash)
            Dim downloadLink As String = urlString & "?Expires=" & strExpiration & "&Signature=" & strSignedPolicy & "&Key-Pair-Id=" & privateKeyId
            Return downloadLink
        End Using
    End Function

我存储桶中的所有对象都使用 One-Zone IA 存储。我不确定这是否是原因,因为我也尝试过更改它的标准。

是否需要对我的配置进行任何更改才能从所有地理位置进行下载?

标签: amazon-web-servicesamazon-cloudfrontsigned-url

解决方案


问题在于在印度发起请求的机器。它的时间与它的时区不同步。该客户端上设置的时间比实际时间晚了大约一个小时。因此,当生成过期时间戳时,它总是落后于实际时间。在客户端确定时间后,问题得到解决。


推荐阅读