【问题标题】:SignatureDoesNotMatch error with Amazon S3 and ColdFusion PutObject requestAmazon S3 和 ColdFusion PutObject 请求的 SignatureDoesNotMatch 错误
【发布时间】:2015-04-29 15:20:54
【问题描述】:

可能很简单的问题,但拉头发试图弄清楚。 这段代码生成一个签名并在 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 加密,如果我理解正确,应该像添加 x-amz-server-side​-encryption 标头和 AES256 的值一样简单,但这不起作用:

<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>

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

它不是键本身,因为我可以很好地添加/删除/列出。我只是无法添加加密标头。

谁能告诉我怎么回事?

...我尝试将 'AES256' 和 'aes256' 作为值。

【问题讨论】:

    标签: security coldfusion amazon-s3 amazon


    【解决方案1】:

    事实证明这是愚蠢的......而且花了很多时间才找到在文档中提到它的一行。

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

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

    【讨论】:

    • 当您说“将它们移到上面”时,您只是指在物理上重新排序您的coldfusion代码中的&lt;cfhttpparam&gt;标签吗?您可以在此处提供的任何其他见解都将是一个巨大的帮助,因为我多年来一直在处理这个问题并且无法解决它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2012-05-04
    • 2021-12-26
    • 2013-10-01
    • 2018-08-24
    • 2013-06-28
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多