Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Eucalyptus Walrus/Amazon S3 SOAP签名失败_Python_Soap_Amazon Web Services_Amazon S3_Eucalyptus - Fatal编程技术网

Python Eucalyptus Walrus/Amazon S3 SOAP签名失败

Python Eucalyptus Walrus/Amazon S3 SOAP签名失败,python,soap,amazon-web-services,amazon-s3,eucalyptus,Python,Soap,Amazon Web Services,Amazon S3,Eucalyptus,我一直在学习如何使用开源的Eucalyptus来使用AmazonS3API。到目前为止,我已经能够成功地使用REST,但现在我也想使用SOAP。我似乎很难为我的请求生成正确的签名。服务给了我一个403禁止的错误: Traceback (most recent call last): File "soap.py", line 31, in <module> r = w.download_file('mybucket', 'test.txt') File "soap.py

我一直在学习如何使用开源的Eucalyptus来使用AmazonS3API。到目前为止,我已经能够成功地使用REST,但现在我也想使用SOAP。我似乎很难为我的请求生成正确的签名。服务给了我一个403禁止的错误:

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')
我更改了服务器端点,因为否则WSDL将指向Amazon上的常规S3服务器。在create_签名函数中,我还有两种不同的方法来创建签名。我只是简单地把第二个注释掉,从而在一个和另一个之间切换。这两个似乎都不起作用。我的问题是我做错了什么

SOAP身份验证:

SUDS Jurko文档:

编辑:我意识到我忘了包括一个为调试目的打印的时间戳和签名的示例

2014-12-05T00:27:41.001Z
0h8vxE2+k10tetXZQJxXNnNUjjw=
编辑2:另外,我知道download_file函数不会下载文件:)我仍处于测试/调试阶段


编辑3:我知道至少根据亚马逊的说法,REST更适合使用。(我个人认为REST也更好。)我也已经意识到,亚马逊不赞成使用SOAP。然而,我想走这条路无论如何,所以请帮我一个忙,不要浪费我的时间与链接的反对。我向您保证,在编写这段SOAP代码时,我已经很清楚这种不推荐的情况。事实上,我发布的其中一个链接在页面顶部打印了弃用通知。然而,如果你有证据表明海象完全抛弃了肥皂,或者他们停止了肥皂部分的工作,我希望看到类似的情况。但是请不要告诉我Amazon不推荐使用SOAP。

S3 SOAP API不支持“新”功能,因此应尽可能使用REST API:

Eucalyptus的IIRC最新版本不支持带有S3的SOAP

这就是说,签名在我看来很好,因此我将检查客户机/服务主机是否有正确的时间,如果差异超过15分钟,身份验证将失败


您还可以检查Walrus服务主机上的cloud-error.log,因为那里可能有关于故障的更多详细信息。

自Eucalyptus 4.0.0版起,Eucalyptus不支持S3的SOAP

如果您使用的是Eucalyptus的旧版本(4.0之前),那么SOAP应该可以工作。但是,请注意,S3提供的wsdl即使对于它们自己的服务也不一定是最新的或准确的。S3因在没有版本或wsdl颠簸的情况下更改API而臭名昭著,特别是因为他们停止更新SOAP API。因此,可能有来自Walrus的响应不符合已发布的WSDL,因为我们的XML是根据我们从S3(通过REST)看到的响应更新的,SOAP和REST响应是不同的。然而,签名应该是兼容的,所以在最坏的情况下,您会看到500或400个错误,但不会看到403个响应


我的建议是,如果您真的想学习S3SOAPAPI,就必须正确使用S3。Eucalyptus中的S3 SOAP支持在4.0之前就已经存在,但可能不符合S3 SOAP的当前状态——当AWS SDK停止使用SOAP以支持更好的REST支持时,我们直接停止了对S3 SOAP API的测试,因为这是API的发展方向。

Eucalyptus确实支持SOAP(请参阅ZachH关于弃用的评论):


我决定放弃使用python,而是用C#生成了一些工作代码。C#有更好的SOAP库。

我知道时间不会错,因为我运行的连接到Walrus的脚本是从托管Walrus的同一个虚拟机上运行的。正如您可能已经注意到的,服务器url指向localhost。我确实尝试了
localtime()
而不是
gmtime()
,只是想确定一下,但没有用。不幸的是,cloud-error.log中没有任何帮助。谢谢你检查我的签名。还有,你有证据证明海象不支持SOAP吗?从你说话的方式来看,我假设你参与了这个项目。如果是这样,谢谢你提供证据。但在未来,我在哪里可以找到桉树的变更记录?@KevinTindall是的,我是桉树存储的领导者。我应该说得更清楚。如果您有更多问题,也可以在桉树的freenode IRC上找到我们-devel@KevinTindall,关于变更日志,它是。看起来S3SOAP支持的删除没有包括在内,这是一个问题,我将努力在文档中修复这个问题。
2014-12-05T00:27:41.001Z
0h8vxE2+k10tetXZQJxXNnNUjjw=