UtteraUttera

Einen Bericht verifizieren

Jeder PDF-Bericht, den wir ausstellen, ist kryptografisch signiert. Jeder —Sie, Ihr Kunde, die andere Seite einer Verhandlung— kann prüfen, dass ein Bericht von uns stammt und dass niemand ihn unterwegs angefasst hat, ohne uns um Erlaubnis zu fragen und ohne Konto.

Der schnellste Weg ist die Seite. Auf uttera.ai/de/verify laden Sie das PDF hoch, und das war's: Es gibt nichts zu kopieren oder einzufügen, weil die Signatur in der Datei selbst mitreist. Sie ist für jeden gedacht, der einen Bericht erhält und keinen Code schreiben wird — einen Anwalt, einen Sachverständigen, die Gegenpartei. Der Rest dieses Kapitels ist dafür, es selbst zu tun, mit curl oder ohne den Umweg über uns.

🔴 Authentizität ist nicht Wahrheit. Einen Bericht zu verifizieren sagt Ihnen, woher das Dokument stammt und dass niemand es verändert hat. Es sagt nicht, dass das, was darin steht, wahr ist. Der Bericht wird aus einer vom Kunden bereitgestellten Aufnahme erzeugt, und sowohl die Richtigkeit der Transkription als auch die Wahrheit dessen, was darin gesagt wird, liegen in seiner Verantwortung. Uttera war nicht Zeuge dessen, was aufgenommen wurde, prüft es nicht und zertifiziert es nicht.

Was es ist und was es nicht ist. Es ist eine kryptografische Authentizitätssignatur mit Ed25519. Es ist keine qualifizierte elektronische Signatur im Sinne der eIDAS-Verordnung: Sie beweist, dass das Dokument aus unserem System stammt und sich nicht verändert hat, sie ist nicht das Äquivalent eines Zertifikats eines qualifizierten Anbieters. Wir sagen das hier, und der Bericht sagt es auch.

Warum es zwei Signaturen gibt

Jeder Bericht trägt zwei, und jede beantwortet eine andere Frage:

SignaturWorüberWas sie beantwortet
Inhaltwas der Bericht sagt: Zusammenfassung, Transkript, Kundenname, Datum und Nutzung“stammt dieser Text von Uttera?” — sie gilt weiterhin, wenn das PDF neu gedruckt, beschnitten oder erneut gespeichert wurde
Containerdie Bytes der PDF-Datei“ist diese Datei genau die, die ausgestellt wurde?” — sie erkennt ein einziges geändertes Byte

Die des Inhalts ist im Inneren des Berichts abgedruckt, in der Fußzeile jeder Seite, als kurzer Fingerabdruck. Die des Containers kann nicht hinein —etwas zu signieren, das danach verändert wird, ist unmöglich— daher wird sie nach dem fertigen Dokument angehängt, auf einer Zeile am Ende der Datei, die mit %%UTTERA-FIRMA-V1: beginnt. Ein PDF-Reader sieht sie nie: Das Format schreibt vor, ab dem letzten startxref zu lesen, sodass alles nach dem %%EOF ignoriert wird.

Das ist es, was das PDF allein genügen lässt, um beide Signaturen zu prüfen. Früher wurde sie von der API separat zurückgegeben, und Sie mussten sie neben der Datei aufbewahren: In dem Moment, in dem jemand den Bericht per E-Mail weiterleitete, blieb die Signatur zurück, und das Dokument ließ sich überhaupt nicht mehr verifizieren. Die API gibt sie weiterhin in report.container_signature zurück, für jeden, der sie lieber separat archiviert.

Der öffentliche Schlüssel

Wir veröffentlichen ihn an drei Stellen, und alle drei geben dasselbe:

https://uttera.ai/.well-known/uttera-firma.pub     das PEM, für sich allein
https://uttera.ai/.well-known/uttera-firma.json    jeder Schlüssel, mit seinen Daten
https://api.uttera.ai/v1/reports/public-key        der, der gerade jetzt signiert

Die Vertrauenskette ist dieselbe, die DKIM- oder JWKS-Schlüsselsätze verwenden: Das TLS-Zertifikat von uttera.ai bezeugt, dass die Domain uns gehört, und diese Domain veröffentlicht den Schlüssel. Sie müssen uns das nicht am Telefon glauben.

