Important Notes

  • En OpenTok.js 2.27.0+, el cifrado de extremo a extremo no funcionará cuando se conecte a clientes que utilicen una versión anterior de OpenTok.js. Cuando actualices tu aplicación para utilizar OpenTok.js 2.27.0+, asegúrate de que todos los clientes utilizan OpenTok.js 2.27.0+ si la aplicación utiliza cifrado de extremo a extremo.
  • La compatibilidad con el cifrado de extremo a extremo en navegadores basados en WebKit, por ejemplo Safari en macOS/iOS y Chrome en iOS, solo está disponible a partir de la versión OpenTok.js 2.30.0.

Note about Content Security Policies (CSP)

Si el script-src asegúrese de que 'wasm-unsafe-eval' está especificado. De lo contrario, WebAssembly, necesario para el cifrado de extremo a extremo, no podrá cargarse ni ejecutarse en la página.

Initializing a session with a secret

Las sesiones cifradas de extremo a extremo se crean mediante las API del servidor (véase Activación del cifrado mediante la función API REST). Para que un cliente web se una a una sesión cifrada de extremo a extremo, especifique un secreto de cifrado al llamar a la función OT.initSession() método:

const session = OT.initSession('api-key', 'session-id', {
  encryptionSecret: 'initialEncryptionSecret',
});

Un secreto válido es una cadena de entre 8 y 256 caracteres. El secreto puede modificarse posteriormente con la función Session.setEncryptionSecret() (véase Modificación del método secretomás abajo).

Checking whether the browser supports end-to-end encryption

Utiliza el OT.hasEndToEndEncryptionSupport() para comprobar si el navegador del cliente admite el cifrado de extremo a extremo:

if (OT.hasEndToEndEncryptionSupport()) {
  // Proceed with connecting to the session
}
else {
  // Notify the user that they cannot join the session
}

El cifrado de extremo a extremo no está soportado actualmente en Firefox.

Changing the secret

Puede cambiar el secreto utilizando la opción Session.setEncryptionSecret() después de que la sesión se haya conectado:

await session.setEncryptionSecret('newEncryptionSecret');

Events and errors

Los eventos y errores son esenciales para gestionar el comportamiento del cifrado dirigido por el usuario. El cifrado de extremo a extremo utiliza el modelo de secreto compartido: se espera que todos los participantes en la sesión utilicen el mismo secreto para cifrar sus medios y descifrar los de los demás.

Un objeto Subscriber envía un encryptionSecretMismatch cuando el abonado no puede descodificar un flujo multimedia. Es importante comunicar al usuario que los medios no se reciben debido a un error de codificación y no a un fallo de conexión o de audio/vídeo:

subscriber.on('encryptionSecretMismatch', () => {
  // Activate a UI element communicating that there's been an encryption secret mismatch.
});

Además, es importante comunicar a los usuarios que el cifrado se ha activado correctamente. Un objeto Suscriptor envía un evento encryptionSecretMatch cuando el suscriptor es capaz de decodificar los medios del flujo después de un desajuste previo.

Además, es importante comunicar a los usuarios que el cifrado se ha activado correctamente. Un objeto Suscriptor envía un evento encryptionSecretMatch cuando el suscriptor es capaz de decodificar los medios del flujo después de un desajuste previo.

subscriber.on('encryptionSecretMatch', () => {
  // Activate a UI element communicating that the media is being properly decrypted.
});

En Session.connect() se invoca con un error si el cliente intenta conectarse a una sesión cifrada de extremo a extremo que se inicializó con un secreto de cifrado no válido. Un secreto válido es una cadena de entre 8 y 256 caracteres. Para una mejor experiencia de usuario, la aplicación debe detectar un secreto no válido antes de llamar a la llamada de retorno OT.initSession() método. En el siguiente ejemplo, se inicializa una sesión con un secreto vacío (y por tanto inválido), lo que provoca un error al intentar conectarse:

const session = OT.initSession(
 'api-key',
 'e2ee-session-id',
 {
   encryptionSecret: '',
 }
)

session.connect('token', (error) => {
  if (error && error.name === 'OT_INVALID_ENCRYPTION_SECRET') {
    /*
    The application should communicate that the secret was invalid.
    */
  }
});

En Session.connect() se invoca con un error si un usuario intenta conectarse a una sesión cifrada de extremo a extremo en un navegador que no soporta el cifrado de extremo a extremo.

const session = OT.initSession(
 'api-key',
 'e2ee-session-id',
 {
   encryptionSecret: 'validEncryptionSecret',
 }
)

session.connect('token', (error) => {
  if (error && error.name === 'OT_UNSUPPORTED_BROWSER') {
    /*
    The error will have the message 'Tried to connect an e2ee session but the browser does not support e2ee'
    The application should communicate that the browser does not support encryption.
    */
  }
});

Si un usuario intenta publicar en una sesión cifrada de extremo a extremo sin haber especificado un secreto de cifrado, el Session.publish() con un error. Para obtener la mejor experiencia de usuario, la aplicación debe validar un secreto proporcionado por el usuario antes de llamar a la función session.publish() método:

session.publish(publisher, (error) => {
  if (error && error.name === 'OT_STREAM_CREATE_FAILED') {
    /*
    The error will have the message 'Tried to publish to an e2ee session but encryption secret was not set'
    The application should communicate that the secret was not set.
    */
  }
});

Si un usuario intenta suscribirse en una sesión cifrada de extremo a extremo sin haber especificado un secreto de cifrado, el Session.subscribe() con un error. Para obtener la mejor experiencia de usuario, la aplicación debe validar un secreto proporcionado por el usuario antes de llamar a la función Session.subscribe() método:

subscriber = session.subscribe(stream, target, opts, (error) => {
  if (error && error.name === 'OT_UNABLE_TO_SUBSCRIBE') {
    /*
    The error will have the message 'Tried to subscribe to an e2ee stream but encryption secret was not set'
    The application should communicate that the secret was not set.
    */
  }
});