← 中文资源

简体中文版本

SRI 失败 — integrity 属性中找不到有效摘要

修复 CDN 资源与 SRI 哈希不一致时的 Failed to find a valid digest,正确重算哈希并自动化。

阅读英文原文

症状

  控制台错误里同时有两个哈希——这就是全部诊断:integrity 属性里的是期望值,错误里 computed 的是实际字节算出的值,不一致即拦截。验证用户实际收到什么字节:curl 拉 CDN 文件算 sha384 摘要——与错误里的 computed 一致说明文件合法而属性过期;与源站不同说明 CDN 在改写内容,CDN 行为才是 bug。部署、清缓存、升级 vendored 库之后爆发、源站同文件正常,是标准时间线。

诊断思路

  先读完整 SRI 错误拿两个摘要;再对 CDN 实际服务字节做哈希,区分“属性过期”与“CDN 变换”;最后检查构建管线顺序——哈希生成必须晚于压缩、横幅注释等最终变换,先哈希后压缩必然产生过期摘要。变体错配(minified 与原始、BOM、gzip 流字节当原始字节)是手工生成哈希的高频坑。

根因

  子资源完整性拦截任何字节哈希不等于声明摘要的资源。服务文件与记录哈希不合——文件变了、变体错配、或变换在哈希之后改了字节——浏览器就拒绝该资源,页面失去脚本或样式。

修复与验证

  用 CDN 交付的确切字节重算摘要并更新属性;哈希生成作为构建最后一步,从产物自动写进模板;对受 SRI 保护的资源禁用 CDN 的即时变换(优化、令牌注入)。验证时重新生成后资源加载零 SRI 错误,并加 CI 检查在每次部署时从产物重算摘要。直接删 integrity 属性恢复加载等于拆掉恰好抓住真实不一致的防篡改保护——修管线而不是删护栏。

代码示例

Failed to find a valid digest in the 'integrity' attribute
for resource 'https://cdn.example.com/lib.min.js' with
computed SHA-256 integrity 'k4dG9l...nQ=='.
The resource has been blocked.
curl -s https://cdn.example.com/lib.min.js \
  | openssl dgst -sha384 -binary | openssl base64 -A
# from the exact artifact the CDN will serve:
DIGEST=$(curl -s https://cdn.example.com/lib.min.js \
  | openssl dgst -sha384 -binary | openssl base64 -A)
echo "sha384-$DIGEST"
<script src="https://cdn.example.com/lib.min.js"
        integrity="sha384-EXAMPLEDIGEST="
        crossorigin="anonymous"></script>