使用curl发起带API Key与Secret授权的PUT请求遇401错误求解
API请求401未授权:授权方式疑问与排查
背景信息
调用某SaaS平台API时,生成了两类凭证:
- API Key ID:
631f39f37564not/631f39f475646real/635c1192756key - Secret Key:
-----BEGIN RSA PRIVATE KEY----- ABCDE1234 -----END RSA PRIVATE KEY-----
使用以下bash脚本发起请求:
#!/bin/bash export FIELD=90 HOST=https://example.com PUT_BODY="{\"value\":\"${FIELD}\",\"valueObjectType\":\"String\"}" curl -sk -X PUT "${HOST}/api/v3/xyz/endpoint" \ -H 'content-type: application/json' \ -H 'x-requested-with: XMLHttpRequest' \ -H "referer: ${HOST}/" \ -H "Authorization: apikey 631f39f37564not/631f39f475646real/635c1192756key" \ -d"${PUT_BODY}" | jq '.'
请求返回401未授权错误:
{ "error": { "status_code": 401, "status": "Unauthorized" } }
疑问
- 当前
-H "Authorization: apikey 631f39f37564not/631f39f475646real/635c1192756key"的API Key指定方式是否正确? - 是否需要在请求中附加Secret Key?
- 注:无法使用Bearer Token,只能用API Key授权。
解答
1. 当前Authorization头的正确性存疑
apikey <KEY_ID>这种格式是部分平台的授权方式,但结合你持有RSA私钥的情况,大概率不符合该平台的实际要求:
- 若平台采用Basic认证,通常需要将
API Key ID:Secret Key拼接后做Base64编码,格式为Authorization: Basic $(echo -n "KEY_ID:SECRET" | base64),但你这里是RSA私钥,这种方式可能性极低。 - 若平台采用RSA签名认证,仅传Key ID完全不够,需要用私钥对请求的关键信息(如HTTP方法、请求路径、时间戳、请求体哈希等)生成签名,再将Key ID和签名一起放在请求头中(比如
Authorization: apikey {KEY_ID}:{SIGNATURE},或单独设置签名头)。 - 另外需注意:部分平台对
apikey的大小写有要求(比如ApiKey或APIKey),需严格匹配文档规范。
2. 绝对不能直接附加Secret Key(RSA私钥)
你持有的是RSA私钥,绝对不能将其直接放在请求头或请求体中传输,这会导致凭证泄露,引发安全风险。正确的用法是用私钥对请求内容做签名,服务端会用对应的公钥验证签名的有效性,以此确认请求的合法性。
3. 下一步排查建议
- 优先查阅该SaaS平台的API文档,找到「API Key授权」「签名认证」相关章节,明确以下规则:
- 授权头的具体格式要求;
- 签名需要覆盖的请求内容(如是否包含时间戳、HTTP方法、URI等);
- 签名使用的算法(如SHA256withRSA)。
- 检查API Key ID是否复制正确(比如是否有多余的斜杠、字符遗漏);
- 尝试发起最简单的GET测试请求(若平台提供),排除PUT请求体的影响,先验证授权方式是否正确。
内容的提问来源于stack exchange,提问作者100MIL
相关产品推荐
相关产品推荐

