2013-10-09 17 views
13

AmazonのS3のREST APIを使用して、Androidデバイスから私が所有するバケットにファイルをアップロードしています。私はKEYとSECRET_KEYを持っていますが、リクエストで探しているsignatureValueを正しく生成する方法がわかりません。私は自分のサーバーにHttpPutを使っていますが、signatureValueを正しく生成する方法がわかりません。これまでのところ、ここで私が持っているものです。ここに続いてSDKを使用せずにAndroidからAmazon S3にファイルをアップロードする方法

HttpPut put = new HttpPut(URL); 

      String fmt = "EEE, dd MMM yyyy HH:mm:ss "; 
      SimpleDateFormat format = new SimpleDateFormat(fmt, Locale.US); 
      format.setTimeZone(TimeZone.getTimeZone("GMT")); 

      String method = "PUT"; 
      String contentType = "application/octet-stream"; 
      String date = format.format(new Date()) + "GMT"; 
      String bucket = "/test-bucket52809/"; 

      StringBuffer buf = new StringBuffer(); 
      buf.append(method).append("\n\n"); 
      buf.append(contentType).append("\n"); 
      buf.append(date).append("\n"); 
      buf.append(bucket); 

      String signature = percentEncodeRfc3986(hmac(buf.toString())); 

は私が署名値を生成するために使用するメソッドです:

private void setupMac() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException 
    { 

     byte[] secretyKeyBytes = KEY_SECRET.getBytes("UTF-8"); 
     signingKey = new SecretKeySpec(secretyKeyBytes, "HmacSHA256"); 
     mac = Mac.getInstance("HmacSHA256"); 
     mac.init(signingKey); 
    } 

    private String hmac(String stringToSign) { 
     String signature = null; 
     byte[] data; 
     byte[] rawHmac; 
     try { 
      data = stringToSign.getBytes("UTF-8"); 
      rawHmac = mac.doFinal(data); 
      signature = new String(Base64.encode(rawHmac, Base64.DEFAULT)); 
     } catch (UnsupportedEncodingException e) { 
      throw new RuntimeException("UTF-8" + " is unsupported!", e); 
     } 
     return signature; 
    } 

    private String percentEncodeRfc3986(String s) { 
     String out; 
     try { 
      out = URLEncoder.encode(s, "UTF-8").replace("+", "%20") 
        .replace("*", "%2A").replace("%7E", "~"); 
     } catch (UnsupportedEncodingException e) { 
      out = s; 
     } 
     return out; 
    } 

私は、Amazon S3署名テスターを使用し、私の文字列が正しいでしたが、私正しいエンコードされた値を得られませんでした。助けや正しい方向へのプッシュをありがとう。

+0

同じことをAWS Java SDKソースから見ていきます。 http://github.com/aws/aws-sdk-javaで簡単に見つけられるはずです。 – jarmod

+0

SDKを使用してみませんか?これには、署名などを処理するためのボイラープレートコードが多数含まれているため、これらの低レベルの詳細を処理することはありません –

+0

これには解決策がありますか? SDKなしでS3にアップロードしようとしています。 – dannyroa

答えて

2
import sun.misc.BASE64Encoder; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

String policy = (new BASE64Encoder()).encode(
    policy_document.getBytes("UTF-8")).replaceAll("\n","").replaceAll("\r",""); 

Mac hmac = Mac.getInstance("HmacSHA1"); 
hmac.init(new SecretKeySpec(
    aws_secret_key.getBytes("UTF-8"), "HmacSHA1")); 
String signature = (new BASE64Encoder()).encode(
    hmac.doFinal(policy.getBytes("UTF-8"))) 
    .replaceAll("\n", ""); 

[参照:https://aws.amazon.com/articles/1434]

また、上記のリンクは、HTTPリクエストに入力parameteresが記載されています。

1

httpヘッダー( "x-amz-date"ヘッダーを設定していますか?)で予想され、送信されたものと一致するかどうかを再確認します。

また、S3からエラーメッセージを追加すると、何が間違っているのかを理解して助けになるでしょう。

関連する問題