Saltar al contenido
ecdsa.com
WebCryptoWebCrypto

Mensaje de error

TypeError: Cannot read properties of undefined (reading 'digest')

También se muestra como

  • TypeError: Cannot read properties of undefined (reading 'importKey')
  • TypeError: can't access property "digest", crypto.subtle is undefined
  • TypeError: undefined is not an object (evaluating 'crypto.subtle.digest')

El texto es el TypeError genérico del motor: Chromium/V8, «Cannot read properties of undefined (reading 'digest')»; Firefox, «can't access property \"digest\", crypto.subtle is undefined»; Safari/WebKit, «undefined is not an object (evaluating 'crypto.subtle.digest')». El nombre del método corresponde a la primera llamada (`importKey`, `sign`, `generateKey`…).

WebCrypto — window.crypto.subtle is undefined outside a secure context (Chromium / Firefox / WebKit)

Qué significa

`crypto.subtle` no existe en esta página, así que la primera llamada sobre él falla con un TypeError genérico de «undefined». Los navegadores solo exponen `SubtleCrypto` en contextos seguros: páginas servidas por HTTPS, desde `http://localhost` / `127.0.0.1` o desde URL `file:`. El mismo código funciona en tu equipo en localhost y deja de funcionar en cuanto la página se abre por HTTP simple desde otro nombre de host o dirección IP. `crypto.getRandomValues` sigue funcionando, lo que hace que el fallo parezca selectivo.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Detectarlo y fallar con un mensaje claro

    Comprueba `window.isSecureContext` antes de usar WebCrypto. No recurras en silencio a un polyfill criptográfico en JavaScript: sin TLS, la integridad de la página no está garantizada de todos modos.

    js
    if (!window.isSecureContext || !globalThis.crypto?.subtle) {
      throw new Error("WebCrypto needs HTTPS (or http://localhost). Current origin: " + location.origin);
    }
    const digest = await crypto.subtle.digest("SHA-256", data);
  2. 2.

    Servir la página por HTTPS

    Usa TLS en todos los entornos, incluidos los servidores de desarrollo que abres desde otros dispositivos; herramientas como mkcert crean certificados de confianza local.

    bash
    # Local HTTPS for a dev server reachable from other devices
    mkcert -install
    mkcert dev.example.test 192.168.1.20 localhost
    # Vite: server.https = { key: fs.readFileSync("dev.example.test+2-key.pem"), cert: fs.readFileSync("dev.example.test+2.pem") }

Errores relacionados

Explorar toda la base de datos de errores de firma