Lassen Sie uns definieren Codesignatur kurz.
Code Signing ist eine Methode, Dateien, Dokumente, Software oder ausführbare Dateien digital zu signieren, um deren Authentizität und Echtheit hinsichtlich der bereitgestellten Funktionen und Features zu prüfen. Dadurch wird auch sichergestellt, dass die Softwareeinheit (Datei, Dokument, Software oder ausführbare Datei) während der Übertragung nicht manipuliert wird.
Die Code-Signierung kann auf zwei Arten implementiert werden: clientseitige Signierung und serverseitige Signierung.
Beide erwähnten Code-Signierungsmethoden, die beliebt waren, bis der Angriff auf SolarWinds ins Rampenlicht geriet, und posteten, dass die clientseitige Signierung in aller Munde sei, da hierfür kein Hochladen/Verschieben der Signaturdateien erforderlich sei und somit Angriffe verhindert würden, bei denen im Rahmen der ursprünglichen Datei-/Entitätssignierung auch Schadcode signiert würde.
Es ist an der Zeit, zunächst die Hash-Funktion zu verstehen:
Der Hash-Algorithmus ist die kryptografische Funktion, die aus einer gegebenen Eingabe beliebiger Größe eine Ausgabe mit fester Länge, den sogenannten Digest oder Hash-Wert, generiert. Die Hash-Funktion hat die Eigenschaft, eine eindeutige und unidirektionale/nicht umkehrbare Ausgabe zu generieren. Das bedeutet, dass wir durch eine umgekehrte Hash-Operation nicht zum ursprünglichen Eingabewert gelangen können.
Schauen wir uns ein Beispiel für einen Hashing-Algorithmus mit einer einfachen Hash-Funktion an:

Im obigen Beispiel wird eine kryptografische Hashfunktion SHA-256 gezeigt, die die beliebigen Daten in einen 256-Bit-Hashwert mit fester Größe umwandelt.
Lassen Sie uns nun die serverseitige Code-Signierung im Detail verstehen.
Beim Signieren des Codes oder einer ausführbaren Datei im serverseitigen Signierungsverfahren werden die folgenden Schritte ausgeführt:
- Es wird ein eindeutiges Schlüsselpaar generiert und basierend auf diesem Schlüsselpaar ein CSR (Anforderung zur Zertifikatsignierung) wird von einem Anforderer/Entwickler generiert.
- Der CSR wird gesendet an CA (Zertifizierungsstelle) mit einer Code-Signaturvorlage.
- Die CA stellt das Zertifikat nach der Validierung aus und gibt das Codesignaturzertifikat mit dem öffentlichen Schlüssel an den Anforderer zurück.
- Der zu signierende Code/die ausführbare Datei wird vom Anforderer auf den Code Signing-Server hochgeladen.
- Sobald der Code/die ausführbare Datei hochgeladen ist, wird der Hashwert des Codes/der ausführbaren Datei mithilfe einer kryptografischen Hashfunktion berechnet. Da dieser Hashwert auf der Serverseite berechnet wird, kommt der Name „Serverseitiges Hashing“.
- Der berechnete Hashwert wird mit dem entsprechenden privaten Schlüssel signiert, der dem Anforderer ausgestellt wurde, und ergibt die digitale Signatur.
- Die digitale Signatur, das Code Signing-Zertifikat und die Hash-Funktionsinformationen werden nun zu einem Signaturblock zusammengefasst und in die Software eingefügt, die an den Empfänger/Verbraucher gesendet wird.
- Wenn der Code/die ausführbare Datei empfangen wird, überprüft der Computer des Verbrauchers zunächst die Authentizität des Codesignaturzertifikats.
- Sobald die Authentizität bestätigt ist, wird der Digest mit dem öffentlichen Schlüssel des erstellten Schlüsselpaars entschlüsselt.
- Die Hash-Funktion wird auf den Code/die ausführbare Datei angewendet, um den Digest zu berechnen.
- Der resultierende Digest wird mit dem vom Anforderer gesendeten Digest verglichen. Wenn die Digests übereinstimmen, kann die Software sicher installiert werden.
Lassen Sie uns die clientseitige Signierung im Detail verstehen.
Beim Signieren des Codes oder einer ausführbaren Datei im clientseitigen Signaturverfahren werden die folgenden Schritte ausgeführt:
- Es wird ein eindeutiges Schlüsselpaar generiert und basierend auf diesem Schlüsselpaar wird von einem Antragsteller/Entwickler ein CSR (Certificate Signing Request) generiert.
- Der CSR wird mit einer Code-Signaturvorlage an die CA (Zertifizierungsstelle) gesendet.
- Die CA stellt das Zertifikat nach der Validierung aus und gibt das Codesignaturzertifikat mit dem öffentlichen Schlüssel an den Anforderer zurück.
- Der Hashwert des Codes/der ausführbaren Datei wird mithilfe einer kryptografischen Hashfunktion auf der Clientseite selbst berechnet. Da dieser Hashwert auf der Clientseite berechnet wird, kommt der Name „Clientseitiges Hashing“.
- Nur der Hashwert, d. h. die Zusammenfassung des zu signierenden Codes/der ausführbaren Datei, wird vom Anforderer auf den Code-Signaturserver hochgeladen.
- Der berechnete Hashwert wird mit dem entsprechenden privaten Schlüssel signiert, der dem Anforderer ausgestellt wurde, und ergibt die digitale Signatur.
- Die Informationen zur digitalen Signatur und Hashfunktion werden an den Client zurückgesendet.
- Die digitale Signatur, das Code Signing-Zertifikat und die Hash-Funktionsinformationen werden nun in einem Signaturblock zusammengefasst und auf der Anforderer-/Entwicklerseite in die Software eingefügt.
- Wenn der Code/die ausführbare Datei beim Verbraucher ankommt, überprüft der Computer des Verbrauchers zunächst die Authentizität des Codesignaturzertifikats.
- Sobald die Authentizität bestätigt ist, wird der Digest mit dem öffentlichen Schlüssel des erstellten Schlüsselpaars entschlüsselt.
- Die Hash-Funktion wird auf den Code/die ausführbare Datei angewendet, um den Digest zu berechnen.
- Der resultierende Digest wird mit dem vom Anforderer gesendeten Digest verglichen. Wenn die Digests übereinstimmen, kann die Software sicher installiert werden.
Fazit
Codesignatur ist zu einer wesentlichen Anforderung für Softwareentwickler geworden. Der Grund dafür ist, dass Code Signing das Vertrauen der Benutzer stärkt und sie die Software ohne Bedenken installieren können. Obwohl beide Code-Signing-Methoden in der Branche bisher verwendet werden, hat der Angriff von SolarWinds die Code-Signing-Landschaft in der Branche stark verändert. Heute ist die clientseitige Signierung die bevorzugte Wahl, da sie erhebliche Vorteile bei der Remote-Erstellung digitaler Signaturen bietet, den Bandbreitenbedarf durch den reinen Hash-Wert-Upload reduziert und Angriffe durch bösartigen Code verhindert, da keine Codedateien innerhalb der Umgebung verschoben werden.
Ressourcen: www.encryptionconsulting.com/education-center/what-is-code-signing/
