2014-12-05 81 views
0

我一直在學習如何使用開源的Eucalyptus來使用Amazon S3 API。到目前爲止,我已經能夠成功使用REST,但現在我也想使用SOAP。我似乎無法爲我的請求生成正確的簽名。該服務是給我一個403 Forbidden錯誤:Eucalyptus Walrus/Amazon S3 SOAP簽名失敗

Traceback (most recent call last): 
    File "soap.py", line 31, in <module> 
    r = w.download_file('mybucket', 'test.txt') 
    File "soap.py", line 27, in download_file 
    r = self.client.service.ListAllMyBuckets(self.access_key, timestamp, signature) 
    File "/usr/lib/python2.6/site-packages/suds/client.py", line 521, in __call__ 
    return client.invoke(args, kwargs) 
    File "/usr/lib/python2.6/site-packages/suds/client.py", line 581, in invoke 
    result = self.send(soapenv) 
    File "/usr/lib/python2.6/site-packages/suds/client.py", line 619, in send 
    description=tostr(e), original_soapenv=original_soapenv) 
    File "/usr/lib/python2.6/site-packages/suds/client.py", line 677, in process_reply 
    raise Exception((status, description)) 
Exception: (403, u'Forbidden') 

我的代碼是在Python 2和使用無泡沫Jurko庫發送SOAP請求:

from suds.client import Client 

class WalrusSoap: 
    wsdl_url = 'https://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl' 
    server_url = 'https://localhost:8773/services/Walrus' 

    def __init__(self, access_key, secret_key): 
     self.access_key = access_key 
     self.secret_key = secret_key 
     self.client = Client(self.wsdl_url) 
     self.client.wsdl.services[0].setlocation(self.server_url) 
     #print self.client 

    def create_signature(self, operation, timestamp): 
     import base64, hmac, hashlib 
     h = hashlib.sha1(self.secret_key) 
     h.update("AmazonS3" + operation + timestamp) 
     #h = hmac.new(key=self.secret_key, msg="AmazonS3" + operation + timestamp, digestmod=hashlib.sha1) 
     return base64.encodestring(h.digest()).strip() 

    def download_file(self, bucket, filename): 
     from time import gmtime, strftime 
     timestamp = strftime('%Y-%m-%dT%H:%M:%S.001Z', gmtime()) 
     print(timestamp) 
     signature = self.create_signature('ListAllMyBuckets', timestamp) 
     print(signature) 
     r = self.client.service.ListAllMyBuckets(self.access_key, timestamp, signature) 
     return r 

w = WalrusSoap(access_key='MOBSE7FNS6OC5NYC75PG8', secret_key='yxYZmSLCg5Xw6rQVgoIuVLMAx3hZRlxDc0VOJqox') 
r = w.download_file('mybucket', 'test.txt') 
print(r) 

我改變了服務器端點,否則WSDL指向亞馬遜的常規S3服務器。我也有兩種不同的方法在我的create_signature函數中創建簽名。我只是簡單地評論第二個,就是在彼此之間交換。兩者似乎都不起作用。我的問題是我做錯了什麼?

SOAP驗證:http://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html

SUDS-Jurko文檔:https://bitbucket.org/jurko/suds/overview

編輯:我發現我忘了,包括的打印什麼時間戳和簽名用於調試目的的例子。

2014-12-05T00:27:41.001Z 
0h8vxE2+k10tetXZQJxXNnNUjjw= 

編輯2:另外,我知道download_file功能無法下載文件:)我仍然在測試/調試階段

編輯3:我知道,REST是更好地使用,至少根據亞馬遜的說法。 (我個人認爲REST也更好。)我也已經意識到SOAP已被亞馬遜棄用。然而,無論如何,我想順着這條道路走下去,所以請幫我一個忙,不要浪費我的時間與鏈接到棄用。我向你保證,在編寫這個SOAP代碼時,我已經清楚了這個棄用。事實上,我發佈的其中一個鏈接已在其頁面頂部打印了棄用通知。但是,如果您有證據表明Walrus完全拋棄SOAP或他們停止了SOAP部分的工作,我希望看到類似的東西。但請不要告訴我亞馬遜已棄用SOAP。

回答

1

的S3 SOAP API不支持 「新」 的特點,因此REST API應該儘可能使用:

http://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAPI3.html

https://forums.aws.amazon.com/message.jspa?messageID=77821

IIRC最近桉樹的版本不支持SOAP與S3 。

也就是說,簽名看起來不錯,所以我會檢查客戶端/服務主機是否有正確的時間,如果有超過15分鐘的差異,認證將會失敗。

您還可以檢查Walrus服務主機上的cloud-error.log,因爲那裏可能有更多關於失敗的細節。

+0

我知道時間不能錯,因爲我正在運行的連接到Walrus的腳本是從託管Walrus的虛擬機運行的。您可能已經注意到server_url指向localhost。我確實試過'localtime()'而不是'gmtime()',只是爲了確定,並沒有用。不幸的是,在cloud-error.log中沒有任何幫助。感謝您檢查我的簽名。 – 2014-12-05 13:23:29

+0

你也有證據證明Walrus不支持SOAP嗎? – 2014-12-05 13:40:03

0

從Eucalyptus版本4.0.0開始,Eucalyptus不支持S3的SOAP。

如果您使用的是早期版本的Eucalyptus(4.0之前),那麼SOAP應該可以工作。但請注意,由S3提供的wsdl對於他們自己的服務而言不一定是最新的或準確的。 S3在修改API時沒有版本或wsdl顛簸,尤其是因爲它們停止更新SOAP API。因此,Walrus可能會不符合已發佈的WSDL,因爲我們的XML基於我們從S3(通過REST)看到的響應以及SOAP和REST響應的分歧進行更新。但是,簽名應該是兼容的,所以最糟糕的情況是,您會看到500或400個錯誤,而不是403個響應。

我的建議是,如果你真的想學習S3 SOAP API,你必須使用S3本身。 Eucalyptus中的S3 SOAP支持在4.0之前,但可能不符合S3 SOAP的當前狀態 - 當AWS SDK停止使用SOAP以支持更好的REST支持時,我們直接停止對S3 SOAP API進行測試,因爲那是API正在向前發展。

+0

從你說話的方式來看,我假設你已經參與了這個項目。如果是這樣,謝謝你提供證據。在將來,我會在哪裏尋找桉樹的更新日誌? – 2014-12-08 03:28:10

+0

@KevinTindall是的,我是桉樹存儲的主角。我應該說得更清楚。如果你有更多的問題,你也可以在#eucalyptus-devel – ZachH 2014-12-09 19:06:20

+0

@KevinTindall的freenode IRC上找到我們,關於更新日誌,它是[here](https://www.eucalyptus.com/docs/eucalyptus/4.0。 2/index.html中#共享/ release_notes.html)。它看起來不包括S3 SOAP支持刪除,這是一個問題,我會努力在文檔中解決這個問題。 – ZachH 2014-12-09 19:50:44