質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

6580閲覧

Amazon MWSでの署名エラーの修正方法について(VB.NET)

ShinOikawa

総合スコア15

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/05/16 10:18

編集2017/05/18 07:05

Amazon MWS APIで出品中商品レポートを取得するプログラムをVB.NETで作成中で、主に以下のページの手順に従い、下記の【コード】を作成しました。

Amazon開発者向けページ

しかし、作成された署名済みURLをブラウザで送信しても、"SignatureDoesNotMatch"というエラーが返ってきます。

これは"403 Forbidden"のエラーのようで、色々と試行錯誤をしたのですが改善できません。

恐れ入りますが、修正方法をご教授お願いいたします。

VB.NET

1 Imports System. 2 Imports System.Web 3 Imports System.Net 4 Imports System.IO 5 Imports System.Text 6 Imports Amazon.Runtime 7 Imports Amazon.SQS 8 Imports Amazon.SQS.Model 9 10 Public Class MyBase64str 11 12 Private enc As Encoding 13 14 Public Sub New(ByVal encStr As String) 15 enc = Encoding.GetEncoding(encStr) 16 End Sub 17 18 Public Function Encode(ByVal str As String) As String 19 Return Convert.ToBase64String(enc.GetBytes(str)) 20 End Function 21 22 Public Function Decode(ByVal str As String) As String 23 Return enc.GetString(Convert.FromBase64String(str)) 24 End Function 25 26 End Class 27 28 29 Public Class Form1 30 31 Sub GetReportAPI() 32 33 Dim ecsaddress , AWSKeyId , sKey , APIVersion , SellerId , _ 34 timestamp , URI , MarketPlaceID , rawText , _ 35 rawTextToSign , Operation , SignatureVer As String 36 37 APIVersion = HttpUtility.UrlEncode("2009-01-01") 38 39 SellerId = HttpUtility.UrlEncode("[セラーID]") 40 41 AWSKeyId = HttpUtility.UrlEncode("[AWSアクセスキーID]") 42 43 sKey = HttpUtility.UrlEncode("[シークレットキー]") 44 45MarketPlaceID = HttpUtility.UrlEncode("A1VC38T7YXB528") 46 47 Operation = HttpUtility.UrlEncode("GetReportList") 48 49 SignatureVer = HttpUtility.UrlEncode("2") 50 51 ecsaddress = "mws.amazonservices.jp" 52 53 timestamp = System.DateTime.UtcNow.ToString("s") & "Z" 54 timestamp = HttpUtility.UrlEncode(timestamp) 55 56 rawText = "" 57 58 '署名用リクエストを作成 59rawText = rawText _ 60 & "AWSAccessKeyId=" & AWSKeyId _ 61 & "&Action=" & Operation _ 62 & "&Merchant=" & SellerId _ 63 & "&SignatureMethod=HmacSHA256" _ 64 & "&SignatureVersion=" & SignatureVer _ 65 & "&Timestamp=" & timestamp _ 66 & "&Version=" & APIVersion 67 68 rawTextToSign = "POST" & vbCrLf & ecsaddress & vbCrLf & "%2F" & vbCrLf & rawText 69 70 Dim data As Byte() = System.Text.Encoding.UTF8.GetBytes(rawTextToSign) 71 Dim keyData As Byte() = System.Text.Encoding.UTF8.GetBytes(sKey) 72 73 'HMACSHA256オブジェクトの作成 74Dim hmac As New System.Security.Cryptography.HMACSHA256(keyData) 75 76 'ハッシュ値を計算 77Dim Hash As Byte() = hmac.ComputeHash(data) 78 79 hmac.Clear() 80 81 Dim RequestHMAC As String = BitConverter.ToString(Hash).ToLower().Replace("-", "") 82 83Console.WriteLine("HMAC=" & RequestHMAC) 84 85 Dim base64 As New MyBase64str("UTF-8") 86 Dim base64String As String = base64.Encode(RequestHMAC) 87 88 base64String = HttpUtility.UrlEncode(base64String) 89 90 Dim rawText2 As String = "" 91 rawText2 = rawText2 _ 92 & "AWSAccessKeyId=" & AWSKeyId _ 93 & "&Action=" & Operation _ 94 & "&Merchant=" & SellerId _ 95 & "&SignatureVersion=" & SignatureVer _ 96 & "&Timestamp=" & timestamp _ 97 & "&Version=" & APIVersion _ 98 & "&Signature=" & base64String _ 99 & "&SignatureMethod=HmacSHA256" 100 101 URI = "https://" & ecsaddress & "/?" & rawText2 102 103 End Sub 104 105 End Class

