|

Anatomía de un JWT PASSport con RCD: Header, Payload y Signature

Toda llamada autenticada mediante STIR/SHAKEN debe contener un JWT PASSport firmado. Su propósito es autenticar la identidad de la llamada. Este PASSport puede contener información como: Caller ID, destino de la llamada, attestation RCD…

¿Dónde se encuentra el JWT PASSport?

En un contexto de STIR/SHAKEN, el JWT PASSporT lo encontraremos en el SIP INVITE, dentro de la cabecera Identity.

INVITE sip:+12155551213@tel.example1.net SIP/2.0 
Via: SIP/2.0/UDP 10.36.78.177:60012;branch=z9hG4bK-524287-1---77ba17085d60f141;rport
Max-Forwards: 69 
Contact: 
To: 
From: : Alice ;tag=9fxced76sl 
Call-ID: 79048YzkxNDA5NTI1MzA0OWFjOTFkMmFlODhiNTI2OWQ1ZTI 
P-Asserted-Identity: Alice 
CSeq: 2 INVITE 
Allow: SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO, MESSAGE, OPTIONS
Content-Type: application/sdp Date: Tue, 16 Aug 2016 19:23:38 GMT 
Identity: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.
eyJhdHRlc3QiOiIrMzQ5MTEyMjIzMzMiLCJvcmlnIjoiKzM0OTg3NjU0MzIxIiwicmNkIjp7Im5hbWUiOiJCYW5jbyBTYW50YW5kZXIiLCJsb2dvIjoiaHR0cHM6Ly9sb2dvLmJhbmNvLmV4YW1wbGUvYmFuY28uc3ZnIiwibmFtZV90eXBlIjoiY29tbWVyY2lhbCIsInJlYXNvbiI6IlZlcmlmaWNhY2nDs24gZGUgaWRlbnRpZGFkIn19.abc123signature456
Content-Length: 122

Identidades en el SIP INVITE

El SIP INVITE es un tipo de mensaje que se utiliza para iniciar una sesión de comunicación, como puede ser una llamada de voz. Al analizarlo encontraremos un buen número de cabeceras  que aportan información sobre la llamada.

Además de la cabecera IDENTITY, contiene otras que también podríamos asociar de alguna manera con un concepto de identidad. Cada uno de ellos tiene un propósito determinado:

  • From: indica la información de contacto del iniciador de solicitud de inicio de llamada. Este es el campo habitualmente modificado en situaciones de spoofing.
  • To: contiene la información sobre el destinatario de la solicitud de inicio de llamada.
  • Contact: proporciona un SIP o SIPS URI que debe usarse para contactar al que inicia la llamada (Alice).
  • PAI (P-Asserted-Identity): este encabezado SIP se utiliza entre entidades SIP de confianza (normalmente intermediarios). Sirve para transmitir la identidad del usuario que envía un mensaje SIP, verificada mediante autenticación. Los contact centers usan este campo cuando necesitan presentar el número de teléfono del cliente, en lugar del suyo propio. También es un campo usado por aplicaciones analíticas o de filtrado de llamadas.

¿Qué forma tiene una JWT PASSport?

En contextos STIR/SHAKEN con branded calling info, entre esas cabeceras del SIP INVITE encontramos también la cabecera “identity header”. En algunos casos también la cabecera “identity-info”. Esto ocurre cuando el PASSporT se transmite en modo “detached”(separado, no incrustado directamente en la cabecera identity), para indicar donde se puede obtener el PASSporT firmado.

La cabecera “identity”, contiene el JWT(JSON Web Token) PASSport codificado en Base64URL:

eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.
eyJhdHRlc3QiOiIrMzQ5MTEyMjIzMzMiLCJvcmlnIjoiKzM0OTg3NjU0MzIxIiwicmNkIjp7Im5hbWUiOiJCYW5jbyBTYW50YW5kZXIiLCJsb2dvIjoiaHR0cHM6Ly9sb2dvLmJhbmNvLmV4YW1wbGUvYmFuY28uc3ZnIiwibmFtZV90eXBlIjoiY29tbWVyY2lhbCIsInJlYXNvbiI6IlZlcmlmaWNhY2nDs24gZGUgaWRlbnRpZGFkIn19.abc123signature456

Cada parte de este código se refiere a un elemento diferente del PASSporT: HEADER, PAYLOAD, SIGNATURE.

Al decodificar esta cabecera IDENTITY, podemos ver el contenido del RCD en formato Json.

HEADER

Incluye el algoritmo de firma empleado y el tipo de token. También incluye la URL al certificado x.509 empleado para la firma de la llamada.

}  
“alg”: “ES256”,
“ppt”: “shaken”,
“typ”: “passport”
“x5u”: “https://certificates.example.com/123456789.pem”
}

PAYLOAD

Contiene las peticiones o el objeto JSON. En un contexto STIR/Shaken típicamente encontraremos:

  • Attestation level
  • Origen de la llamada
  • Objeto RCD (recordemos que es opcional, pero necesario para mostrar la información de marca), con la información de branding. Este contenido está estructurado como una JCard (vCard en JSON) siguiendo el estándar RFC 9123, y es conocido como “Call-Info Token”. Al ir dentro del PASSporT este contenido también está firmado y es verificable. 
{
  "attest": "A",           // 
  "orig": "+34987654321",          // Número origen
  "rcd": {
    "name": "Banco Santander",
    "logo": "https://logo.banco.example/banco.svg",
    "name_type": "commercial",
    "reason": "Verificación de identidad"
  }
}

SIGNATURE

Es la firma criptográfica generada con la clave privada STI del operador.

abc123signature456

JWT PASSport con RCD en modo «detached»

En ocasiones es necesario que el contenido RCD sea transmitido fuera del JWT (por ejemplo para aligerar el peso del PASSport). En esos casos, para garantizar la integridad del RCD, se incluye un hash criptográfico del documento RCD externo dentro del PASSporT. Este hash se conoce como RCDI (RCD Integrity)

"rcdi": "sha256-7d6fd23fda7abc9e8b3..."

Este hash asegura una relación directa entre el JWT y el RCD externo, garantizando que este último no ha sido modificado. 

El objeto RCD puede viajar dentro del JWT firmado. También, puede ser almacenado en un servidor externo (modo detached) localizable a través del header SIP call-info:

Call-Info: ;purpose=info


En este caso, el operador terminante se descarga ese JSON, calcula su hash y lo compara con el rcdi proporcionado en el PASSport.

En soluciones Out-of-band (como TransNexus, Neustar, etc.), el operador terminante recibe una notificación vía API paralela al canal SIP con el passport firmado y URL o el contenido del RCD.  Es decir, aunque el método cambia, se basan en estructuras de datos muy similares.

Publicaciones Similares