Es über die Befehlszeile prüfen

Der Endpunkt ist öffentlich und benötigt keinen API-Schlüssel:

POST https://api.uttera.ai/v1/reports/verify

Mit dem PDF und sonst nichts. Das ist der normale Modus: Die Signatur ist in der Datei, sodass nichts nötig ist, was Sie separat hätten aufbewahren müssen. Er prüft beide Signaturen auf einmal:

curl -s -X POST https://api.uttera.ai/v1/reports/verify \
  -H "Content-Type: application/json" \
  -d "{\"modo\":\"pdf\",\"pdf_b64\":\"$(base64 -w0 report.pdf)\"}"

{"mode": "pdf", "signed": true,
 "valid_container": true, "valid_content": true,
 "key_fingerprint": "56ac333b…",
 "fields": {"cliente": "…", "titulo": "…", "generado": "1789641036", …}}

Beide true ist der gute Fall. valid_content true mit valid_container false bedeutet, der Text ist unser, aber die Datei wurde erneut gespeichert — jedes PDF-Werkzeug, das sie öffnet und schreibt, ändert die Bytes — was nicht dasselbe ist wie eine Fälschung. signed false bedeutet, die Datei trägt keine Signatur von uns, oder sie wurde entfernt.

Die beiden Modi unten sind für den Fall, dass Sie die Teile getrennt haben: einen älteren Bericht oder eine für sich archivierte Signatur.

Die Datei prüfen (Container-Signatur). Sie brauchen das PDF und die Signatur, die in report.container_signature dazukam:

curl -s -X POST https://api.uttera.ai/v1/reports/verify \
  -H "Content-Type: application/json" \
  -d "{\"modo\":\"contenedor\",
       \"pdf_b64\":\"$(base64 -w0 report.pdf)\",
       \"firma_b64\":\"THE_CONTAINER_SIGNATURE\"}"

{"valid": true, "mode": "contenedor", "key_fingerprint": "56ac333b…"}

Den Inhalt prüfen. Sie brauchen die Analyseantwort genau so, wie wir sie zurückgegeben haben, plus report.content_signature und das Datum aus report.generated_unix — den Unix-Zeitstempel, das ist der signierte Wert; generated_at ist das geschriebene Datum, zum Lesen. Der Zeitstempel ist auf dem Bericht selbst abgedruckt, neben der Nummer:

curl -s -X POST https://api.uttera.ai/v1/reports/verify \
  -H "Content-Type: application/json" \
  -d '{"modo":"contenido",
       "datos": { …the /v1/summarize response… },
       "cliente":"Meridiano Asesores, S.L.",
       "titulo":"Minutes of the meeting",
       "generado":1789639533,
       "firma_b64":"THE_CONTENT_SIGNATURE"}'

Wir speichern dafür nichts. Verifizieren ist eine Operation mit öffentlichem Schlüssel über das, was Sie uns senden: Wir schlagen nichts nach. Deshalb funktioniert es bei einem Bericht von vor Jahren, und deshalb können wir Ihnen nicht sagen, wie viele Berichte wir ausgestellt haben, oder einen finden, den Sie verloren haben.

Schlüsselrotation

Jeder Schlüssel wird zwölf Monate lang verwendet und beim geringsten Verdacht früher ersetzt. Zurückgezogene Schlüssel bleiben für immer veröffentlicht: Ein heute signierter Bericht muss in zehn Jahren verifizierbar sein.

Deshalb trägt jeder Bericht neben seiner Signatur den Fingerabdruck des Schlüssels, der ihn signiert hat. Der Prüfer weiß, welchen er verwenden muss, ohne alle durchzuprobieren.

Sollten wir je einen Schlüssel zurückziehen müssen, weil er kompromittiert wurde, würden wir es hier mit dem Datum sagen. Und wir würden auch den unangenehmen Teil sagen: Mit ihm signierte Berichte beweisen dann nichts mehr, weil derjenige, der den Schlüssel besaß, rückdatierte Dokumente hätte signieren können.