Authenticode-Signierung für Spieleentwickler

Die Datenauthentifizierung ist für Spieleentwickler zunehmend wichtig. Windows Vista und Windows 7 verfügen über eine Reihe von Features, z. B. Jugendschutz, für die spiele ordnungsgemäß signiert werden müssen, um sicherzustellen, dass niemand die Daten manipuliert hat. Mit Microsoft Authenticode können Endbenutzer und das Betriebssystem überprüfen, ob der Programmcode vom rechtmäßigen Besitzer stammt und dass er nicht böswillig geändert oder versehentlich beschädigt wurde. In diesem Artikel wird erläutert, wie Sie mit der Authentifizierung Ihres Spiels und der Integration der Authentifizierung in einen täglichen Buildprozess beginnen.

Hinweis

Ab dem 1. Januar 2016 vertrauen Windows 7 und höher keine SHA-1-Codesignaturzertifikate mehr mit einem Ablaufdatum vom 1. Januar 2016 oder höher. Weitere Informationen finden Sie unter Windows-Erzwingung von Authenticode-Codesignatur und Zeitstempel.

Hintergrund

Digitale Zertifikate werden verwendet, um die Identität des Autors festzulegen. Digitale Zertifikate werden von einem vertrauenswürdigen Drittanbieter ausgestellt, der als Zertifizierungsstelle (Certificate Authority, CA) bezeichnet wird, z. B. VeriSign oder Thawte. Die Zertifizierungsstelle ist dafür verantwortlich, zu überprüfen, ob der Besitzer keine falsche Identifizierung angibt. Nach der Anwendung auf eine Zertifizierungsstelle für ein Zertifikat können kommerzielle Entwickler in weniger als zwei Wochen eine Antwort auf ihre Anwendung erwarten.

Nachdem die Zertifizierungsstelle entschieden hat, dass Sie die Richtlinienkriterien erfüllen, generiert sie ein Codesignaturzertifikat, das X.509 entspricht, das von der Internationalen Telekommunikationsunion erstellte Industriestandardzertifikatformat mit Version 3-Erweiterungen. Dieses Zertifikat identifiziert Sie und enthält Ihren öffentlichen Schlüssel. Sie wird von der Zertifizierungsstelle zur Referenz gespeichert und ihnen wird eine Kopie elektronisch zur Verfügung gestellt. Gleichzeitig erstellen Sie auch einen privaten Schlüssel, den Sie sicher halten müssen und den Sie nicht für jeden freigeben dürfen, auch für die Zertifizierungsstelle.

Nachdem Sie über einen öffentlichen und privaten Schlüssel verfügen, können Sie mit der Verteilung signierter Software beginnen. Microsoft stellt Tools bereit, um dies im Windows SDK zu tun. Die Tools verwenden einen unidirektionalen Hash, erzeugen einen Digest mit fester Länge und generieren eine verschlüsselte Signatur mit einem privaten Schlüssel. Anschließend kombinieren sie diese verschlüsselte Signatur mit Ihrem Zertifikat und Ihren Anmeldeinformationen in eine Struktur, die als Signaturblock bezeichnet wird, und betten sie in das Dateiformat der ausführbaren Datei ein. Jede Art von ausführbarer Binärdatei kann signiert werden, einschließlich DLLs, ausführbare Dateien und Cab-Dateien.

Die Signatur kann auf mehrere Arten überprüft werden. Programme können die CertVerifyCertificateChainPolicy-Funktion aufrufen, und SignTool (signtool.exe) kann verwendet werden, um eine Signatur über die Eingabeaufforderung zu überprüfen. Windows Explorer verfügt auch über eine Registerkarte "Digitale Signaturen" in den Dateieigenschaften, auf der jedes Zertifikat einer signierten Binärdatei angezeigt wird. (Die Registerkarte "Digitale Signaturen" wird nur in den Dateieigenschaften für signierte Dateien angezeigt.) Außerdem kann eine Anwendung mithilfe von CertVerifyCertificateChainPolicy selbstverifizieren.

Das Authenticode-Signieren ist nicht nur für die Datenauthentifizierung durch Endbenutzer nützlich, sondern auch für das Patchen von eingeschränkten Benutzerkonten und durch Jugendschutz in Windows Vista und Windows 7 erforderlich. Darüber hinaus können zukünftige Technologien in Windows-Betriebssystemen auch erfordern, dass Code signiert ist, daher wird dringend empfohlen, dass alle professionellen und Amateurentwickler ein Codesignaturzertifikat von einer Zertifizierungsstelle erwerben. Weitere Informationen dazu, wie dies geschieht, finden Sie weiter unten in diesem Artikel unter Verwendung einer vertrauenswürdigen Zertifizierungsstelle.

