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:
| Signatur | Worüber | Was sie beantwortet |
|---|---|---|
| Inhalt | was 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 |
| Container | die 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.