Vai al contenuto

Marche temporali (RFC 3161)

POST https://api.kennmarq.com/v1/tsa/{key}

Il nostro server di marca temporale RFC 3161, per la modalità locale: quando la tua macchina firma un manifest C2PA, chiede a questo URL di apporre la marca temporale alla firma. La chiave sta nell’URL perché la libreria C2PA non può aggiungere header.

Una chiave solo per tsa

Crea una chiave il cui unico ambito sia tsa e inseriscila nell’URL. Qui qualsiasi chiave con più ambiti viene rifiutata con 403 key_not_allowed_in_url: gli URL finiscono nei log, e una chiave con ampi poteri non deve mai finirci. Se succede, ruota la chiave che hai inviato.

URL per la marca temporale
https://api.kennmarq.com/v1/tsa/sk_live_…

Richiesta

  • Content-Type: application/timestamp-query
  • Il body: una TimeStampReq codificata in DER, al massimo 4 KB.
  • Impronte del messaggio in SHA-256, SHA-384 o SHA-512. Un’impronta SHA-1 riceve uno stato di rifiuto all’interno della risposta.
  • certReq viene rispettato (la nostra catena TSA entra nel token) e il tuo nonce viene restituito tale e quale.

Risposta

200 con esattamente Content-Type: application/timestamp-reply, e la TimeStampResp DER come body, byte per byte come l’ha prodotta il nostro server. Ogni token dichiara un’accuratezza di 1 secondo, contiene un numero di serie casuale a 128 bit e il nostro OID di policy, ed è firmato con ECDSA P-256 / SHA-256 includendo signingCertificateV2 (RFC 5816).

Ogni token entra nel nostro registro di trasparenza pubblico prima di essere restituito; l’header X-Log-Index indica dove, e GET /v1/log/proof/{index} lo prova. Un rifiuto non contiene né token né indice.

Esempio con OpenSSL

Shell
# A query for a file's SHA-256, asking for our certificate in the reply
openssl ts -query -data artwork.png -sha256 -cert -out request.tsq

curl https://api.kennmarq.com/v1/tsa/$TSA_KEY \
  -H "Content-Type: application/timestamp-query" \
  --data-binary @request.tsq \
  -o response.tsr

openssl ts -reply -in response.tsr -text

Per verificare un token, scarica la nostra catena TSA da GET /v1/certificate?chain=tsa.

Conteggio

Ogni marca temporale conta una volta nella quota mensile di marche temporali, pari alle marcature del tuo piano (e alle tue marcature di test per le chiavi di test), tenuta separata per le chiavi di produzione e di test. Una richiesta che non riesce per un problema nostro non viene conteggiata. Le chiamate al minuto del piano valgono per l’organizzazione, tutte le sue chiavi insieme; la lista di IP consentiti della chiave vale per la chiave.

I validatori C2PA segnalano le nostre marche temporali come timeStamp.untrusted finché non avremo il nostro certificato pubblicamente attendibile; il file risulta comunque valido.

Errori

Errori di POST /v1/tsa
StatoCodiceQuando
400invalid_requestUn body vuoto, oppure una query che il nostro server non è riuscito a interpretare.
401missing_api_key, invalid_api_key, api_key_revokedNessuna chiave, una chiave sconosciuta o una revocata.
402quota_exceededLe marche temporali del mese sono esaurite.
403key_not_allowed_in_urlLa chiave ha ambiti oltre a tsa.
403ip_not_allowedL’indirizzo non è nella lista di IP consentiti della chiave.
413payload_too_largeLa query supera i 4 KB.
415unsupported_media_typeIl Content-Type non è application/timestamp-query.
429rate_limitedTroppe chiamate in questo minuto.
503tsa_unavailableIl server di marca temporale è momentaneamente non disponibile. Non viene addebitato nulla; riprova.