Google Cloud带CDN的私有存储桶签名URL访问异常排查
签名密钥与后端/域名的绑定错误
检查CDN后端b-backend是否正确关联了b-sign-key,同时确认CDN的签名验证规则中,b.example.com域名是否启用了签名验证,并指定使用b-sign-key。很多时候会出现密钥绑定到错误后端,或者域名规则未关联对应密钥的情况,导致签名验证失败返回AccessDenied。签名URL生成参数错误
确认NestJS生成b.example.com的签名URL时,使用的是b-sign-key的密钥名称和密钥值,而非a-sign-key。另外检查生成签名时是否正确传入了b.example.com作为主机头参数——CDN验证签名时会校验请求的主机头与签名生成时的主机头是否一致,若不匹配会直接拒绝访问。负载均衡映射规则未生效
检查负载均衡的主机路径映射规则优先级:确保b.example.com/*的规则优先级高于默认规则或其他可能匹配b.example.com请求的规则。同时验证规则中的主机头是否完全匹配(比如大小写、拼写是否和实际访问的b.example.com一致),避免因规则不匹配导致请求被转发到a-backend,进而因密钥不匹配触发权限拒绝。b-bucket的权限配置缺失
检查b-bucket是否授予了b-backend对应的服务账号(或CDN访问角色)读取存储桶文件的权限。如果a-bucket配置了对应权限但b-bucket未配置,CDN在拉取b-bucket文件时会被存储桶直接拒绝,返回AccessDenied。CDN签名验证开关或算法不匹配
确认b.example.com对应的CDN配置中,签名验证功能已开启,且签名算法(如SHA1、SHA256)与NestJS生成签名时使用的算法完全一致。若算法不匹配,CDN无法验证签名有效性,会返回权限错误。域名与CDN的关联未完成
检查b.example.com是否已正确添加到CDN实例并完成域名验证,DNS解析是否生效(可通过nslookup或dig命令确认)。若域名未完成CDN关联,请求可能未经过CDN签名验证流程,直接被存储桶拒绝。
内容的提问来源于stack exchange,提问作者Hyeonjun Jeong

