Auto-alojamiento
No necesitas usar signed-data.org como tu proveedor de datos. CDS es un estándar
— el SDK, la especificación y los esquemas de dominio son libres de infraestructura. Ejecuta tus propios
ingestores, firma con tu propia clave y sirve tus propios eventos.
Lo que necesitas
Sección titulada «Lo que necesitas»| Componente | Mínimo viable | Producción |
|---|---|---|
| Clave privada | Archivo PEM local | AWS Secrets Manager / KMS |
| Ingestor | Script Python | Lambda / contenedor (cron) |
| Almacén de eventos | Archivos locales | S3 (append-only, versionado) |
| API del consumidor | Lectura desde disco | API Gateway / ALB + Lambda / ECS |
| Servidor MCP | signeddata-mcp-lottery | ECS Fargate detrás de ALB |
Configuración mínima viable (local)
Sección titulada «Configuración mínima viable (local)»pip install signeddata-cds
# Generar clavespython3 -c "from cds import generate_keypairimport os; os.makedirs('keys', exist_ok=True)generate_keypair('keys/private.pem', 'keys/public.pem')"import asynciofrom cds import CDSSignerfrom cds.sources.lottery import MegaSenaIngestor
signer = CDSSigner("keys/private.pem", issuer="https://mycompany.example.com")ingestor = MegaSenaIngestor(signer=signer)events = asyncio.run(ingestor.ingest())
for e in events: print(e.context.summary) print(f" signed_by: {e.integrity.signed_by}") print(f" hash: {e.integrity.hash[:32]}...")Identidad del emisor
Sección titulada «Identidad del emisor»Establece tu issuer al URI de tu organización:
signer = CDSSigner("keys/private.pem", issuer="https://mycompany.example.com")Publica tu clave pública en:
https://mycompany.example.com/.well-known/cds-public-key.pemLos consumidores pueden entonces descubrir y verificar tu clave automáticamente.
Publicar tu vocabulario
Sección titulada «Publicar tu vocabulario»Si ejecutas tu propio emisor CDS, deberías publicar tu vocabulario para que los consumidores puedan dereferenciar los URIs en tus eventos.
-
Crea tu archivo de vocabulario
Crea
vocab/cds.jsonldpara tu organización, listando las clases y propiedades que utilizas. Puedes copiar y adaptar el vocabulario de referencia desdehttps://signed-data.org/vocab/. -
Sírvelo en tu dominio
Sube
vocab/cds.jsonldy cualquier archivo de dominio a tu servidor web o CDN:https://mycompany.example.com/vocab/ → cds.jsonldhttps://mycompany.example.com/vocab/domains/ → archivos de dominiohttps://mycompany.example.com/sources/ → documentos de fuenteshttps://mycompany.example.com/contexts/ → contexto JSON-LDEstablece
Content-Type: application/ld+jsonpara todos los archivos.jsonld. -
Publica tu clave pública
https://mycompany.example.com/.well-known/cds-public-key.pem -
Referencia tu vocabulario en los eventos
Tus eventos deben usar tu URI base:
from cds.vocab import content_type_uri, source_uriMY_BASE = "https://mycompany.example.com"my_content_type = f"{MY_BASE}/vocab/custom-domain/custom-schema"my_source = f"{MY_BASE}/sources/my-api.v1"
Lo que se mantiene igual
Sección titulada «Lo que se mantiene igual»Cuando te auto-alojas, el formato del envoltorio, los tipos de contenido, el algoritmo de firma y
las especificaciones de dominio son idénticos a signed-data.org. Tus eventos son verificables por
cualquier consumidor CDS — solo usan tu clave pública en lugar de la nuestra.
Lo que cambia
Sección titulada «Lo que cambia»| Propiedad | signed-data.org | Tu despliegue |
|---|---|---|
integrity.signed_by | https://signed-data.org | https://mycompany.example.com |
| URL de la clave pública | signed-data.org/.well-known/... | mycompany.example.com/.well-known/... |
| Infraestructura | Nuestra cuenta AWS | Tu cuenta AWS / GCP / Azure |
| Programación de ingestor | Nuestros crons | Tus crons |
Consumir eventos de múltiples emisores
Sección titulada «Consumir eventos de múltiples emisores»Un consumidor puede tener múltiples claves públicas y verificar contra el emisor declarado:
KNOWN_ISSUERS = { "signed-data.org": CDSVerifier("signed-data-org.pub.pem"), "mycompany.example.com": CDSVerifier("mycompany.pub.pem"),}
verifier = KNOWN_ISSUERS.get(event.integrity.signed_by)if not verifier: raise ValueError(f"Unknown issuer: {event.integrity.signed_by}")
verifier.verify(event)