Versehen von Authenticode-Signaturen mit Zeitstempeln
Microsoft Authenticode-Signaturen bieten Autorisierungs- und Integritätsgarantien für Binärdaten. Der Authenticode-Zeitstempel basiert auf standardmäßigen PKCS #7-Gegensignaturen. Mithilfe von Signaturtools von Microsoft können Entwickler Zeitstempel zur gleichen Zeit wie Authenticode-Signaturen anbringen. Mit dem Zeitstempel können Authenticode-Signaturen auch dann überprüft werden, wenn die für die Signatur verwendeten Zertifikate abgelaufen sind.
Eine kurze Einführung in Authenticode
Authenticode wendet digitale Signaturtechnologie an, um die Ersteller und die Integrität von Binärdaten wie etwa installierbarer Software zu gewährleisten. Ein Clientwebbrowser oder andere Systemkomponenten können die Authenticode-Signaturen verwenden, um die Integrität der Daten zu überprüfen, wenn die Software heruntergeladen oder installiert wird. Authenticode-Signaturen können mit vielen Softwareformaten verwendet werden, einschließlich CAB, EXE, OCX und DLL.
Microsoft unterhält eine Liste der öffentlichen Zertifizierungsstellen (Certification Authorities, CAs). Zu den Ausstellern von Authenticode-Zertifikaten gehören derzeit SSL.com, Digicert, Sectigo(Comodo) und GlobalSign.
Informationen für kryptografische Zeitstempel
In der Vergangenheit wurden verschiedene kryptografische Zeitstempelmethoden vorgeschlagen. Siehe zum Beispiel Haber und Stornetta „How to Time-Stamp a Digital Document“ im Journal of Cryptology (1991) und Benaloh und de Mare „One-Way Accumulators: A Decentralized Alternative to Digital Signatures“ in Springer-Verlag Lecture Notes in Computer Science Vol. 765 (EUROCRYPT '93). Eine erweiterte Zusammenfassung dieses Artikels steht in Microsoft Research zur Verfügung. (Diese Ressourcen sind in einigen Sprachen und Ländern oder Regionen möglicherweise nicht verfügbar.) Da es sich bei der Zeit um eine physische und nicht um eine mathematische Größe handelt, geht es bei diesen Methoden im Allgemeinen darum, wie Objekte verknüpft werden können, damit die Reihenfolge ihrer Erstellung bestimmt werden kann, oder wie Objekte effizient gruppiert werden können, die alle als gleichzeitig erstellt beschrieben werden können.
Systeme, die vorgeben, die Zeit als Größe zu authentifizieren, erfordern immer eine gewisse Form von Vertrauen. In einem gegensätzlichen Umfeld können komplexe Protokolle verwendet werden, um ein gewisses Maß an Synchronisierung zu gewährleisten. Diese Protokolle erfordern jedoch eine umfangreiche Interaktion zwischen betroffenen Parteien. Wenn in der Praxis die Zeit von einer vertrauenswürdigen Quelle zertifiziert werden muss, kann die Quelle einfach als Notar fungieren, indem eine signierte Erklärung (Zertifizierung) bereitgestellt wird, dass das Objekt zur angegebenen Zeit zur Signatur vorgelegt wurde.
Die unten implementierte Gegensignaturmethode für Zeitstempel ermöglicht die Überprüfung von Signaturen selbst nach Ablauf oder Widerruf des Signaturzertifikats. Der Zeitstempel ermöglicht dem Prüfer zuverlässige Zeitangaben für das Anbringen der Signatur. Dadurch kann er der Signatur vertrauen, wenn sie zu diesem Zeitpunkt gültig war. Der Zeitstempelgeber muss über eine zuverlässige und geschützte Zeitquelle verfügen.
PKCS #7 Signierte Dokumente und Gegensignaturen
PKCS #7 ist ein Standardformat für kryptografische Daten, einschließlich signierter Daten, Zertifikate und Zertifikatsperrlisten (Certificate Revocation Lists, CRLs). Die speziell gewünschten PKCS #7-Typen im Kontext des Zeitstempels sind signierte Daten, die dem von PKCS #7 definierten SignedData-Inhaltstyp entsprechen.
Das PKCS #7-Paket besteht aus SignedData, das den tatsächlichen Inhalt, bestimmte Informationen darüber und SignerInfo-Signaturblöcke kennzeichnet. Eine SignerInfo kann selbst eine Gegensignatur enthalten, bei der es sich rekursiv um eine andere SignerInfo handelt. Grundsätzlich kann eine Sequenz solcher Gegensignaturen vorhanden sein. Die Gegensignatur ist ein nicht authentifiziertes Attribut in Bezug auf die Signatur in der SignerInfo. D. h., sie kann nach der ursprünglichen Signatur angebracht werden. In Gliederung:
SignedData (PKCS #7)
- Version (von PKCS #7, im Allgemeinen Version 1)
- DigestAlgorithms (Sammlung aller Algorithmen, die von SignerInfo-Signaturblöcken für eine optimierte Verarbeitung verwendet werden)
- ContentInfo (contentType entspricht SignedData, plus Inhalt oder Verweis auf Inhalte)
- OPTIONALE Zertifikate (Sammlung aller verwendeten Zertifikate)
- OPTIONALE CRLs (Sammlung aller CRLs)
- SignerInfo-Signaturblöcke (die tatsächliche Signatur, bestehend aus mindestens einem SignerInfo-Signaturblock)
SignerInfo (der Signaturblock)
- Version (von PKCS #7, im Allgemeinen Version 1)
- Zertifikat (Aussteller und Seriennummer, um das Zertifikat des Signaturgebers in SignedData eindeutig zu identifizieren)
- DigestAlgorithm plus DigestEncryptionAlgorithm plus Digest (Hash) plus EncryptedDigest (tatsächliche Signatur)
- OPTIONALE AuthenticatedAttributes (z. B. von diesem Signaturgeber signiert)
- OPTIONALE UnauthenticatedAttributes (z. B. nicht von diesem Signaturgeber signiert)
Ein Beispiel für ein authentifiziertes Attribut ist die Signaturzeit (OID 1.2.840.113549.1.9.5), da sie Teil der Signatur des Zeitstempeldiensts ist. Ein Beispiel für ein nicht authentifiziertes Attribut ist die Gegensignatur (OID 1.2.840.113549.1.9.6), da sie nach dem Signieren angebracht werden kann. In diesem Fall enthält die SignerInfo selbst eine SignerInfo (die Gegensignatur).
Hinweis
Das Objekt, das in der Gegensignatur signiert ist, ist die ursprüngliche Signatur (d. h. „EncryptedDigest“ der ursprünglichen SignerInfo).
SignTool und der Authenticode-Prozess
SignTool ist für Authenticode-Signier- und Zeitstempel-Binärdaten verfügbar. Das Tool wird im Ordner „\Bin“ des Installationspfads für das Microsoft Windows Software Development Kit (SDK) installiert.
Das Signieren und Zeitstempeln von Binärdaten ist relativ einfach mit SignTool. Der Herausgeber muss ein Codesignaturzertifikat von einer kommerziellen Codesignaturzertifizierungsstelle abrufen. Der Einfachheit halber veröffentlicht und aktualisiert Microsoft eine Liste öffentlicher Zertifizierungsstellen, einschließlich derjenigen, die Authenticode-Zertifikate ausstellen. Wenn sie veröffentlicht werden können, werden die Objektdateien mit den entsprechenden Befehlszeilenparametern mit dem SignTool-Tool signiert und mit einem Zeitstempel versehen. Das Ergebnis eines SignTool-Vorgangs ist immer ein PKCS #7-Format SignedData.
SignTool akzeptiert als Eingabe entweder unformatierte Binärdaten, die signiert und mit Zeitstempel versehen werden sollen, oder zuvor signierte Binärdaten, die mit Zeitstempel versehen werden sollen. Daten, die zuvor signiert wurden, können mithilfe des timestamp-Befehls von Signtool mit einem Zeitstempel versehen werden.
Argument | Beschreibung |
---|---|
/t HTTPAddress | Gibt an, dass die Datei mit einem Zeitstempel versehen werden soll. Eine URL, die die Adresse eines Zeitstempelservers angibt, muss angegeben werden. /t kann mit den SignTool-Befehlen sign und timestamp verwendet werden. |
Weitere Informationen zu Tools, die in diesem Kontext hilfreich sein können, finden Sie unter Kryptografietools und SignTool.
Implementierungsdetails und Übertragungsformat
SignTool basiert auf der Windows Authenticode-Implementierung zum Erstellen von Signaturen und Versehen mit Zeitstempeln. Authenticode wird auf Binärdateien ausgeführt, wie etwa CAB, EXE, DLL oder OCX. Authenticode erstellt zuerst die Signatur und erzeugt PKCS #7 SignedData. Diese SignedData müssen gegensigniert werden, wie in PKCS #9 beschrieben.
Der Gegensignaturprozess erfolgt in vier Schritten:
- Kopieren Sie die Signatur (d. h. die encryptedDigest) aus der SignerInfo von PKCS #7 SignedData.
- Erstellen Sie eine Zeitstempelanforderung, deren Inhalt die ursprüngliche Signatur ist. Senden Sie diesen codiert als TimeStampRequest an den Zeitstempelserver Abstract Syntax Notation One (ASN.1).
- Sie erhalten einen Zeitstempel, der als zweites PKCS #7 SignedData formatiert ist und vom Zeitstempelserver zurückgegeben wird.
- Kopieren Sie die SignerInfo aus dem Zeitstempel als PKCS #9-Gegensignatur (d. h. ein nicht authentifiziertes Attribut in der SignerInfo des Originals) direkt in das Original PKCS #7 SignedData.
Zeitstempelanforderung
Die Zeitstempelanforderung wird innerhalb einer HTTP 1.1 POST-Nachricht gesendet. Im HTTP-Header wird die CacheControl-Direktive auf „no-cache“ festgelegt, und die Content-Type-Direktive wird auf „application/octet-stream“ festgelegt. Der Textkörper der HTTP-Nachricht ist eine base64-Codierung der Distinguished Encoding Rules (DER)-Codierung der Zeitstempelanforderung.
Obwohl derzeit nicht verwendet, sollte die Direktive für die Inhaltslänge auch beim Erstellen der HTTP-Nachricht verwendet werden, da sie dem Zeitstempelserver hilft, die Anforderung innerhalb der HTTP-POST zu finden.
Andere HTTP-Header können auch vorhanden sein und sollten ignoriert werden, wenn sie vom Anforderer oder Zeitstempelserver nicht verstanden werden.
Die Zeitstempelanforderung ist eine ASN.1-codierte Nachricht. Das Format der Anforderung ist wie folgt.
TimeStampRequest ::= SEQUENCE {
countersignatureType OBJECT IDENTIFIER,
attributes Attributes OPTIONAL,
content ContentInfo
}
Der countersignatureType ist der Objektbezeichner, der es als Zeitstempelzähler-Gegensignatur kennzeichnet und genau OID 1.3.6.1.4.1.311.3.2.1 lauten muss.
In der Zeitstempelanforderung sind derzeit keine Attribute enthalten.
Der Inhalt ist eine ContentInfo gemäß Definition von PKCS #7. Der Inhalt sind die zu signierenden Daten. Bei Signaturzeitstempeln muss der ContentType „Data“ lauten, und der Inhalt muss encryptedDigest (Signatur) aus der SignerInfo des PKCS #7-Inhalts sein, der mit einem Zeitstempel versehen werden soll.
Antwort auf Zeitstempel
Die Antwort auf den Zeitstempel wird auch innerhalb einer HTTP 1.1-Nachricht gesendet. Im HTTP-Header wird die Content-Type-Direktive ebenfalls auf „application/octet-stream“ festgelegt. Der Textkörper der HTTP-Nachricht ist eine base64-Codierung der DER-Codierung der Zeitstempelantwort.
Die Antwort auf den Zeitstempel ist eine mit PKCS #7 signierte Nachricht, die vom Zeitstempelgeber signiert wurde. Die ContentInfo der PKCS #7-Nachricht ist identisch mit der im Zeitstempel empfangenen ContentInfo. Der PKCS #7-Inhalt enthält das zur Signierzeit authentifizierte Attribut (definiert in PKCS #99, OID 1.2.840.113549.9.5).
Nachdem Authenticode den Zeitstempel vom Server empfängt, integriert Authenticode den Zeitstempel in das ursprüngliche PKCS #7 SignedData als Gegensignatur. Hierzu wird die ContentInfo der zurückgegebenen PKCS #7 SignedData verworfen, und die SignerInfo des zurückgegebenen Zeitstempels wird als Gegensignatur in die SignerInfo der ursprünglichen PKCS #7 SignedData kopiert. Die Zertifikatkette des Zeitstempelgebers wird auch in Zertifikate in den ursprünglichen PKCS #7 SignedData als nicht authentifiziertes Attribut des ursprünglichen Signaturgebers kopiert.