-----------------【エラーメッセージ】-----------------

<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message>

-----------------【環境】-----------------
・開発:Visual Studio Community 2017 Ver15.1
(AWSSDK for .NETをインストール)
.NET Framework Ver4.6
・OS:Windows Server 2008 R2 Standard
(上記に仮想デスクトップを構築して使用)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

こちらのべいやんさんのブログが大変参考になりました。

http://beeyaan.com/category11/entry20.html

"POST" → "GET"

"vbCrLf" → "vbLf"

とすることで解決できました。

投稿2017/05/26 04:17

ShinOikawa

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、Amazon Web ServicesAmazon MWSは異なるサービスですので、
タグの変更、もしくはAPIかAmazon MWSを追加しておいてください。
#中身はAWSのサーバと認証システムを利用していますが


エラーの対応について

エラー内容は、どちらかと言うならば403 Forbiddenというより401 Unauthorizedかと思います。
シークレットアクセスキーでのシグネチャ計算結果が一致しなかったようですね。
カノニカルストリング(リクエストURL)の生成の見直しが必要かと思いますので
以下の確認をしてください。
0. アクセスキーとシークレットアクセスキーはあっていますか?
0. APIVersionの日付を変更していませんか?

あと、URLエンコードしているのも気になります。
すべて英数字なのでURLエンコードをやめてみてください。
それか、URLエンコードのキャラセットを変更でしょうか。

署名バージョン 4 テストスイート も提供されていますので活用してみてください。


追記

Amazon MWS のクライアントライブラリの使用
ここを見ますと、以下のように書かれていました。

UTF-8クエリ文字列コンポーネントを、パラメータ名で自然バイトオーダー順にソートします(natural byte order)。
パラメータは、GETの場合 URI または POSTの場合ボディから取得できます。
(Content-Type が application/x-www-form-urlencoded の場合)パラメータ名と値を、以下のルールに従ってURLエンコードします。

・RFC3986で規定された非予約文字はURLエンコードしてはいけません。
非予約文字とは、A-Z、a-z、0-9、ハイフン(-)、アンダーバー(_)、ピリオド(.)、 およびチルダ( ~ )です。
・その他の文字は%XYパーセントエンコードが必要です (XおよびYには16進数のHEX文字の0-9および大文字のA-Fが入る)。
・拡張UTF-8文字については、%XY%ZA…のようにパーセントエンコードします。
・スペース(空白)文字は、パーセントエンコードして%20と表記します。多くのエンコーディングで行われる、+ では表現しないよう気をつけてください。

サンプルソースコードでは、BASE64(utf-8)で暗号化したものをURLにエンコードしていますが、その後にリプレースさせてますね。

投稿2017/05/18 06:51

編集2017/05/19 05:54
lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinOikawa

2017/05/18 11:09

lazhuward様 ご回答いただきまして誠にありがとうございます。 非常に親身に解決策をご提示いただけ、大変感謝しております。 >タグについて AWSとMWSの区別もちゃんとできておりませんでした。ご指摘いただきありがとうございます。 タグの内容はご指摘の通り変更致しました。 >1.アクセスキーとシークレットアクセスキーについて 再確認致しましたが、これらは正しいようです。 >2.APIVersionの日付について 「日付を変更」とおっしゃいますのは、何から何への変更でしょうか? Scratchpadでは問題なくレポートが取得出来ておりまして、そこで指定されている通り"2009-01-01"としております。 >URLエンコードについて ご指摘いただきました通りURLエンコードをやめてみました。特に結果は変わりませんでした。 >署名バージョン4テストスイートについて こちらを試してみようとしたところ、現在、ファイルのダウンロードが出来なくなっているようで、試すことができませんでした。ダウンロードが出来るようになったら是非試してみたいと思います。 その後も色々試行錯誤をしておりますが解決には至っておりません。 お忙しいところ恐縮ですが、解決策をご提案いただけたら幸いです。 何卒、よろしくお願いします。
lazhuward

2017/05/19 05:54

>1.アクセスキーとシークレットアクセスキーについて >2.APIVersionの日付について 問題ないみたいですね。 >署名バージョン4テストスイートについて 日本語だとURL間違っているようです。こちらです。 http://docs.aws.amazon.com/general/latest/gr/samples/aws-sig-v4-test-suite.zip よく考えたらBASE64エンコード文字列は/入ってるのでURLエンコードしないと駄目でしたね。 BASE64の設定方法に特記事項がありましたので、回答欄に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問