Important Notes

  • No OpenTok.js 2.27.0 ou superior, a criptografia de ponta a ponta não funcionará ao se conectar a clientes que utilizam uma versão anterior do OpenTok.js. Ao atualizar seu aplicativo para usar o OpenTok.js 2.27.0 ou superior, certifique-se de que todos os clientes estejam usando o OpenTok.js 2.27.0 ou superior, caso o aplicativo utilize criptografia de ponta a ponta.
  • O suporte à criptografia de ponta a ponta em navegadores baseados no WebKit, como o Safari no macOS/iOS e o Chrome no iOS, só está disponível a partir da versão 2.30.0 do OpenTok.js.

Note about Content Security Policies (CSP)

Se o script-src Se essa diretiva estiver definida, certifique-se de que 'wasm-unsafe-eval' for especificado. Caso contrário, o WebAssembly, necessário para a criptografia de ponta a ponta, será impedido de ser carregado e executado na página.

Initializing a session with a secret

As sessões com criptografia de ponta a ponta são criadas por meio de APIs do servidor (consulte “Ativando a criptografia usando o API REST). Para que um cliente web participe de uma sessão criptografada de ponta a ponta, especifique um segredo de criptografia ao chamar o OT.initSession() método:

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

Um segredo válido é uma sequência de caracteres com comprimento entre 8 e 256 caracteres. O segredo pode ser alterado posteriormente com o Session.setEncryptionSecret() método (consulte Alteração do segredo, abaixo).

Checking whether the browser supports end-to-end encryption

Use o OT.hasEndToEndEncryptionSupport() método para verificar se o navegador do cliente suporta criptografia de ponta a ponta:

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

Atualmente, a criptografia de ponta a ponta não é compatível com o Firefox.

Changing the secret

Você pode alterar o segredo usando o Session.setEncryptionSecret() método após a conexão da sessão:

await session.setEncryptionSecret('newEncryptionSecret');

Events and errors

Eventos e erros são essenciais para gerenciar o comportamento da criptografia orientada pelo usuário. A criptografia de ponta a ponta utiliza o modelo de segredo compartilhado: espera-se que todos os participantes da sessão utilizem o mesmo segredo para criptografar seus dados e descriptografar os dados dos demais participantes.

Um objeto Subscriber despacha um encryptionSecretMismatch situação em que o assinante não consegue decodificar a mídia de um stream. É importante informar ao usuário que a mídia não está sendo recebida devido a uma incompatibilidade de criptografia e não por causa de uma falha na conexão ou de um problema de áudio/vídeo:

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

Além disso, é importante informar aos usuários que a criptografia foi ativada com sucesso. Um objeto `Subscriber` dispara um evento `encryptionSecretMatch` quando o assinante consegue decodificar a mídia do fluxo após uma incompatibilidade anterior.

Além disso, é importante informar aos usuários que a criptografia foi ativada com sucesso. Um objeto `Subscriber` dispara um evento `encryptionSecretMatch` quando o assinante consegue decodificar a mídia do fluxo após uma incompatibilidade anterior.

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

O Session.connect() A função de retorno é chamada com um erro se o cliente tentar se conectar a uma sessão criptografada de ponta a ponta que tenha sido inicializada com um segredo de criptografia inválido. Um segredo válido é uma sequência de caracteres com comprimento entre 8 e 256 caracteres. Para garantir a melhor experiência do usuário, o aplicativo deve detectar um segredo inválido fornecido pelo usuário antes de chamar a OT.initSession() método. No exemplo a seguir, uma sessão é inicializada com um segredo vazio (e, portanto, inválido), o que gera um erro ao tentar se conectar:

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.
    */
  }
});

O Session.connect() A função de retorno é chamada com um erro se um usuário tentar se conectar a uma sessão criptografada de ponta a ponta em um navegador que não ofereça suporte à criptografia de ponta a ponta.

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.
    */
  }
});

Se um usuário tentar publicar em uma sessão criptografada de ponta a ponta sem ter especificado um segredo de criptografia, o Session.publish() A função de retorno é chamada com um erro. Para garantir a melhor experiência do usuário, o aplicativo deve validar o segredo fornecido pelo usuário antes de chamar a 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.
    */
  }
});

Se um usuário tentar se inscrever em uma sessão criptografada de ponta a ponta sem ter especificado um segredo de criptografia, o Session.subscribe() A função de retorno é chamada com um erro. Para garantir a melhor experiência do usuário, o aplicativo deve validar o segredo fornecido pelo usuário antes de chamar a 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.
    */
  }
});