当前位置: 首页 > 知识库问答 >
问题:

Amazon S3签名不匹配-AWS SDK Java

阚乐湛
2023-03-14

我有一个播放应用程序需要上传文件到S3。我们正在使用scala和Java AWS SDK进行开发。

我有麻烦尝试上传文件,我不断得到403签名DoesnotMatch当使用预签名的URL。url是通过以下代码使用AWS Java SDK生成的:

def generatePresignedPutRequest(filename: String) = {
    val expiration = new java.util.Date();
    var msec = expiration.getTime() + 1000 * 60 * 60; // Add 1 hour.
    expiration.setTime(msec);

    s3 match {
      case Some(s3) => s3.generatePresignedUrl(bucketname, filename, expiration, HttpMethod.PUT).toString
      case None => {
        Logger.warn("S3 is not availiable. Cannot generate PUT request.")
        "URL not availiable"
      }
    }
  }
 function uploadToS3(file, url)
     {
       var xhr = createCORSRequest('PUT', url);
       if (!xhr) 
       {
         setProgress(0, 'CORS not supported');
       }
       else
       {
         xhr.onload = function() 
         {
           if(xhr.status == 200)
           {
             setProgress(100, 'Upload completed.');
           }
           else
           {
             setProgress(0, 'Upload error: ' + xhr.status);
           }
         };

         xhr.onerror = function() 
         {
           setProgress(0, 'XHR error.');
         };

         xhr.upload.onprogress = function(e) 
         {
           if (e.lengthComputable) 
           {
             var percentLoaded = Math.round((e.loaded / e.total) * 100);
             setProgress(percentLoaded, percentLoaded == 100 ? 'Finalizing.' : 'Uploading.');
           }
         };

         xhr.setRequestHeader('Content-Type', 'image/png');
         xhr.setRequestHeader('x-amz-acl', 'authenticated-read');

         xhr.send(file);
       }
     }
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<StringToSignBytes>50 55 bla bla bla...</StringToSignBytes>
<RequestId>F7A8F1659DE5909C</RequestId>
<HostId>q+r+2T5K6mWHLKTZw0R9/jm22LyIfZFBTY8GEDznfmJwRxvaVJwPiu/hzUfuJWbW</HostId>
<StringToSign>PUT

    image/png
    1387565829
    x-amz-acl:authenticated-read
    /mybucketname/icons/f5430c16-32da-4315-837f-39a6cf9f47a1</StringToSign>
<AWSAccessKeyId>myaccesskey</AWSAccessKeyId></Error>

共有1个答案

潘修为
2023-03-14

我怀疑OP对此仍有问题,但对于遇到此问题的其他人,这里是答案:

当向S3发出签名请求时,AWS会进行检查,以确保签名与浏览器发送的HTTP头信息完全匹配。不幸的是,这是必需的阅读:http://s3.amazonaws.com/doc/s3-developer-guide/restauthentication.html

但是在上面的代码中实际上并非如此,Javascript发送:

xhr.setRequestHeader('Content-Type', 'image/png');
xhr.setRequestHeader('x-amz-acl', 'authenticated-read');
  1. 使用桶和文件名创建GeneratePresignedUrlRequest对象。
  2. 调用setExpiration、setContentType等,在其上设置所有头信息。
  3. 将其作为唯一参数传递到S3.GeneratePreSignedUrl。

下面是要使用的GeneratePresignedUrlRequest的正确函数定义:

http://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/services/s3/amazons3client.html#GeneratePresignedURL(com.amazonaws.services.s3.model.GeneratePresignedURLRequest)

AWS GitHub repo上的函数代码对我了解如何编写解决方案也很有帮助。希望这有帮助。

 类似资料:
  • 所以我已经在我的智能手机里安装了应用程序。当我尝试安装它时,它会给出消息“Package signatures do not match the previous installed最重要的是,我不能卸载应用程序,我只需要更新它。我应该怎么做才能使它正常工作?

  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 问题内容: 我正在记录日志文件中的以下错误。 (java.lang.SecurityException:类“ com.adventnet.snmp.snmp2.SecurityModelTable”的签名者信息与抛出同一包的其他类的签名者信息不匹配 事情是当我在命令下运行时,它说jar已验证。 如果jar文件经过验证,那么怎么会出现此问题? 问题答案: 这意味着您在同一个程序包中有两个或多个具有不

  • 问题内容: 我像往常一样重新编译了我的课程,并突然收到以下错误消息。为什么?我该如何解决? 问题答案: 当从不同的JAR文件加载属于同一个程序包的类,并且这些JAR文件具有使用不同证书签名的签名时,就会发生这种情况-或更常见的是,至少有一个签​​名,而另一个或多个未签名(包括已加载的类)目录中,因为这些AFAIK无法签名)。 因此,请确保使用相同的证书对所有JAR(或至少包含相同包中的类的JAR)

  • 我使用WindowsPowerShell创建了一个弹性Beanstalk环境,并遵循以下部署文档将Django应用程序部署到弹性Beanstalk 我完成了以下步骤:使用Django的Python虚拟环境, 创建了django项目, 创建IAM用户我获得了访问密钥ID和机密访问密钥ID 失败此步骤环境并部署您的Django应用程序 当我尝试it询问访问密钥、秘密访问密钥和区域aws应用程序自动生成

  • 我在Rest服务上使用JWT的Spring启动和Spring安全。我使用了下面链接中的代码:https://www.javainuse.com/spring/boot-jwt-mysql它工作正常,但是当我们使用它的令牌进行身份验证时...我们面临以下错误: til.getSignatureException:JWT签名与本地计算的签名不匹配。JWT有效性不能被断言,也不应该被信任。在til.ja