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.
https://api.kennmarq.com/v1/tsa/sk_live_…Richiesta
Content-Type: application/timestamp-query- Il body: una
TimeStampReqcodificata 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.
certReqviene 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
# 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 -textPer 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.
timeStamp.untrusted finché non avremo il nostro certificato pubblicamente attendibile; il file risulta comunque valido.Errori
| Stato | Codice | Quando |
|---|---|---|
| 400 | invalid_request | Un body vuoto, oppure una query che il nostro server non è riuscito a interpretare. |
| 401 | missing_api_key, invalid_api_key, api_key_revoked | Nessuna chiave, una chiave sconosciuta o una revocata. |
| 402 | quota_exceeded | Le marche temporali del mese sono esaurite. |
| 403 | key_not_allowed_in_url | La chiave ha ambiti oltre a tsa. |
| 403 | ip_not_allowed | L’indirizzo non è nella lista di IP consentiti della chiave. |
| 413 | payload_too_large | La query supera i 4 KB. |
| 415 | unsupported_media_type | Il Content-Type non è application/timestamp-query. |
| 429 | rate_limited | Troppe chiamate in questo minuto. |
| 503 | tsa_unavailable | Il server di marca temporale è momentaneamente non disponibile. Non viene addebitato nulla; riprova. |