亚马逊 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 将文件上传到我的存储桶。我相信我已经正确设置了存储桶:
- 存储桶名称是 ac.testing
为此的 CORS 配置:
<?xml version="1.0" encoding="UTF-8"?>
< CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
< CORSRule>
< AllowedOrigin>*</AllowedOrigin>
< AllowedMethod>POST</AllowedMethod>
< AllowedHeader>*</AllowedHeader>
< /CORSRule>
< /CORSConfiguration>
我不得不在上面的左括号后面放一个 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 开始,我生成的签名是错误的 - 所以我不得不重新生成它。
感谢迈克尔的帮助。
这个问题已经有人问过
所以我正在尝试通过 angular 库 ng-file-upload 将文件上传到我的存储桶。我相信我已经正确设置了存储桶:
- 存储桶名称是 ac.testing
为此的 CORS 配置:
<?xml version="1.0" encoding="UTF-8"?> < CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> < CORSRule> < AllowedOrigin>*</AllowedOrigin> < AllowedMethod>POST</AllowedMethod> < AllowedHeader>*</AllowedHeader> < /CORSRule> < /CORSConfiguration>
我不得不在上面的左括号后面放一个 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 开始,我生成的签名是错误的 - 所以我不得不重新生成它。
感谢迈克尔的帮助。