Cloudfront возвращает 403 из другого места
У меня есть объекты корзины S3, которые мои пользователи могут загружать через мое приложение. Я использую Cloudfront для CDN с подписанными URL-адресами. В США все работает, как ожидалось, но когда мои пользователи в другой стране (Индия) пытаются загрузить те же объекты, они получают сообщение об ошибке
The remote server returned an error : (403) Forbidden
Я подтвердил, что не наложил никаких географических ограничений в дистрибутивах CloudFront
Мое исходное имя и путь к домену, настроенные в CloudFront, имеют формат
xyz-final-bucket.s3.us-west-2.amazonaws.com
Ниже приведен код, который генерирует подписанные URL-адреса для CloudFront:
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. Я не уверен, является ли это причиной, потому что я также пытался изменить его стандарт.
Требуются ли какие-либо изменения в моей конфигурации, чтобы разрешить загрузку из всех географических местоположений?
1 ответ
Проблема была в машине, которая инициировала запрос в Индии. Время не было синхронизировано с часовым поясом. Время, установленное для этого клиента, примерно на час отставало от фактического времени. Таким образом, когда генерировалась временная метка истечения срока, она всегда отставала от фактического времени. После установки времени на клиенте проблема решена.