Descripción general
Entornos SSI
Introducción
Guía SSI basada en roles. Recorre los tres roles, entiende los límites de datos y compara ejemplos entre SDK web, servidor y móvil.
La identidad autosoberana se entiende mejor cuando cada responsabilidad tiene un propietario claro. El Emisor crea una Credencial Verificable, el Titular la conserva en una bóveda segura del móvil y el Verificador solicita y valida una Presentación Verificable (VP).
Nota importante
[Emisor valida y firma la VC] -> [Titular guarda la VC en el móvil] -> [Titular acepta y crea la VP] -> [Verificador valida la VP]
Conceptos clave
Emisor
Valida datos de origen, firma la credencial y envía una oferta mediante DIDComm.
Titular
Conserva la credencial en una única bóveda móvil y decide qué atributos revelar.
Verificador
Solicita solo los atributos necesarios y valida firmas, valor de desafío y estado.
Registro DID
Publica y resuelve documentos DID mediante CertNet, did:web, ION o un registro interno.
Límites de credenciales
Introducción
Identra separa claramente las responsabilidades: el Emisor crea las VC, el teléfono del Titular es la única bóveda, y el Verificador solo solicita y verifica VP.
Regla más importante
Web y servidor nunca reciben un SDK de custodia. No pueden importar, exportar ni respaldar las VC de los usuarios.
El registro DID no está limitado a CertNet
CertNet es el proveedor predeterminado en sandbox. El mismo SDK puede publicar y resolver documentos DID en CertNet, did:web, ION o un registro interno según la política de despliegue.
Nota importante
SDK ilustrativo, no destinado a producción. Los nombres de paquetes y contratos mostrados en este Overview son documentación de ejemplo.
Emisión de credenciales
Emisor
PASO 01 de 03 en el flujo SSI basado en roles.
¿Quién crea la credencial y dónde se ejecuta el código?
El emisor comprueba los datos, firma una VC y la envía al usuario. Puede integrarse en una web interna, servidor o aplicación.
Límite de datos y claves
Las claves de firma de la organización deben protegerse según el entorno de ejecución, preferiblemente con HSM en servidor.
Referencia
| Entorno | Ejemplo de SDK | Cuándo usarlo |
|---|---|---|
| Cliente web | @identra/web con JavaScript o TypeScript en navegador | Herramientas internas de emisión con política de claves controlada |
| Servidor | @identra/node o identra-go | Servicios de firma protegidos con HSM o KMS administrado |
| Aplicación móvil | @identra/react-native, Android SDK o iOS SDK | Aplicaciones internas de emisión administradas |
Pasos del flujo
- Inicializar: Inicializa el SDK para el entorno en ejecución.
- Crear DID: Crea o carga el DID del emisor en el registro DID seleccionado.
- Firmar VC: Firma una Credencial Verificable para el DID del destinatario.
- Enviar oferta: Envía la oferta de credencial por DIDComm.
Ejemplo de código
1. Elegir entorno de ejecución
2. Elegir SDK e idioma
import { Identra } from '@identra/web';
// SDK ilustrativo, no destinado a producción.
const identra = new Identra({
environment: 'sandbox',
didRegistry: {
defaultProvider: 'certnet',
providers: ['certnet', 'did:web', 'ion', 'internal-ledger']
},
mediatorUrl: 'https://mediator.sandbox.identra.dev'
});
// Se ejecuta para el emisor en web, servidor o una app interna.
const issuer = await identra.issuer.create({
did: 'did:identra:university',
keyProtection: 'platform-secure-storage'
});
// Un documento DID puede publicarse en varios registros; CertNet es solo el proveedor predeterminado de sandbox.
await issuer.publishDidDocument({
registries: ['certnet', 'did:web']
});
const credential = await issuer.issue({
// El DID del Titular se obtiene después de establecer la conexión o desde el sistema de negocio.
subjectDid: 'did:identra:holder',
type: 'UniversityDegree',
claims: { degree: 'Information Technology', graduationYear: 2026 }
});
// La credencial no se coloca en el QR; el QR solo inicia la conexión DIDComm.
await issuer.didcomm.sendCredentialOffer({ credential, connectionId });Detalles
El DID del Titular se obtiene después de establecer la conexión o desde el sistema de negocio. La credencial no se coloca en el QR; el QR solo inicia la conexión DIDComm.
Verificación de credenciales
Verificador
PASO 03 de 03 en el flujo SSI basado en roles.
¿Cómo confía el verificador en una VP?
El verificador recibe una VP, extrae los DID del titular y del emisor, resuelve los documentos DID mediante el proveedor de registro correspondiente como CertNet, did:web o ION, y luego comprueba firmas, desafío y estado de revocación.
Límite de datos y almacenamiento
Un verificador puede ejecutarse en web, servidor o aplicación, pero no debe almacenar VC como si fuera un Titular.
Orientación
- Crear solicitud: Crea una solicitud de presentación con un desafío resistente a repetición.
- Mostrar QR: Muestra un QR que contiene la invitación DIDComm.
- Recibir VP: Recibe la VP mediante la conexión recién establecida.
- Resolver y verificar: Resuelve los DID del titular y emisor con el proveedor de registro y verifica.
Ejemplo de código
1. Elegir entorno de ejecución
2. Elegir SDK e idioma
import { Identra } from '@identra/web';
// SDK ilustrativo, no destinado a producción.
const identra = new Identra({
environment: 'sandbox',
didRegistry: {
defaultProvider: 'certnet',
providers: ['certnet', 'did:web', 'ion', 'internal-ledger']
},
mediatorUrl: 'https://mediator.sandbox.identra.dev'
});
// Se ejecuta para el verificador en web, servidor o app.
const verifier = await identra.verifier.create({
did: 'did:identra:jobs-example'
});
const request = await verifier.createPresentationRequest({
credentialType: 'UniversityDegree',
// Solicita solo los atributos necesarios para reducir la información revelada por el titular.
fields: ['degree', 'graduationYear'],
challenge: crypto.randomUUID()
});
const qrDataUrl = await verifier.createQr(request);
const presentation = await verifier.didcomm.waitForPresentation(request.id);
const result = await verifier.verify({
presentation,
// El SDK resuelve el documento DID desde el proveedor de registro correspondiente.
resolveDid: (did) => identra.didRegistry.resolveDidDocument(did),
checkCredentialStatus: true
});
if (result.verified) grantAccess();¿Te resultó útil esta página?
Cuéntanos qué opinas para ayudarnos a mejorar.