一个客户想在他们网站上的所有 CSS 和 JS 资产上使用 SRI,但他们在 Firefox 中遇到了一个非常奇怪的问题。他们的服务器是一个 apache2 实例,提供 HTML 内容。*
对于任何 ( ) 源,整个虚拟主机都启用了 CORS 。没有缓存或 CDN。
有问题的两个文件是
company.min.css
和company.min.js
为了生成 SRI 哈希,最初使用了SRI 哈希生成器。它的输出有多种算法,如下所示:
<script src="https://example.com/static/company.min.js" integrity="sha256-aKuSpMxn15zqbFa0u0FVA7mAFOSVwIwU4gA3U7AZf5Y= sha384-WDAg+qGBjbEyE52SdQ5UHdTObTY+jYTL63m9Oy2IJcGZR8AFn0t9JNN7qdut6DBk sha512-bxmUFj1FVOVV74+zIYau/HSUcLq9cuneBKoMJyW9dAz//yKFi8eRhyyIezF++2vbGO7cR6Pzm1l9rvnPcrvIrg==" crossorigin="anonymous"></script>
CSS 文件类似。这些被插入到 HTML 中,并在几个不同的浏览器中对该站点进行了测试,结果如下:
- 适用于 Chrome (/Canary)、Opera、Edge 甚至 IE
- 在 Firefox (/Nightly) 中不起作用。
Firefox 只是不喜欢 CSS,说 SHA512 与资源不匹配。无论出于何种原因,它都能很好地处理 JS 文件。
我确认(使用 OpenSSL)上述工具生成的哈希值确实是正确的,而且它在几乎所有浏览器中都可以使用,除了 Firefox 之外的事实让我开始思考。
因此,我尝试使用 Mozilla 自己的 SRI 工具srihash.org对资源进行哈希处理,这是 Mozilla 从他们关于 SRI的博客文章中推荐的。
现在有点奇怪了。
- 对于 CSS 文件,srihash.org 生成一个完全不同的哈希。
- 对于 JS 文件,两个生成器的哈希值相同,并且将我的离线哈希值与 OpenSSL 匹配。
但是,如果我将 CSS 链接替换为 Mozilla 生成的链接,结果如下:
- 在火狐中工作
- 在其他任何地方都不起作用,因为哈希不匹配
问题
我怀疑这是 Firefox 的 SRI 实现中的一些问题。实现的相关讨论是here,但它没有给出资源在Firefox中不同的任何原因。但我不是严格的网络开发人员,那么在不同的浏览器中,不同的 SRI 哈希是否有任何可能的(记录的)原因?
我无法透露确切的服务器/资源。这是一个一般性问题,因此,如果您有任何客观经验或参考授权来源记录了 SRI 实施中的差异,请回答。