dポイントプレゼントキャンペーン実施中!

お世話になります。

署名認証追加に伴い、プログラムを変更したのですが、
現在、以前の認証方法と署名認証の両方が平行稼動されているためか、
本当に署名認証が成功しているのか確認することができません。

ちなみにMicrosoft SOAP Tool Kitを使用しSOAPリクエストの中身を以下と
比較したとこと(1)~(9)の内容は全て満たしていました。
https://affiliate.amazon.co.jp/gp/associates/hel …


本当に成功しているのか確証が得られないため、
確認しようと試みた内容は以下です。

【その1】
アカウントをA・B2つ作成し、1つ(A)に証明書をアップロードする。
Aの証明書をWEBサーバの証明書ストアにインストールし、
プログラム中のAccessKeyをA、B変更し、結果が返ってくるか確認する。

<結果予想>
A:成功 B:失敗(WEBサーバ上の証明書はアカウントBの証明書ではないため)

<結果>
A:成功 B:成功

Bにはそもそも証明書がアップロードされていないので、
証明書ではなくAccessKeyによる認証をされているのか???


【その2】
アカウントAの証明書を新しく作り直し、amazonにアップする。

<結果予想>
WEBサーバの証明書ストアに登録してあるものと、amazonに登録してあるものと
内容は異なるので、失敗するはず。

<結果>
成功


平行運用期間中は電子認証に失敗したら現行のAccessKeyだけの
認証を行っているのかなとも思ったのですが、本当は失敗するのであれば
プログラムが間違っていることになるのでしょうか??


色々調べてここまでやっとたどり着いたのですが、情報が少なく、行き詰ってしまいました。
どなたかよい知恵がございましたら教えてください。



ちなみに開発環境と実装したプラグラムの内容は以下です。

【開発環境】
・ASP.Net(C#) .NET Framework 1.1
・Microsoft.Web.Services(WSE1.0を使用してデジタル署名を行う)

【プログラム】
//■ItemSearchRequestオブジェクト作成-----------------------------------
com.amazon.webservices.ItemSearchRequest searchRequest = new com.amazon.webservices.ItemSearchRequest();

//検索キーワードの指定
searchRequest.Keywords = Search.Text;

//検索するストアのインデックスを指定(書籍)
searchRequest.SearchIndex = "Books";

//返されるデータの種類を指定
searchRequest.ResponseGroup = new string [] {"ItemAttributes"};

//ページを指定
searchRequest.ItemPage = Page.Text;

//並び順(売上順)
searchRequest.Sort="salesrank";

//■ItemSearchオブジェクト作成--------------------------------------------------------
com.amazon.webservices.ItemSearch search = new com.amazon.webservices.ItemSearch();

//AWSAccessKeyId
search.AWSAccessKeyId = "MyAccessKey";

//ItemSearchRequestオブジェクトの配列を指定
search.Request = new com.amazon.webservices.ItemSearchRequest[] { searchRequest };


//■電子証明書----------------------------------------------------------------
com.amazon.webservices.AWSECommerceService ecs4 = new com.amazon.webservices.AWSECommerceService();

SoapContext ctx = ecs4.RequestSoapContext;
X509CertificateStore store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
if (!store.OpenRead())
return;

X509CertificateCollection certs = store.FindCertificateBySubjectName("C=US, O=Amazon.com, OU=AWS-Developers, CN=XXXXXXXX");
X509SecurityToken x509 = new X509SecurityToken(((X509Certificate)certs[0]));
ctx.Security.Tokens.Add(x509);
store.Close();

Signature sign = new Signature(x509);
ctx.Security.Elements.Add(sign);


//■Webサービスの呼び出し----------------------------------------------------------------
com.amazon.webservices.ItemSearchResponse searchResponse = ecs4.ItemSearch(search);

A 回答 (1件)

私はPHPでRESTリクエストで次のように確認しました。



1.タイムスタンプをわざと間違えてみる。
半日前とか適当な値でリクエスト→失敗。
正しいGMTでリクエスト→成功。

2.Signeture値をわざと間違える。
Signetureにゴミを付けてリクエスト→失敗。
正しいSignetureでリクエスト→成功。

となっていますので、ちゃんとRESTでは失敗しますので認証しているようです。SOAPリクエストは詳しくありませんので、一度AWSの開発者フォーラムの方で確認されてはどうでしょうか?
http://developer.amazonwebservices.com/connect/f …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

誤った方法を試すと、認証に失敗するのですね。
ということは、やっぱりプログラムが正常に動いていないのでしょうか・・。

提案してくださったように、タイムスタンプやSignetureを
変更しようかとも思いましたが、SOAPでWSEを使用すると、
勝手にタイムスタンプやデジタル証明をメッセージに
付加してくれるので、変更することができないんです。。

でももしかしたら変更する方法があるかもしれないので、
もう少し調べてみます。

ちなみに日本語のフォーラムには質問済みで、回答してもらえないので、英語サイトのほうにもしてみました。
amazonの方が答えてくれるといいのですが・・・。

お礼日時:2009/06/24 14:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!