微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cloudfront从其他位置返回403

如何解决Cloudfront从其他位置返回403

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

我确认我没有在CloudFront发行版中设置任何地理限制

enter image description here

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

下面是为CloudFront生成Signed-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中。我不确定这是否是原因,因为我也尝试过更改它的标准。

我的配置是否需要进行任何更改以启用从所有地理位置的下载?

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。