S3 REST API에 대한 HEAD 개체 요청을 시도하지만 S3에 필요한 권한이있는 정책 설정이 있어도 계속 403 금지됨 오류가 발생합니다. 응답 본문은 비어 있으므로 서명 문제는 아닙니다. 정책에 대한 몇 가지 변경 사항을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 개체를 PUT하고 개체를 정상적으로 삭제할 수 있습니다. 머리글 만 작동하지 않습니다.S3 REST API HEAD 요청에 403 금지 된 오류
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:: 999999999999:user/User"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:user/User"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
어떤 아이디어 :
여기 내 버킷 정책입니까?
는업데이트 : 마이클 지적
는 임 무엇을보고 실패하지만, 내 서명에 문제가 될 것으로 보인다. 서명
def generate_url options={}
options[:action] = options[:action].to_s.upcase
options[:expires] ||= Time.now.to_i + 100
file_path = "/" + @bucket_name + "/" + options[:file_name]
string_to_sign = ""
string_to_sign += options[:action]
string_to_sign += "\n\n#{options[:mime_type]}\n"
string_to_sign += options[:expires].to_s
string_to_sign += "\n"
string_to_sign += file_path
signature = CGI::escape(
Base64.strict_encode64(
OpenSSL::HMAC.digest('sha1', SECRET_KEY, string_to_sign)
)
)
url = "https://s3.amazonaws.com"
url += file_path
url += "?AWSAccessKeyId=#{ACCESS_KEY}"
url += "&Expires=#{options[:expires]}"
url += "&Signature=#{signature}"
url
end
생성 된 문자열은 다음과 같습니다
이HEAD\n\n\n1418590715\n/video-thumbnails/1234.jpg"
해결 방법 : 실제로 GET 및 HEAD를 파괴 한 파일 PUT 부분을 개발하는 동안
그것은 어떤 점에서 같다. 빈 문자열을 요청의 본문으로 전달하는 대신 아무 것도 전달하지 않고 MIME 형식을 제공하지 않으므로 서명에 필요한 MIME 형식을 만들고 깨뜨린 것입니다. 간단히 빈 요청 본문을 제거하고 완벽하게 작동했습니다. 잘못된 방향으로 나를 지적 해 주신 Michael에게 감사드립니다. (나는 버킷 정책을 변경하는 데 너무 많은 시간을 낭비했습니다.)
그래서 똑같은 코드가 'GET' 요청에는 서명하지만 동일한 객체에 대한'HEAD' 요청에는 서명하지 않습니다. 내가 "비디오 - 축소판 그림"버킷, 버킷입니다 1234.jpg 키이며 미국 표준 (우리 - 동쪽 -1) 버킷이 위치한 지역입니까? –
수정. 내가 쿼리 기반 인증을 사용하여, 그 HEAD 요청에 대한 작동합니까? – Marcello