署名付きURLを使用してファイルをS3にPUT

digitaljoel:

私はAmazon S3の署名済みURLで一晩中ファイルをPUTしようとしていました。署名済みURLをJavaコードで生成します。

    AWSCredentials credentials = new BasicAWSCredentials( accessKey, secretKey );
    client = new AmazonS3Client( credentials );
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest( bucketName, "myfilename", HttpMethod.PUT);
    request.setExpiration( new Date( System.currentTimeMillis() + (120 * 60 * 1000) ));
    return client.generatePresignedUrl( request ).toString();

次に、生成された署名済みURLを使用して、curlを使用してファイルをPUTします。

curl -v -H "content-type:image/jpg" -T mypicture.jpg https://mybucket.s3.amazonaws.com/myfilename?Expires=1334126943&AWSAccessKeyId=<accessKey>&Signature=<generatedSignature>

GETのように、これはパブリックではないバケットで機能すると想定していました(それが署名済みのポイントですよね?)さて、すべての試行でアクセスが拒否されました。最後にフラストレーションから私はバケットのアクセス許可を変更して、全員が書き込みできるようにしました。もちろん、署名済みURLは機能しました。私はすぐにEVERYONE権限をバケットから削除しました。現在、自分の自己署名付きURLによってバケットにアップロードされたアイテムを削除する権限がありません。私は今見る私はおそらく私がアップロードものにX-AMZ-aclのヘッダーを入れている必要があること。これを正しく行う前に、削除できないオブジェクトをさらにいくつか作成するのではないかと思います。

これはいくつかの質問につながります:

  • PUTと生成された署名済みURLを使用してcurlでアップロードするにはどうすればよいですか?
  • アップロードしたファイルとそれをテストするために作成したバケットを削除するにはどうすればよいですか?

最終目標は、携帯電話がこの署名済みURLを使用して画像をPUTすることです。私はそれを概念実証としてカールで動かそうとしている。

アップデート:私は質問尋ねアマゾンフォーラムをそこに回答が提供されている場合は、ここに回答として記載します。

シュテフェンオペル:

これは確かに少し不可解ですが、私はそれをAWS SDK for Javaのバグだと考えています(以下を参照)-ただし、何よりもまず、次のcurlコマンドがファイルをアップロードします(もちろん、更新済みの署名済みURLを想定しています) ):

curl -v -T mypicture.jpg https://mybucket.s3.amazonaws.com/myfilename?Expires=1334126943&AWSAccessKeyId=<accessKey>&Signature=<generatedSignature>

つまり、結果として(またはContent typeを生成するヘッダーを除外しましたが、これは明らかに望ましくありません。したがって、さらなる掘り起こしが必要でした。application/octet-streambinary/octet-stream

背景/分析

Amazon S3へのPUT(およびDELETEとHEAD)リクエストの事前署名付きURLは、原則として機能することがわかっており、このサイトの関連する質問で最も明白ではありません(たとえば、事前署名付きのs3へのアップロードとカールへの私の回答を参照)URL(403を取得))。

簡易化されたクエリ文字列要求認証の代替、クエリ文字列要求認証方法を示す次の疑似文法を使用するように文書化されています

StringToSign = HTTP-VERB + "\n" +
    Content-MD5 + "\n" +
    Content-Type + "\n" +
    Expires + "\n" +
    CanonicalizedAmzHeaders +
    CanonicalizedResource;    

これにはContent-Typeヘッダーが含まれますが、(すでに発見したように)いくつかの文書化されたケースではこれが欠けている部分です。たとえば、PUTリクエスト使用しGetPreSignedURLに対するAWSチームの応答を参照してください。追加すると、有効な署名済みURLが生成されます。

これは、AWS SDK for .NETを使用して簡単に実現できます。これは、まさにそれを行うための便利なメソッドGetPreSignedUrlRequest.WithContentType提供します

このリクエストのContentTypeプロパティを設定します。このプロパティのデフォルトは「binary / octet-stream」ですが、必要な場合はこのプロパティを設定できます。

したがって、次のように、それぞれのサンプル「署名済みURLを使用したオブジェクトのアップロード-AWS SDK for .NET」拡張すると、コンテンツタイプが含まれた有効な署名済みURLが生成されます。これは、curl介して(つまり、意図したとおりに)アップロードできます

    // ...
    GetPreSignedUrlRequest request = new GetPreSignedUrlRequest();
    // ...
    request.WithContentType("image/jpg");
    // ...

