amazon-web-services - 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 存储。我不确定这是否是原因,因为我也尝试过更改它的标准。
是否需要对我的配置进行任何更改才能从所有地理位置进行下载?
解决方案
问题在于在印度发起请求的机器。它的时间与它的时区不同步。该客户端上设置的时间比实际时间晚了大约一个小时。因此,当生成过期时间戳时,它总是落后于实际时间。在客户端确定时间后,问题得到解决。
推荐阅读
- flutter - Gridview.builder 不通过 setState() 更新
- flutter - 如何创建通用 Dart 库?
- c# - JObject SelectToken 解析路径索引器时出现意外字符
- python - RankFM 如何在 AIplatform 上加速
- python - 如何将数组列表和一个数组中的每个元素合并到numpy中的元组列表中
- kubernetes - 如何创建一个使用 PVC 成功挂载的容器/pod,其中存储类是使用特定 UID 创建的
- javascript - React hooks window.scrollTo(0, 0) 在溢出自动时不起作用
- json - 根据用户输入更改拉取的网站链接的代码
- c++ - qthread读写速度这么慢
- vue.js - 如何在子标签的 v-for 值中使用从 prent 标签的 v-for 生成的索引变量