IBM Cloud Object Storage报nosuchkey错误:缺失密钥及生成方法咨询
为什么会出现
nosuchkey错误?该用什么密钥? 我之前也碰到过类似的坑——你现在用的IAM Bearer Token并不适用于IBM Cloud对象存储的S3兼容API请求,这才导致了看似“密钥找不到”的nosuchkey错误。S3风格的接口认的是HMAC密钥对(Access Key ID + Secret Access Key),而不是直接用IAM Token来授权。
怎么生成HMAC密钥对?
步骤很简单,跟着来:
- 登录IBM Cloud控制台,打开你的对象存储实例页面
- 左侧菜单点「服务凭证」,然后点「新建凭证」
- 给凭证起个名字(比如
cdn-upload-creds),一定要勾选「包括HMAC凭证」(默认是不勾的,这是关键) - 权限选「Writer」就够了(满足上传文件的需求),然后点「添加」
- 生成的凭证里,
access_key_id就是你的Access Key,secret_access_key是对应的Secret Key,把这俩存好别丢了
修改你的curl命令(用HMAC认证)
直接用HMAC签名的curl请求示例如下,把占位符换成你的实际信息就行:
# 替换成你自己的密钥、桶名和文件路径 ACCESS_KEY="你的access_key_id" SECRET_KEY="你的secret_access_key" BUCKET_NAME="你的桶名称" LOCAL_FILE="a-picture.png" REMOTE_FILE="a-picture.png" # 生成签名需要的日期和签名串 DATE=$(date -R) SIGNATURE_STRING="PUT\n\nimage/png\n$DATE\n/$BUCKET_NAME/$REMOTE_FILE" SIGNATURE=$(echo -en "$SIGNATURE_STRING" | openssl sha1 -hmac "$SECRET_KEY" -binary | base64) # 执行上传请求 curl -X PUT "https://s3-api.us-geo.objectstorage.softlayer.net/$BUCKET_NAME/$REMOTE_FILE" \ -H "Date: $DATE" \ -H "Content-Type: image/png" \ -H "Authorization: AWS $ACCESS_KEY:$SIGNATURE" \ -H "x-amz-acl: public-read" \ -T "$LOCAL_FILE"
如果嫌curl签名麻烦,也可以用AWS CLI来操作:先配置好HMAC密钥和IBM的S3端点,之后上传就很简单了:
# 配置AWS CLI(适配IBM存储) aws configure set aws_access_key_id $ACCESS_KEY aws configure set aws_secret_access_key $SECRET_KEY aws configure set default.s3.endpoint_url https://s3-api.us-geo.objectstorage.softlayer.net # 上传并设置公开读权限 aws s3 cp a-picture.png s3://$BUCKET_NAME/a-picture.png --acl public-read
补充:关于IAM Token的使用
如果非要用IAM Token来做S3请求,得额外加x-amz-api-key头(值是服务凭证里的apikey),而且权限配置要到位,但这种方式在S3兼容接口里容易出兼容性问题,真心不如HMAC密钥好用。
内容的提问来源于stack exchange,提问作者owhc
相关产品推荐
相关产品推荐