Spielcode, Patcher und Installationsprogramme können die Authenticode-Signatur weiter nutzen, indem überprüft wird, dass Dateien im Code authentifiziert sind. Dies kann für Anti-Cheat und allgemeine Netzwerksicherheit verwendet werden. Beispielcode für die Überprüfung, ob eine Datei signiert ist, finden Sie hier: Beispiel C-Programm: Überprüfen der Signatur einer PE-Datei und Beispielcode zum Überprüfen des Besitzes eines Signaturzertifikats für eine signierte Datei finden Sie hier: So erhalten Sie Informationen aus authenticode Signed Executables.

Erste Schritte

Für die ersten Schritte stellt Microsoft Tools mit Visual Studio 2005 und Visual Studio 2008 und im Windows SDK bereit, um den Codesignaturprozess auszuführen und zu überprüfen. Nach der Installation von Visual Studio oder dem Windows SDK befinden sich die in diesem technischen Artikel beschriebenen Tools in einem Unterverzeichnis der Installation, das eine oder mehrere der folgenden Elemente enthalten kann:

  • %SystemDrive%\Programme\Microsoft Visual Studio 8\SDK\v2.0\Bin
  • %SystemDrive%\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
  • %SystemDrive%\Programme\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
  • %SystemDrive%\Programme\Microsoft SDKs\Windows\v6.0A\bin\

Die folgenden Tools sind für das Signieren von Code am nützlichsten:

Zertifikaterstellungstool (MakeCert.exe)

Generiert ein X.509-Testzertifikat als .cer Datei, das Ihren öffentlichen Schlüssel und einen privaten Schlüssel als PVK-Datei enthält. Dieses Zertifikat dient nur internen Testzwecken und kann nicht öffentlich verwendet werden.

pvk2pfx.exe

Erstellt eine Persönliche Information Exchange -Datei (PFX) aus einem Paar von .cer- und PVK-Dateien. Die PFX-Datei enthält sowohl Ihren öffentlichen als auch den privaten Schlüssel.

SignTool (SignTool.exe)

Signiert die Datei mithilfe der PFX-Datei. SignTool unterstützt das Signieren von DLL-Dateien, ausführbaren Dateien, Windows Installer-Dateien (.msi) und CAB-Dateien (.cab).

Hinweis

Beim Lesen anderer Dokumentationen finden Sie möglicherweise Verweise auf SignCode (SignCode.exe), dieses Tool ist jedoch veraltet und wird nicht mehr unterstützt – verwenden Sie stattdessen SignTool.

 

Verwenden einer vertrauenswürdigen Zertifizierungsstelle

Um ein vertrauenswürdiges Zertifikat zu erhalten, müssen Sie sich auf eine Zertifizierungsstelle (Certificate Authority, CA) wie VeriSign oder Thawte beziehen. Microsoft empfiehlt keine Zertifizierungsstelle über eine andere, aber wenn Sie in den WINDOWS-FEHLERBERICHTERSTATTUNG (WER)-Dienst integrieren möchten, sollten Sie die Verwendung von VeriSign in Betracht ziehen, um das Zertifikat auszugeben, da für den Zugriff auf die WER-Datenbank ein WinQual-Konto erforderlich ist, das eine VeriSign-ID erfordert. Eine vollständige Liste der vertrauenswürdigen Zertifizierungsstellen von Drittanbietern finden Sie unter Microsoft Root Certificate Program Members. Weitere Informationen zur Registrierung bei WER finden Sie unter "Einführung in Windows-Fehlerberichterstattung" in der ISV Zone.

Nachdem Sie Ihr Zertifikat von der Zertifizierungsstelle erhalten haben, können Sie Ihr Programm mit SignTool signieren und Ihr Programm für die Öffentlichkeit freigeben. Sie müssen jedoch vorsichtig sein, um Ihren privaten Schlüssel zu schützen, der in Ihren PFX- und PVK-Dateien enthalten ist. Achten Sie darauf, diese Dateien an einem sicheren Speicherort zu speichern.

Beispiel für die Verwendung eines Testzertifikats

