Безопасный контекст: HTTPS как обязательное условие

Web Crypto API доступен только в защищённых контекстах, и это одно из ключевых ограничений, определяющих его архитектуру и модель безопасности. Ограничение связано не с особенностями JavaScript, а с политиками браузеров, которые жёстко отделяют криптографические операции от потенциально небезопасной среды выполнения.

Защищённый контекст (secure context) — это среда, в которой браузер гарантирует целостность и конфиденциальность передаваемых данных. В таких условиях разрешается доступ к чувствительным API, включая Web Crypto API.

К защищённым контекстам относятся:

  • страницы, загруженные по протоколу HTTPS;
  • локальный хост (localhost, 127.0.0.1, ::1);
  • некоторые внутренние схемы браузера, например extension-страницы.

Любой другой источник, включая HTTP, рассматривается как потенциально небезопасный.

Проверка выполняется через встроенное свойство:

window.isSecureContext

Если значение false, доступ к crypto.subtle будет недоступен.

Причины ограничения Web Crypto API

Web Crypto API работает с криптографическими примитивами: генерацией ключей, подписью, шифрованием и хешированием. Эти операции предполагают, что входные данные и результаты не будут скомпрометированы.

Использование в небезопасной среде нарушает базовые свойства криптографии:

  • возможность подмены JavaScript-кода через MITM-атаку;
  • перехват или модификация ключей до их использования;
  • внедрение вредоносного скрипта до вызова криптографических функций.

Если код может быть изменён до выполнения, криптографическая защита теряет смысл.

HTTPS как гарантия целостности

HTTPS обеспечивает два ключевых свойства:

  • шифрование канала связи
  • проверка подлинности сервера через сертификаты

Это означает, что код, загружаемый по HTTPS, не может быть незаметно изменён в пути между сервером и клиентом.

Web Crypto API требует именно этого уровня гарантии, поскольку:

  • ключи могут использоваться для защиты пользовательских данных;
  • операции часто выполняются в браузерных приложениях с высокой чувствительностью;
  • результат криптографии может влиять на авторизацию и доступ к данным.

Поведение API вне защищённого контекста

При попытке обращения к crypto.subtle в небезопасной среде происходит одно из следующих:

  • значение crypto.subtle равно undefined;
  • вызов методов приводит к исключению;
  • некоторые браузеры полностью блокируют объект crypto.

Пример:

if (!window.isSecureContext) {
  console.log("Web Crypto недоступен");
}

Исключение для локальной разработки

Локальные адреса рассматриваются как доверенные:

  • http://localhost
  • http://127.0.0.1
  • http://[::1]

Это сделано для упрощения разработки, поскольку локальная среда считается изолированной от внешнего сетевого трафика.

Однако даже в этом случае поведение может различаться:

  • некоторые API требуют явного HTTPS даже на localhost в строгих режимах;
  • использование прокси или туннелей может изменить контекст на небезопасный.

Ограничения протокола file://

Открытие HTML-файлов напрямую через файловую систему (file://) не создаёт полноценного происхождения (origin). В результате:

  • отсутствует нормальная модель безопасности origin;
  • Web Crypto API может быть недоступен;
  • поведение зависит от браузера.

В современных реализациях чаще всего доступ блокируется полностью.

Проверка доступности Web Crypto API

Корректная проверка включает несколько уровней:

const isCryptoAvailable =
  window.isSecureContext &&
  typeof window.crypto !== "undefined" &&
  typeof window.crypto.subtle !== "undefined";

Даже при наличии crypto объект subtle является основным индикатором поддержки криптографических операций.

Влияние политики mixed content

Даже при использовании HTTPS-страницы доступ к Web Crypto API может быть косвенно ограничен при нарушении политики mixed content.

Mixed content возникает, когда:

  • основная страница загружена по HTTPS;
  • внешние ресурсы загружаются по HTTP.

Хотя сам Web Crypto API не блокируется напрямую, подмена скриптов через HTTP-ресурсы может привести к компрометации логики, использующей криптографию.

Связь с origin и изоляцией данных

Web Crypto API строго привязан к origin. Origin определяется комбинацией:

  • протокола (https/http)
  • домена
  • порта

Ключи, созданные через crypto.subtle.generateKey, привязаны к origin и не могут быть использованы в другом источнике.

Это обеспечивает:

  • изоляцию криптографических ключей между сайтами;
  • невозможность кросс-доменных утечек;
  • защиту от повторного использования ключей в другом контексте.

Пример генерации ключа в защищённом контексте

const key = await crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256
  },
  true,
  ["encrypt", "decrypt"]
);

Данная операция выполняется только при соблюдении условий secure context. В противном случае вызов завершится ошибкой.

Поведение в Service Worker и других окружениях

Service Worker также подчиняется правилам secure context. Даже если он перехватывает запросы HTTPS-страницы, сам worker должен быть зарегистрирован из безопасного источника.

Ограничение распространяется на:

  • Web Workers
  • Service Workers
  • Shared Workers

Все они наследуют контекст происхождения основной страницы.

Причины строгой политики браузеров

Web Crypto API проектировался с учётом угроз:

  • внедрение вредоносного JavaScript через HTTP;
  • подмена библиотек на уровне CDN;
  • атаки типа man-in-the-middle;
  • модификация payload до выполнения шифрования.

Любая из этих атак делает криптографические операции бессмысленными, если отсутствует гарантия целостности кода.

Практическое следствие архитектуры

Размещение криптографической логики в веб-приложении требует обязательного соблюдения следующих условий:

  • использование HTTPS на всех страницах;
  • исключение смешанного контента;
  • контроль происхождения сторонних скриптов;
  • проверка secure context перед выполнением криптоопераций.

Эти ограничения являются частью модели безопасности браузера и не могут быть обойдены средствами JavaScript.

Браузерная совместимость и различия реализации

Несмотря на единый стандарт W3C, реализация secure context может немного отличаться:

  • Chrome и Edge строго блокируют Web Crypto вне HTTPS;
  • Firefox следует аналогичной модели с небольшими исключениями для localhost;
  • Safari может иметь дополнительные ограничения на старых версиях.

Однако во всех современных версиях поведение в целом согласовано.

Проверка происхождения как часть архитектуры приложения

Встроенные проверки позволяют учитывать ограничения ещё на этапе инициализации:

function initCrypto() {
  if (!window.isSecureContext || !crypto.subtle) {
    throw new Error("Web Crypto API недоступен");
  }
}

Такая проверка становится стандартной частью архитектуры приложений, использующих криптографию в браузере.

Взаимодействие с политиками безопасности браузера

Web Crypto API работает в связке с другими механизмами:

  • Content Security Policy (CSP)
  • Same-Origin Policy
  • Secure Context enforcement
  • Permissions Policy

Каждый из этих уровней усиливает изоляцию криптографических операций, снижая вероятность компрометации.

Итоговое значение secure context для Web Crypto

Ограничение на использование Web Crypto API вне HTTPS не является формальностью. Оно формирует базовый уровень доверия к среде выполнения, без которого криптографические операции теряют смысл.

Secure context становится фундаментом, на котором строится вся модель безопасности API, включая генерацию ключей, шифрование и цифровые подписи.