Amazon S3和ColdFusion PutObject请求的SignatureDoesNotMatch错误

时间:2015-02-27 01:47:22

标签: security coldfusion amazon-s3 amazon

可能是一个简单的问题,但要拔掉头发试图弄明白。 生成签名并向s3发布休息帖子的代码完美无缺:

    <cfset cs = "PUT\n\n#arguments.contentType#\n#dateTimeString#\nx-amz-acl:#arguments.acl#\nx-amz-storage-class:#arguments.storageClass#\n/#arguments.bucketName#/#arguments.keyName#">
...
<cfhttp method="PUT" url="https://s3.amazonaws.com/#arguments.bucketName#/#arguments.keyName#" timeout="#arguments.HTTPtimeout#">   
    <cfhttpparam type="header" name="Authorization" value="AWS #variables.accessKeyId#:#signature#">
    <cfhttpparam type="header" name="Content-Type" value="#arguments.contentType#">
    <cfhttpparam type="header" name="Date" value="#dateTimeString#">
    <cfhttpparam type="header" name="x-amz-acl" value="#arguments.acl#">
    <cfhttpparam type="header" name="x-amz-storage-class" value="#arguments.storageClass#">
    <cfhttpparam type="body" value="#binaryFileData#">
</cfhttp>

但是我想添加s3管理的AES256加密,如果我理解正确应该像添加带有AES256值的x-amz-server-side -encryption标头一样简单,但这不起作用:

<cfset cs = "PUT\n\n#arguments.contentType#\n#dateTimeString#\nx-amz-acl:#arguments.acl#\nx-amz-storage-class:#arguments.storageClass#\nx-amz-server-side​-encryption:aes256\n/#arguments.bucketName#/#arguments.keyName#">
    ...
    <cfhttp method="PUT" url="https://s3.amazonaws.com/#arguments.bucketName#/#arguments.keyName#" timeout="#arguments.HTTPtimeout#">   
        <cfhttpparam type="header" name="Authorization" value="AWS #variables.accessKeyId#:#signature#">
        <cfhttpparam type="header" name="Content-Type" value="#arguments.contentType#">
        <cfhttpparam type="header" name="Date" value="#dateTimeString#">
        <cfhttpparam type="header" name="x-amz-acl" value="#arguments.acl#">
        <cfhttpparam type="header" name="x-amz-storage-class" value="#arguments.storageClass#">
        <cfhttpparam type="header" name="x-amz-server-side​-encryption" value="aes256">
        <cfhttpparam type="body" value="#binaryFileData#">
    </cfhttp>

签名方法是:

<cffunction name="createSignature" returntype="string" access="public" output="false">
    <cfargument name="stringIn" type="string" required="true" />
    <!--- Replace "\n" with "chr(10) to get a correct digest --->
    <cfset var fixedData = replace(arguments.stringIn,"\n","#chr(10)#","all")>
    <!--- Calculate the hash of the information --->
    <cfset var digest = HMac(fixedData, variables.secretAccessKey, "HMACSHA1", "utf-8")>
    <!--- fix the returned data to be a proper signature --->
    <cfset var signature = ToBase64( binaryDecode(digest, "hex" ) )>
    <cfreturn signature>
</cffunction>

尝试使用加密时,我得到&#34;我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。&#34;

它不是键本身,因为我可以添加/删除/列表就好了。我无法添加加密标头。

有人告诉我出了什么问题吗?

......我尝试过AES&#39; AES256&#39;和&#39; aes256&#39;作为价值观。

1 个答案:

答案 0 :(得分:3)

原来这是愚蠢的......在文档中找到一行提到它需要花费很多时间。

亚马逊标题需要按字母顺序列出。

x-amz-server-side​-encryption移到x-amz-storage-class之上并使用AES256解决了这个问题。