次に、意味的に同一のサンプルを拡張し、事前署名済みURLを使用してオブジェクトをアップロードする-AWS SDK for Javaを同様の方法で拡張しますが、(すでに発見したように)これを実現する専用の方法はありません。これは便利なメソッドが欠けているだけかもしれませんが、最終的にはaddRequestParameter()またはsetResponseHeaders()を使用して実現できる可能性があります。例:

  // ...
  request.setExpiration( new Date( System.currentTimeMillis() + (120 * 60 * 1000) ));
  request.addRequestParameter("content-type", "image/jpg");
  return client.generatePresignedUrl( request ).toString();
  // ...

ただし、両方のメソッドのドキュメントは他の目的を示唆しており、実際には機能しません。つまり、どのコンテンツタイプがそのように設定されていても(もしあれば)常に同じ署名を生成します。

SDKをさらにデバッグすると、どちらも前述の疑似文法に従ってクエリ文字列認証を計算するための意味論的に類似したコアメソッドを提供していることがわかります。.NETのbuildSigningString()およびJavaのmakeS3CanonicalString()参照してください

しかし、すべての興味深いヘッダーをリスト追加しそれらをソートする Javaバージョンのそれぞれのコードは、「興味深い」がContent-MD5、Content-Type、Date、およびx-amz-として定義されているため、実際には決して実行されません。いかなるクラスにのみ利用可能である何とかこれらのヘッダを提供する方法であって、実際に存在しないDefaultRequestクラスないGeneratePresignedUrlRequestが保護方法を参照、順番に署名を計算するための入力として使用され、前者を初期化するために使用createRequestは()

Javaは、ほぼ逆の組み合わせから自分の入力を構成する対興味深いことに/注目すべきは、二つの方法は、.NETでのクエリ文字列認証を計算するために、ヘッダパラメータのJavaのバグの原因にヒントができコールスタック、上のソースが、もちろん、それを解読するのは難しいかもしれません。つまり、内部アーキテクチャはもちろん大きく異なる可能性があります。

予備的な結論

これには2つの角度があります。

  • AWS SDK for Javaには、コンテンツタイプを設定するための便利なメソッドが欠けています。これは比較的まれなことかもしれませんが、それでも他のAWS SDKで説明されている明らかなユースケース-AWS関連のバックエンドサービスで広く使用されていることを考えると、これは驚くべきことです。
  • いずれにせよ、たとえば.NETバージョンと比較してクエリ文字列リクエスト認証の実装方法には多少の問題があるようです。これもコア機能であるため、これは驚くべきことですが、これはまだS3モデル内にあります/名前空間、したがって、上記のそれぞれのユースケースでのみ必要になる場合があります。

結論として、これを解決するための唯一の合理的な方法は更新されたSDKであるため、バグレポートが必要です。明らかに、このSDKの機能を複製または拡張して、この特別なケースを個別に説明できます(理想的には、送信できるようにする方法で)aws-sdk-for-javaプロジェクトのプルリクエスト)ですが、互換性と保守性のある方法でこれを正しく行うことは少し難しいように思われるため、SDKメンテナー自身が行うのが最善です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

分類Dev

Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

分類Dev

Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

分類Dev

S3署名付きURLを介してzipファイルをアップロードする方法

分類Dev

サーバー側アプリケーションから生成された署名付きURLを使用して、AndroidからS3サーバーにファイル(ビデオファイル)をアップロードする

分類Dev

Boto3を使用してS3バケットからファイルをダウンロードするための署名付きURLを作成するにはどうすればよいですか?

分類Dev

Python boto3を使用して、v4署名付きのS3署名付きURLを生成します

分類Dev

boto3を使用してS3で署名付きURLを生成する

分類Dev

Ionic android-事前に署名されたURLを使用してファイルをS3にアップロードします(エラーコード:3)

分類Dev

perlを使用してファイルとプレフィックス付きファイルを取得してs3にアップロードします

分類Dev

署名付きURL経由でファイルをGoogle Cloud Storage(GCS)にPUT

分類Dev

角度またはJavaScriptで事前に署名されたURLを使用してS3バケットにファイルをアップロードする方法

