2015-01-10 2 views
1

편집 2 : 제출 한 awskeyid를 삭제했습니다. 이제 s3이 x-amz-signature 필드를 허용하지만 이제는 다음과 같은 오류가 나타납니다 : 우리가 계산 한 요청 서명이 일치하지 않습니다. 당신이 제공 한 서명. 귀하의 키와 서명 방법을 확인하십시오.v3을 사용하여 s3에 업로드 양식 파일을 만듭니다.

그래서 나는 잘못된 서명, 잘못된 아이디어를 계산합니다.

편집 : 내가 찾은 documnation에 따라 코드를 편집했는데 서명의 정확성을 계산하는 것 같지만 여전히 "signature"라는 필드에 양식을 넣을 때 작동하지 않습니다. 다시이 메커니즘은 isoorted 및 새 하나를 사용해야하지만 x-amz 서명 시그니처 필드의 이름을 변경할 경우 "시그니처"라는 필드가 없다는 오류가 다시

나는 브라우저에서 amazon s3으로 직접 파일을 업로드하는 작업 양식으로, 이전 버젼의 정책 서명을 지원하는 프랑크푸르트 지역으로 버킷을 전환했습니다.

은 그래서 난 내 양식과 만든 정책을 편집 할 triued하지만 뉴 운 어떤 도움이 내 정책

을 이해할 수있을 것이다 :

$policy = json_encode(array(
      'expiration' => date('Y-m-d\TG:i:s\Z', strtotime('+6 hours')), 
      'conditions' => array(
        array(
          'bucket' => $data['bucket'] 
        ), 
        array(
          'acl' => 'private' 
        ), 
        array(
          'starts-with', 
          '$key', 
          'Zips/Uploads' 
        ), 
        array(
          'content-length-range', 0, 500000000 
        ), 
        array(
          "x-amz-algorithm"=> "AWS4-HMAC-SHA256" 
        ), 
        array (
          "x-amz-credential"=> AMAZON_KEY."/20160111/eu-central-1/s3/aws4_request" 
        ), 
        array(
          "x-amz-date"=> "20151101T000000Z" 
        ), 

       ) 

    )); 

    $data['base64Policy'] = base64_encode($policy); 
    $signing_key1 = hash_hmac('sha256', "AWS4" .AMAZON_SECRET_KEY , "20151101", true); 
    $signing_key2 = hash_hmac('sha256', $signing_key1, AMAZON_REGION,true); 
    $signing_key3 = hash_hmac('sha256', $signing_key2, "s3",true); 
    $signing_key4 = hash_hmac('sha256', $signing_key3, "aws4_request",true);x 
    $data['signature'] = base64_encode(hash_hmac('sha256',$signing_key4, $data['base64Policy'],true)); 

이이 난 모양이다

: 아마존에서 오류를 가져 오는이 양식 메신저를 사용

<form class="startfileupload" action="//s3.eu-central-1.amazonaws.com/<?php echo $bucket; ?>/" method="post" enctype="multipart/form-data"> 
<input type="hidden" name="key" value="${filename}" /><br /> 
<input type="hidden" name="acl" value="private" /> 
<input type="hidden" name="X-amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
<input type="hidden" name="X-Amz-Credential" value="<?php echo $accesskey; ?>/20160111/eu-central-1/s3/aws4_request" /> 
<input type="hidden" name="X-Amz-Date" value="20151101T000000Z" /> 
<input type="hidden" name="policy" value="<?php echo $base64Policy; ?>"> 
<input type="hidden" name="X-Amz-Signature" value="<?php echo $signature; ?>"> 
<input type="file" name="file" /> <br /> 

사용3210

InvalidRequest 제공 한 인증 메커니즘이 지원되지 않습니다. AWS4-HMAC-SHA256을 사용하십시오.

무엇이 잘못 되었나요? 나는 문서 작성 및 예제를 작성하려고했지만 실제로는 그렇지가 않았다.

xx!

+0

S3 :

선택적으로
s3Client.setEndpoint(endpoint); 

것은 또한이를 추가 유용 할 수 있습니다를 Signature v2에서 Signature v4로 조금 이동 했으므로 요청을 서명하는 코드를 업데이트해야합니다. 공식 SDK를 사용하고 있습니까? 그들은 당신을 위해이 모든 것을 처리합니다. –

+0

이 질문은 V2 용으로 작성된 코드 스 니펫에 관한 것이므로 주제가 아닌 것 같습니다. 이는 'POST'업로드의 V4 인증에 대한 문서화 된 요구 사항을 충족시키기 위해 상당한 재 작성이 필요합니다. http://docs.aws. 아마존.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html –

+0

aws에 대한 공식 및 laravel sdk를 모두 받았지만 문서를 읽었지만 내 정책을 만드는 방법을 이해하는 것이 매우 어려웠습니다. –

답변

0

answer (Java 버전)에 따르면 : 나는 (코멘트에서 언급 된 그 중 하나)이 개 빠진 부분의 조합이었다 해답을 발견했습니다 도움을 사용하여

:

1)이 설정해야합니다

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, 

)이 "true";

2) 업로드 또는 다운로드 할 필요가 없습니다했다 "엔드 포인트"() 설정해야합니다

s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true)); 
관련 문제