这类问题我又碰上了一次。在 Windows 10 的 Python 3.11 里用 requests 直接调腾讯混元的 OpenAI 兼容端点,POST 到 /v1/chat/completions 一直回 401,原文是 AuthFailure.SignatureFailure The signature is invalid,同一份 SecretId 用控制台调试工具能通,换成官方 SDK 也正常。

第一反应是「时间戳取自本地时钟 与服务器差出五分钟」,验证下来不成立。

原因不止一个,得分开看。签名用的 Host 与实际请求域名不一致;SecretKey 末尾带换行 参与签名后摘要就对不上;请求头里的 Action 与路径不匹配 签名原文拼错。

上来先把参与签名的原始串按顺序打出来核对

python -c "print(open('canonical.txt').read())"

接着确认机器时间与 NTP 同步 把偏差压到 30 秒内

w32tm /resync; python -c "import time;print(int(time.time()))"

然后用官方 SDK 发一次最小请求 确认凭证本身有效

python -c "from tencentcloud.common.credential import Credential;print(Credential('id','key'))"

等前面都确认过,再把 SecretKey 去掉首尾空白后重新计算签名

python -c "k=open('sk.txt').read().strip();print(len(k),k[-4:])"

怎么算真的好了,看的是同一批现象。同样请求返回 200,返回体里不再有 AuthFailure,签名原文与调试工具生成的串逐字一致。

签名报错和密钥无效返回的 code 很像,先用 SDK 排除凭证问题,再回头查拼接顺序,能省一半时间。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189