notes icon indicating copy to clipboard operation
notes copied to clipboard

AWS S3 命名不当引起的签名验证失败 or aws s3 signature verification failed

Open lanlin opened this issue 6 years ago • 6 comments

场景

日常在操作系统中,我们对于目录和文件的命名时很随意的。带空格和特殊字符都很常见。 但是,如果直接将这些文件以原有名称上传的 AWS S3 可能会引起一系列未知后果。

例如,签名验证失败,上传文件无法访问等。 比如,文件名含有空格时,S3 会自动将其转变为 “+” 号。而且如果有多个连续空格的情况,还会丢失。 这就导致签名和访问地址都出现错误。

建议

遵照 S3 文档要求的命名规范,对象键和元数据 来对 key 直径命名。

1.安全字符:0-9 a-z A-Z! - _ . * ' ( )

2.可能需要特殊处理的字符:

键名中的以下字符可能需要另外进行代码处理,并且可能需要以十六进制形式在 URL 中编码或引用。其中部分字符是不可打印的字符,浏览器可能无法处理它们,这也需要特殊处理:

表示和的符号 (“&”) 美元 (“$”) ASCII 字符范围 00–1F 十六进制(0–31 十进制)和 7F(127 十进制) “At”符号 (“@”) 等于 (“=”) 分号 (“;”) 冒号 (“:”) 加号 (“+”) 空格 – 大量连续空格可能会在某些使用情形中丢失(特别是多个空格) 逗号 (“,”) 问号 (“?”)

3.要避免的字符:

避免在键名中使用以下字符,因为这些字符需要进行大量的特殊处理,才能在所有应用程序间保持一致性。

反斜杠 ("\") 左大括号 (“{”) 不可打印的 ASCII 字符(128–255 十进制字符) 插入符号 (“^”) 右大括号 (“}”) 百分比字符 (“%”) 重音符/反勾号 (“`”) 右方括号 (“]”) 引号 “大于”符号 (“>”) 左方括号 (“[”) 波浪字符 (“~”) “小于”符号(“<”) “井号”字符 (“#”) 竖线 (“|”)

lanlin avatar Feb 15 '19 07:02 lanlin

事实证明AWS官方也 TM 是扯淡,所谓的安全字符,也不见得安全。

当文件名中包含 ! ' ( )字符,并开启 S3 的事件通知到 SNS,最终收到的 SNS 签名始终验证失败。

也就是说真正安全的唯有:0-9 a-z A-Z - _ . *

lanlin avatar Feb 15 '19 07:02 lanlin

事实证明AWS官方也 TM 是扯淡,所谓的安全字符,也不见得安全。

当文件名中包含 ! ' ( )字符,并开启 S3 的事件通知到 SNS,最终收到的 SNS 签名始终验证失败。

也就是说真正安全的唯有:0-9 a-z A-Z - _ . *

老哥,google搜到了你这个issue,我也遇到了同样的问题,但发现有( )之类的字符时,mac和linux是好的,win会报错。

调试中看到,win会把url里面的( )转义成%XX的形式,但S3不支持%,所以坑貌似在这边。

如果理解有误请指正。

harryeti avatar Jun 15 '20 09:06 harryeti

时间久了,我也记不太清了。貌似跟你说的这个还不太一样。 我记得是 S3 开启了putObject之类的新增文件的事件通知,事件的接收方是 SNS,SNS会把信息签名后发送给订阅程序。

然后我对收到的SNS签名进行验证时,发现怎么验证都是错的,最终排查到S3文件名中包含 ! ' ( )时,触发给SNS的那条信息经过SNS签名后就有问题。

不知道是不是S3事件环节,还是SNS接收环节,或者SNS签名环节对这部分数据进行了转义。你可以研究下。

lanlin avatar Jun 15 '20 10:06 lanlin

请问有解吗

Littlehhao avatar May 27 '23 16:05 Littlehhao

@Littlehhao 你只有咨询下 aws 官方了,定位到问题后,后来没有继续去测试了。我这边的做法是直接不使用 0-9 a-z A-Z 以外的字符,比如可以尝试将文件名转为十六进制的字符串

lanlin avatar May 29 '23 01:05 lanlin

请问有解吗

同意 @lanlin 说的,你看aws给的例子,https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/object-keys.html 。

""" 以下是有效对象键名的示例:

  • 4my-organization
  • my.great_photos-2014/jan/myvacation.jpg
  • videos/2014/birthday/video1.wmv

"""

也就是只用 0-9a-zA-Z./-_

harryeti avatar May 30 '23 03:05 harryeti