亚马逊 Exp - ERR_INSECURE_RESPONSE

Amazon S3 - ERR_INSECURE_RESPONSE

这个问题已经有人问过 but that answer didn't help me as I know that the URL is correct as it points to a US Standard url as detailed in the amazon guide here

所以我正在尝试通过 angular 库 ng-file-upload 将文件上传到我的存储桶。我相信我已经正确设置了存储桶:

我不得不在上面的左括号后面放一个 space,因为如果我不这样做的话,不允许我添加它。

我的理解是 允许从任何位置发帖而不考虑标题 - 对吗?

我生成的保单:

{
    "Version": "2012-10-17",
    "Id": "Policy<numbers>",
    "Statement": [
        {
            "Sid": "Stmt<numbers>",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::ac.testing/*"
        }
    ]
}

最后 - 在我尝试上传的实际代码中:

      var policy = {
        "expiration": "2020-01-01T00:00:00Z",
        "conditions": [
          {"bucket": "ac.testing"},
          ["starts-with", "$key", ""],
          {"acl": "private"},
          ["starts-with", "$Content-Type", ""],
          ["starts-with", "$filename", ""],
          ["content-length-range", 0, 524288000]
        ]
      }

      var uploadDetails = {
        url: 'https://ac.testing.s3.amazonaws.com/',
        method: 'POST',
        data: {
          key: file.name, 
          acl: 'public-read', 
          // application/octet-stream is the default format used by S3
          'Content-Type': file.type != '' ? file.type : 'application/octet-stream', 
          AWSAccessKeyId: '<my-access-key-id>',
          policy: policy, 
          signature: '<my-access-signature>',
          filename: file.name, 
        },
        file: file
      };


      if (file) {
        // Upload to Amazon S3
        file.upload = Upload.upload(uploadDetails).then(function(success) {
          console.log(JSON.stringify(success) );
        },function(error) {
          console.log(error);
        },function(progress) {
          console.log(JSON.stringify(progress) );
        });
      }  

那么我哪里错了?

编辑

我没有做的几件事是根据 Base64 编码对策略和签名进行编码。

该过程涉及对您的策略进行编码,然后使用该生成的代码以及您的 AWS 秘密访问密钥来生成 SHA-1 HMAC 代码。即使在这之后它仍然 returns 相同的错误。

我还为存储桶添加了另一个 权限。它与此处已定义的策略和 CORS 设置相匹配,但定义为每个人:

编辑 2

我创建了一个名为 ac-k24-uploads 的新存储桶并更新了 url 以匹配此:

uploadDetails = {
    url: 'https://ac-k24-uploads.s3.amazonaws.com/',

现在返回的错误是这样的:

编辑 3

环顾四周,亚马逊不喜欢的 headers 似乎正在添加到请求中。我在 ng-file-uploads 上试过了,它可以工作,但在我自己的机器上却不行。对此的修复似乎是像这样删除这些 headers:

method: 'POST',
  headers: {
    'Authorization': undefined
  },

但我仍然遇到同样的错误。为什么将这些 headers 附加到此请求?

编辑 4

即使上面的代码 headers 仍然被添加到不同的地方,所以我找到它并删除它们。我现在收到的错误是:

这与 CORS 无关。

这是因为你的存储桶名称中的点。

如果您的桶确实是美国标准的(example-bucket.s3.amazonaws.com 不一定是 "US Standard" URL)那么这就是您需要的:

var 上传详细信息 = { url: 'https://s3.amazonaws.com/ac.testing/', ...

这称为基于路径或路径样式 URL,其中存储桶表示为路径的第一个元素,而不是将其包含在主机名中。

如果存储桶名称有一个点,这是必需的,对于非美国标准的存储桶,s3. 需要 s3-region.

这是通配符 SSL/TLS 证书的限制。 S3 提供了对 *.s3[-region].amazonaws.com 有效的证书,此类证书的规则规定 * 不能 匹配一个点...因此该证书被视为无效,因此它是一个 "insecure response."

或者,只需创建一个带有破折号而不是点的存储桶,您的代码应该可以按原样运行。

由于您使用的是 Signature V2,因此任一主机名构造都会为其他方面相同的请求生成相同的签名。 Sig V4 不正确。

实际问题有两个:

  • header不正确作为“授权header 即使从代码的 Upload.upload 部分删除后仍然存在。 为了解决这个问题,我不得不从我的 api.injector 代码中删除 object - 这是它被添加的地方。

    delete config.headers['Authorization']
    
  • 从 EDIT3 开始,我生成的签名是错误的 - 所以我不得不重新生成它。

感谢迈克尔的帮助。