srihash.org не работает для файла.js с caesiumjs.org
Я сгенерировал следующий код, используя https://www.srihash.org/ для URL https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js:
<script src="https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js"
integrity="sha384-CAN0Iz/H09oATWPeJZclEOAM/nF1cq3DSuAbxi9IMbZIx8m3ERInrpuk11n+lHRq"
crossorigin="anonymous"></script>
При попытке загрузить страницу, содержащую скрипт проверки целостности, я получаю следующую ошибку в Chrome 50 в Windows:
Не удалось найти действительный дайджест в атрибуте "целостность" для ресурса " https://cesiumjs.org/releases/1.21/Build/Cesium/Cesium.js" с вычисленной целостностью SHA-256 "vGCl/67DuYY5UzwNQGGpYh2gztA4PhvD+I4pcX7TWcU=". Ресурс был заблокирован.
Я также попытался сгенерировать хеш вручную (опять же, в Windows, openssl-1.0.2h), используя:
openssl dgst -sha384 -binary Cesium.js | openssl base64 -A
в результате чего:
X5EHALkqk8r9hyCKwav7y+6BOUg2dRH90/qSxdytan2SQQB9g8jsYYWLDKzNeKx4
Этот хэш работает при загрузке Cesium.js с Chrome. Тем не менее, возникает вопрос, какой из двух хэшей является правильным... Исключая маловероятную возможность MITM-атаки, я предполагаю, что это как-то связано с окончаниями строк или кодированием. Cesium.js
кажется, что в Windows есть окончания строк, и HTTP-ответ о загрузке его в Chrome прилагается ниже.
Как объяснить разницу между двумя хэшами и какой из них правильный?
Заголовки ответа HTTP для Cesium.js:
HTTP/1.1 200 OK
Cache-Control: max-age=172800
Content-Length: 494091
Content-Type: application/javascript
Content-Encoding: gzip
Last-Modified: Mon, 02 May 2016 15:12:32 GMT
Accept-Ranges: bytes
Server: Microsoft-IIS/8.5
x-amz-id-2: giU2DeYQi87OAkuyr2qKeZx8KRihIY7TV9qcJShi/YVl+C5K50mHeSLFWYhA8k5Oc+A50Oxjh/4=
x-amz-request-id: 112881D9D52248F6
X-Powered-By: ARR/3.0
X-UA-Compatible: IE=edge
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,X-Requested-With
Date: Mon, 30 May 2016 12:49:46 GMT
2 ответа
После некоторых копаний я обнаружил, что хеш, сгенерированный srihash.org, неверен.
Неправильный результат обусловлен сочетанием двух факторов:
Cesium.js от caesiumjs.org всегда подается с
Content-Encoding: gzip
, даже если запрос не содержитAccept-Encoding: gzip
,srihash.org (см. источник) использует xhr2 для получения ресурсов, которые не поддерживают кодировку gzip.
Как вы и подозревали, это явно хромовая ошибка, связанная с кодированием. Другие люди сообщают о проблеме для других сценариев.
Проверьте эту страницу ошибок на несоответствия между chrome и openssl.
В качестве временного решения я бы добавил
vGCl/67DuYY5UzwNQGGpYh2gztA4PhvD+I4pcX7TWcU=
к вашим доверенным атрибутам целостности SHA256 (после проверки, что загруженный скрипт действительно правильный).
Chrome, вероятно, вычисляет этот хэш перед распаковкой, со специальной кодировкой.