分類Dev

Rails:URLからファイルを保存してAmazon S3に保存できません(S3 :: Error :: ResponseError)

分類Dev

何をしても、事前に署名されたURLを使用してファイルをS3にアップロードできません。AWSコマンドラインは機能します。CURLおよびその他= 403

分類Dev

API Gateway GET / PUT大きなファイルをS3に

分類Dev

Nodemailerを使用してs3に保存されたPDFを添付ファイルとして送信する方法

分類Dev

Boto3を使用してプレフィックス付きのS3バケットにファイルをアップロードする

分類Dev

AWSS3-事前に署名されたURLを介してファイルをPUTするときに400の不正なリクエスト

分類Dev

S3署名を使用したPythonファイルのアップロード?

分類Dev

boto3を使用してS3に直接ファイルを書き込む方法はありますか?

分類Dev

boto3を使用してcsvファイルをs3に保存する

分類Dev

の配列をループしてs3署名付きURLを取得するasync / await

分類Dev

Lambda fnを使用してs3ファイルを取得し、それを使用して別のs3ファイルを変更してから、s3に書き換えます。

分類Dev

PDFの埋め込みにs3署名付きURLを追加しても機能しません

分類Dev

パンダを使用してS3にファイルを書き込む方法

分類Dev

javascriptを使用してS3にファイルをアップロードできません

分類Dev

scala akka-http を使用してファイルを s3 に保存できません

分類Dev

429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

分類Dev

https s3urlを指定してs3にファイルをアップロードします

Related 関連記事

  1. 1

    Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

  2. 2

    Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

  3. 3

    Filesystem Laravel 5.2を使用して、Amazon s3からファイルの署名付きURLを取得する

  4. 4

    S3署名付きURLを介してzipファイルをアップロードする方法

  5. 5

    サーバー側アプリケーションから生成された署名付きURLを使用して、AndroidからS3サーバーにファイル(ビデオファイル)をアップロードする

  6. 6

    Boto3を使用してS3バケットからファイルをダウンロードするための署名付きURLを作成するにはどうすればよいですか?

  7. 7

    Python boto3を使用して、v4署名付きのS3署名付きURLを生成します

  8. 8

    boto3を使用してS3で署名付きURLを生成する

  9. 9

    Ionic android-事前に署名されたURLを使用してファイルをS3にアップロードします(エラーコード:3)

  10. 10

    perlを使用してファイルとプレフィックス付きファイルを取得してs3にアップロードします

  11. 11

    署名付きURL経由でファイルをGoogle Cloud Storage(GCS)にPUT

  12. 12

    角度またはJavaScriptで事前に署名されたURLを使用してS3バケットにファイルをアップロードする方法

  13. 13

    Rails:URLからファイルを保存してAmazon S3に保存できません(S3 :: Error :: ResponseError)

  14. 14

    何をしても、事前に署名されたURLを使用してファイルをS3にアップロードできません。AWSコマンドラインは機能します。CURLおよびその他= 403

  15. 15

    API Gateway GET / PUT大きなファイルをS3に

  16. 16

    Nodemailerを使用してs3に保存されたPDFを添付ファイルとして送信する方法

  17. 17

    Boto3を使用してプレフィックス付きのS3バケットにファイルをアップロードする

  18. 18

    AWSS3-事前に署名されたURLを介してファイルをPUTするときに400の不正なリクエスト

  19. 19

    S3署名を使用したPythonファイルのアップロード?

  20. 20

    boto3を使用してS3に直接ファイルを書き込む方法はありますか?

  21. 21

    boto3を使用してcsvファイルをs3に保存する

  22. 22

    の配列をループしてs3署名付きURLを取得するasync / await

  23. 23

    Lambda fnを使用してs3ファイルを取得し、それを使用して別のs3ファイルを変更してから、s3に書き換えます。

  24. 24

    PDFの埋め込みにs3署名付きURLを追加しても機能しません

  25. 25

    パンダを使用してS3にファイルを書き込む方法

  26. 26

    javascriptを使用してS3にファイルをアップロードできません

  27. 27

    scala akka-http を使用してファイルを s3 に保存できません

  28. 28

    429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

  29. 29

    https s3urlを指定してs3にファイルをアップロードします

ホットタグ

アーカイブ