16

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

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 署名テスターを使用したところ、文字列は正しかったのですが、正しいエンコード値が得られませんでした。助けてくれてありがとう、または正しい方向へのプッシュ。

4

2 に答える 2

1

日付が予想され、http ヘッダーで送信されたものと一致することを再確認します (「x-amz-date」ヘッダーを設定していますか?)、リクエストに「手動で」署名するときに頭痛の種になりました。

また、S3 からのエラー メッセージを追加すると、何が問題なのかを理解しやすくなり、役立つ場合があります。

于 2014-04-08T14:47:59.643 に答える