Die folgenden Schritte veranschaulichen die Erstellung eines Codesignaturzertifikats zu Testzwecken, gefolgt von der Signatur eines Direct3D-Beispielprogramms (als BasicHLSL.exe bezeichnet) mit diesem Testzertifikat. Dieses Verfahren erstellt .cer- und PVK-Dateien – Ihre öffentlichen und privaten Schlüssel , die nicht für die öffentliche Zertifizierung verwendet werden können.

In diesem Beispiel wird der Signatur auch ein Zeitstempel hinzugefügt. Ein Zeitstempel verhindert, dass die Signatur ungültig wird, wenn das Zertifikat abläuft. Code, der signiert ist, aber keinen Zeitstempel hat, wird nach Ablauf des Zertifikats nicht überprüft. Daher sollte der gesamte öffentlich freigegebene Code über einen Zeitstempel verfügen.

So erstellen Sie ein Zertifikat und signieren ein Programm

  1. Erstellen Eines Testzertifikats und eines privaten Schlüssels mithilfe des Zertifikaterstellungstools (MakeCert.exe).

    Im folgenden Befehlszeilenbeispiel wird MyPrivateKey als Dateiname für die Private Key-Datei (PVK), MyPublicKey als Dateiname für die Zertifikatdatei (.cer) und MySoftwareCompany als Name des Zertifikats angegeben. Außerdem wird das Zertifikat selbstsigniert, sodass es nicht über eine nicht vertrauenswürdige Stammzertifizierungsstelle verfügt.

    MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
    
  2. Erstellen Sie mithilfe von pvk2pfx.exe eine Datei mit persönlichem Informationsaustausch (PFX) aus Ihrer Datei (PVK) und einer Zertifikatdatei (.cer).

    Die PFX-Datei kombiniert Ihre öffentlichen und privaten Schlüssel in einer einzelnen Datei. Im folgenden Befehlszeilenbeispiel werden die .pvk- und .cer-Dateien aus dem vorherigen Schritt verwendet, um die PFX-Datei mit dem Kennwort your_password zu erstellen:

    pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
    
  3. Signieren Sie Ihr Programm mit Ihrer Datei "Personal Information Exchange (PFX)", indem Sie SignTool verwenden.

    Sie können mehrere Optionen in der Befehlszeile angeben. Im folgenden Befehlszeilenbeispiel wird die PFX-Datei aus dem vorherigen Schritt verwendet, your_password als Kennwort angegeben, BasicHLSL als signierte Datei angegeben und ein Zeitstempel von einem angegebenen Server abgerufen:

    signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
    

    Hinweis

    Die URL zum Zeitstempeldienst wird von der Zertifizierungsstelle bereitgestellt und ist optional zum Testen. Es ist wichtig, dass die Produktionssignatur eine gültige Zeitstempelautorität enthält, oder die Signatur kann nicht überprüft werden, wenn das Zertifikat abläuft.

     

  4. Stellen Sie sicher, dass das Programm mit SignTool signiert ist.

    Im folgenden Befehlszeilenbeispiel wird angegeben, dass SignTool versuchen soll, die Signatur auf BasicHLSL.exe mithilfe aller verfügbaren Methoden zu überprüfen, während ausführliche Ausgabe bereitgestellt wird:

    signtool.exe verify /a /v BasicHLSL.exe
    

    In diesem Beispiel sollte SignTool angeben, dass das Zertifikat angefügt ist, und gleichzeitig angeben, dass es nicht vertrauenswürdig ist, da es nicht von einer Zertifizierungsstelle ausgestellt wird.

  5. Vertrauen Sie dem Testzertifikat.

    Für Testzertifikate müssen Sie dem Zertifikat vertrauen. Dieser Schritt sollte für Zertifikate übersprungen werden, die von einer Zertifizierungsstelle bereitgestellt werden, da diese standardmäßig als vertrauenswürdig eingestuft werden.

    Führen Sie auf den Computern, auf denen Sie dem Testzertifikat vertrauen möchten, Folgendes aus:

    certmgr.msc
    

    Klicken Sie dann mit der rechten Maustaste auf vertrauenswürdige Stammzertifizierungsstellen, und wählen Sie "Alle Aufgaben" aus | Importieren. Navigieren Sie dann zu der pfx-Datei, die Sie erstellt haben, und führen Sie die Schritte des Assistenten aus, und platzieren Sie das Zertifikat in den vertrauenswürdigen Stammzertifizierungsstellen.

    Nach Abschluss des Assistenten können Sie mit dem Testen des vertrauenswürdigen Zertifikats auf diesem Computer beginnen.

Integrieren von Codesignatur in das tägliche Buildsystem

Zum Integrieren von Codesignatur in ein Projekt können Sie eine Batchdatei oder ein Skript erstellen, um die Befehlszeilentools auszuführen. Nachdem das Projekt erstellt wurde, führen Sie SignTool mit den richtigen Einstellungen aus (wie in Schritt 3 unseres Beispiels dargestellt).

Seien Sie in Ihrem Buildprozess besonders vorsichtig, um zu versichern, dass der Zugriff auf die PFX- und PVK-Dateien auf so wenige Computer und Benutzer wie möglich beschränkt ist. Als bewährte Methode sollten Entwickler code nur mit dem Testzertifikat signieren, bis sie bereit sind, zu versenden. Auch hier sollte der private Schlüssel (PVK) an einem sicheren Ort aufbewahrt werden, z. B. in einem sicheren oder gesperrten Raum, und idealerweise auf einem kryptografischen Gerät, z. B. einer Smartcard.

Eine weitere Schutzebene wird mithilfe von Microsoft Authenticode bereitgestellt, um das Windows Installer (MSI)-Paket selbst zu signieren. Dadurch wird das MSI-Paket vor Manipulationen und versehentlichen Beschädigungen geschützt. Weitere Informationen zum Signieren von Paketen mit Authenticode finden Sie in der Dokumentation für Ihr MSI-Erstellungstool.

Widerruf

Wenn die Sicherheit des privaten Schlüssels kompromittiert wird oder ein sicherheitsbezogenes Ereignis ein Codesignaturzertifikat ungültig rendert, muss der Entwickler das Zertifikat widerrufen. Dadurch würde die Integrität des Entwicklers und die Effektivität des Signaturcodes geschwächt. Eine Zertifizierungsstelle kann auch einen Widerruf mit einem bestimmten Zeitpunkt ausstellen; Code, der vor der Sperrzeit mit einem Zeitstempel signiert ist, gilt weiterhin als gültig, aber Code mit einem nachfolgenden Zeitstempel ist ungültig. Der Zertifikatsperrung wirkt sich auf Code in allen Anwendungen aus, die mit dem widerrufenen Zertifikat signiert sind.

Codesignaturtreiber

Treiber können und sollten authenticode-signiert sein. Kernelmodustreiber verfügen über zusätzliche Anforderungen: 64-Bit-Editionen von Windows Vista und Windows 7 verhindern die Installation aller nicht signierten Kernelmodustreiber, und alle Versionen von Windows geben eine Warnmeldung an, wenn ein Benutzer versucht, einen nicht signierten Treiber zu installieren. Darüber hinaus können Administratoren Gruppenrichtlinien festlegen, um zu verhindern, dass nicht signierte Treiber unter Microsoft Windows Server 2003, Windows XP Professional x64 Edition und 32-Bit-Editionen von Windows Vista und Windows 7 installiert werden.

Viele Arten von Treibern können mit einer microsoft-vertrauenswürdigen Signatur signiert werden – als Teil des Windows-Zertifizierungsprogramms für Windows Hardware Quality Labs (WHQL) oder des unklassifizierten Signaturprogramms (früher "Treiberzuverlässigkeitssignatur"), mit dem das System diese Treiber vollständig als vertrauenswürdig einstufen kann und sie auch ohne Administratoranmeldeinformationen installieren kann.

Mindestens sollten Treiber authenticode-signiert sein, da Treiber, die nicht signiert oder selbstsigniert sind (d. h. mit einem Testzertifikat signiert), auf vielen Windows-basierten Plattformen nicht installiert werden. Weitere Informationen zum Signieren von Treibern und Code und zugehörigem Feature finden Sie unter Treibersignaturanforderungen für Windows unter Windows Hardware Developer Central.

Zusammenfassung

Die Verwendung von Microsoft Authenticode ist ein einfacher Prozess. Nachdem Sie eine CER erhalten und einen privaten Schlüssel erstellt haben, ist es einfach, die von Microsoft bereitgestellten Tools zu verwenden. Sie können dann wichtige Features in Windows Vista und Windows 7 aktivieren, z. B. Jugendschutz, und Kunden mitteilen, dass Ihr Produkt direkt vom rechtmäßigen Besitzer stammt.

Weitere Informationen

Weitere Informationen zu Tools und Prozessen im Zusammenhang mit dem Signieren von Code finden Sie unter den folgenden Links: