erichwanker
Goto Top

SelfSignedCertificate: Dateien signieren

Hallo,
ich möchte aus Rechtlichen- und Datenschutzgründen div. Dokumente signieren (Firmenverträge und behördliche Berichte..Bilder ..ect..)

Leider schaffe ich es nicht, eine Datei zu signieren:

ich habe folgende Schritte durchgeführt:

1.) PowerShell:
New-SelfSignedCertificate -DnsName "Firmenname" -CertStoreLocation Cert:\CurrentUser\My -Type Custom -NotAfter (Get-Date).AddYears(20)  

2.) in certmgr.msc -> Eigene Zertifikate -> Zertifikate -> "Firmenname" -> Alle Aufgaben -> exportieren -> ohne privaten Schlüssel -> DER-codiert-binär X.509(.CER) - Dateiname "C:\zertifikat-test\firmenname.cer"

3.) in certmgr.msc -> Vertrauenswürdige Stammzertifizierungsstellen -> Zertifikate -> rechtklick -> Alle Aufgaben ->"Importieren" das "firmenname.cer" importiert

4.) PowerShell Versuch:
$cert = Get-PfxCertificate -FilePath "C:\zertifikat-test\firmenname.cer"  
Set-AuthenticodeSignature -FilePath "C:\zertifikat-test\test2.txt" -Certificate $cert  

... und verschiedene Variationen versucht (Groß und Kleinschreibung habe ich immer beachtet). Leider ohne Erfolg.
Fehler sind teilweise: "das angegebene zertifikat ist für die codesignatur nicht geeignet", "zugriff verweigert" und so weiter..

Wie schaffe ich es als Beispiel das TXT File "C:\zertifikat-test\test2.txt" mit dem "C:\zertifikat-test\firmenname.cer" zu signieren?

Vielen Dank für Hinweise und Hilfe
Erich

for life:=1971 to lebensende do
begin
..

Content-Key: 535282

Url: https://administrator.de/contentid/535282

Printed on: April 24, 2024 at 06:04 o'clock

Member: StefanKittel
StefanKittel Jan 15, 2020 at 13:16:30 (UTC)
Goto Top
Hallo,

so sieht das bei mir aus.

sign.bat
@echo off
"C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /f "Z:\xxxxxxxxxx\171024 Zertifikat.pfx" /p xxxxxxxxxxx /v /tr "http://timestamp.comodoca.com" /td SHA256 /fd SHA256 "Z:\xxxxxxxxxx\setup.exe"  
pause

Stefan
Member: NetzwerkDude
NetzwerkDude Jan 15, 2020 updated at 13:20:40 (UTC)
Goto Top
bei 01:
-Type CodeSigningCert

und bei 02:
-Certificate 
hier muss es natürlich zu einem cert MIT privatekey gehen, sonst macht das signieren mit einem pubkey (wie in deinem fall die Datei auf C:\zertifikat-test\firmenname.cer ) kaum sinn face-smile

Ach ja, wäre mir neu das es einen standard gäbe um .txt Dateien zu signieren
Member: ErichWanker
ErichWanker Jan 15, 2020 at 13:32:20 (UTC)
Goto Top
Hallo und vielen Dank für die Tipps..

Jetzt bekomme ich einen "UnknownError" in der PowerShell Console..


PS C:\Users\erich> $cert = Get-PfxCertificate -FilePath "C:\zertifikat-test\firmenname.pfx"  
Geben Sie das Kennwort ein: ********

PS C:\Users\erich> Set-AuthenticodeSignature -FilePath "C:\zertifikat-test\test2.txt" -Certificate $cert  


    Verzeichnis: C:\zertifikat-test


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
                                          UnknownError                           test2.txt

Die Variable passt:
PS C:\Users\erich> echo $cert

Thumbprint                                Subject
----------                                -------
285BE7AAF38CC4CF737E18A00E7F68344804483D  CN=Firmenname

Das verwendete vertrausenswürdige Zertifikat hat "Codesignatur" ...

Auf die Datei "C:\zertifikat-test\test2.txt" hab ich Vollzugriff ..
Member: Bitboy
Bitboy Jan 15, 2020 at 13:46:40 (UTC)
Goto Top
Moin,

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

The Set-AuthenticodeSignature cmdlet adds an Authenticode signature to any file that supports Subject Interface Package (SIP).

Ich schätze eine TXT kann dieses SIP nicht. Versuchs mal mit einer Powershelldatei.

Grüße
Member: ErichWanker
ErichWanker Jan 15, 2020 at 14:11:40 (UTC)
Goto Top
Shit ... mit einer Powershell Datei funktionierts reibungslos ..
SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
285BE7AAF38CC4CF737E18A00E7F68344804483D  Valid                                  test1.ps1


Aber das hilft mir nix - ich will ja div. Dokumente signieren

Hab es grade mit einem Word-Dokument versucht - funktioniert auch nicht face-sad

PS C:\Users\erich> $cert = Get-PfxCertificate -FilePath "C:\zertifikat-test\firmenname.pfx"  
>> Set-AuthenticodeSignature -FilePath C:\zertifikat-test\test.docx -Certificate $cert
Geben Sie das Kennwort ein: ********



    Verzeichnis: C:\zertifikat-test


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
                                          UnknownError                           test.docx


PS C:\Users\erich>

hmmm ... gibt es da eine Möglichkeit wie ich (egal welche Dateiendung ein Dokument hat) signieren kann ?
Member: Bitboy
Bitboy Jan 15, 2020 at 14:16:38 (UTC)
Goto Top
Die Frage ist erstmal was genau das Ziel der Aktion sein soll "aus Datenschutzgründen" Dokumente signieren passt nicht recht zusammen.
Member: ErichWanker
ErichWanker Jan 15, 2020 at 14:20:52 (UTC)
Goto Top
Ich würde gerne ein beliebiges Dokument digital Signieren - um Änderungen zu unterbinden ..

dann eine Checksumme erstellen (Kryptografisch sichere Checksummen durch SHA-3 )
Dann das Dokument als BLOB in einer Datenbank speichern: Timestamp, User, Dokument und Hash der Checksumme / bei der Checksumme immer die Checksumme des vorherigen Eintrags einbeziehen

01.01.2020 | 08:00 | Mustermann M. | 0f765b3
02.01.2020 | 08:00 | Andere Mitar. | 5g5646c = (checksumme(currentrow + 0f765b3))
02.01.2020 | 07:30 | Mustermann M. | 17ff904 = (checksumme(currentrow + 5g5646c ))


somit hätte ich ein "sicheres" System
Member: Bitboy
Bitboy Jan 15, 2020 at 14:30:08 (UTC)
Goto Top
Wenn das Dokument nicht geändert werden soll, kann in einem einem ersten Schritt über die Art der Speicherung nachgedacht werden, beispielsweise WORM. Soll das ganze mit Datenbanksuche und diversen Extras funktionieren sind wir bereits bei Dokumenten Management Systemen.

Digitale Signaturen unterbinden das Verändern nicht, du siehst hinterher nur, dass es nicht mehr die Originaldatei ist.
Member: ErichWanker
ErichWanker Jan 15, 2020 at 14:54:28 (UTC)
Goto Top
Hallo Stefan ..

nach langem suchen hab ich endlich den Download gefunden, der dein "signtool.exe" enthält ..

https://developer.microsoft.com/de-de/windows/downloads/windows-10-sdk


Bis ich mal draufgekommen bin, das ich DANACH händisch "C:\Users\erich\Downloads\Windows Kits\10\WindowsSDK\Installers\Windows SDK Signing Tools-x86_en-us.msi" installieren musste - hat es ein wenig gedauert

Aber ich hab das gleiche Problem wie über die Powershell: Das Dateiformat ist nicht unterstützt ?? ..


C:\WINDOWS\system32>"C:\Program Files\Windows Kits\10\bin\10.0.18362.0\x86\signtool.exe" sign /f "C:\zertifikat-test\firmenname.pfx" /p "xxxx" /v /tr "http://timestamp.comodoca.com" /td SHA256 /fd SHA256 "C:\zertifikat-test\test2.txt"  
The following certificate was selected:
    Issued to: Firmenname
    Issued by: Firmenname
    Expires:   Sun Jan 15 14:21:28 2040
    SHA1 hash: 285BE7AAF38CC4CF737E18A00E7F68344804483D

Done Adding Additional Store
SignTool Error: This file format cannot be signed because it is not recognized.
SignTool Error: An error occurred while attempting to sign: C:\zertifikat-test\test2.txt

Number of files successfully Signed: 0
Number of warnings: 0
Number of errors: 1
Member: ErichWanker
ErichWanker Jan 15, 2020 at 14:59:28 (UTC)
Goto Top
"Digitale Signaturen unterbinden das Verändern nicht, du siehst hinterher nur, dass es nicht mehr die Originaldatei ist."

Eine Digitale Signatur würde mir ja schon helfen - da ich ja damit "beweisen" kann - das es sich um eine unverfälschte Datei handelt ..

Wieso kann dieses SignaturTool nur PowerShell Scripte signieren???? ..

Ich will doch blos ein paar verschiedene Dateitypen signieren - wieso ist alles immer soooo schwierig face-wink


Danke und Ligrü
Erich
Member: Bitboy
Bitboy Jan 15, 2020 at 15:06:18 (UTC)
Goto Top
Zitat von @ErichWanker:

"Digitale Signaturen unterbinden das Verändern nicht, du siehst hinterher nur, dass es nicht mehr die Originaldatei ist."

Eine Digitale Signatur würde mir ja schon helfen - da ich ja damit "beweisen" kann - das es sich um eine unverfälschte Datei handelt ..

Dazu reicht es wenn du den Hash der Datei speicherst. Wird diese verändert, passt der nicht mehr.
Deswegen gibts auf jeder Linux Downloadseite neben der ISO-Datei den Hashwert, aber eben keine signierte ISO
Member: ErichWanker
ErichWanker Jan 15, 2020 updated at 17:09:51 (UTC)
Goto Top
"Dazu reicht es wenn du den Hash der Datei speicherst."

Jein face-wink ... Die grad aus der Uni kommenden Personen, die dann das Audit durchführen sind das Problem: Wenn die "digitale Signatur" hören sind sie schon zufrieden - Prüfsummen und Co. sind keine Wörter die befriedigend wirken face-smile


PS. ... irgendwie MUSS es doch möglich sein face-wink
Welche Dateien können und dürfen signiert werden?
Grundsätzlich kann jeder Dateityp digital signiert werden

Die Einsatzgebiete der digitalen Signatur sind vielfältig. Üblicherweise werden elektronische Rechnungen signiert, hier sind die gebräuchlichsten Dateitypen .pdf, .doc, .txt, .xml und .html

Weiters werden Webseiten (.htm, .html-Dateien) und Mails signiert. Signierte Mails haben die Signatur als Anhang (Attachment) zum eigentlichen Mail.

Es können aber auch Programme signiert werden. Der Vorteil ist, dass man beim Programmstart erkennen kann, von wem das Programm stammt und dadurch gegen Spyware oder sonstige unerwünschte Programme besser geschützt ist. Ab dem Betriebssystem Microsoft XP wird beim Programmstart automatisch geprüft ob eine gültige Signatur vorliegt.

Weitere Anwendungsgebiete für signierte Dateien sind etwa elektronische Archive oder Krankengeschichten. Hier hat die Signatur den Vorteil, dass man nachträgliche Änderungen an den Dateien und damit unter Umständen Verfälschungen sofort erkennen kann.
Member: StefanKittel
StefanKittel Jan 15, 2020 at 18:40:41 (UTC)
Goto Top
Zitat von @ErichWanker:
Wieso kann dieses SignaturTool nur PowerShell Scripte signieren???? ..
Das hat mit dem Dateiformat zu tun.
Du kannst nur Dateitypen signieren die das von sich aus unterstützen.
Z.B. PS oder EXE.

Bei einem Textdokument weiß Windows schlicht nicht wohin mit der Signatur.

Du kannst auch einen Hash des Inhaltes erzeugen und als dateiname.hash speichern.

Stefan
Member: Bitboy
Bitboy Jan 16, 2020 at 09:07:30 (UTC)
Goto Top
Naja es bleibt ja dir überlassen weiter zu versuchen eine Lösung einzusetzen die für diesen Zweck nicht gedacht ist um Leute zufrieden zustellen die offensichtlich nicht wissen was sie tun (grade die Uni Leute sollten doch den Unterschied zwischen Signatur und Hash kennen). Oder du hörst auf deine Zeit zu verschwenden und hörst auf die Leute die dir gesagt haben, dass es nicht geht.

PS: Wenn wir schon bei Audit Status sind, dann wäre es erst recht Aufgabe einer Software die entsprechend zertifiziert ist statt einer Selbstbaulösung...
Mitglied: 142232
142232 Jan 16, 2020 updated at 10:19:16 (UTC)
Goto Top
Zitat von @ErichWanker:

"Dazu reicht es wenn du den Hash der Datei speicherst."

Jein face-wink ... Die grad aus der Uni kommenden Personen, die dann das Audit durchführen sind das Problem: Wenn die "digitale Signatur" hören sind sie schon zufrieden - Prüfsummen und Co. sind keine Wörter die befriedigend wirken face-smile


PS. ... irgendwie MUSS es doch möglich sein face-wink
Ist es ja auch, nur gibt es das bei PlainText-Dateien so wie die Kollegen schon korrekt angemerkt haben keinen vorgesehenen Platz für eine eingebettete Signatur, ohne die Dateistruktur zu zerstören, deswegen bettet man die Signatur entweder wie bei PS1 Dateien als Klartext mit in die Datei ein, oder legt eine signierte Hash-Datei der Original Datei bei.
Dabei wird der Hash der Datei erstellt und dieser zusätzlich signiert so das dieser nicht ohne aufzufallen manipulierbar ist
https://raymii.org/s/tutorials/Sign_and_verify_text_files_to_public_keys ...
Damit ist ebenfalls wie bei eingebetteten Signaturen die Unversehrtheit der Datei eindeutig überprüfbar.
Hoffe jetzt ist dir das endlich klar, wenn schon drei Leute dir das gleiche verklickern wollen . face-smile
Member: ErichWanker
ErichWanker Jan 17, 2020 at 14:07:23 (UTC)
Goto Top
Hallo serial..

Den Hash signieren ist ja eine coooole Idee ...

Ich erstelle einen Hash von div. Dateien via:
LoadOpenSSLLibrary;
              if TIdHashSHA256.IsAvailable then
              .....

und bekomme einen String als Ergebnis - den kann ich ja in ein Datei speichern - und diese dann signieren

ABER JETZT GEHTS JA WIEDER VON VORNE LOS .. FRAGE: Welche Dateiendung sollte ich dann da nehmen ? Ein Textfile (wo ich dann den Hash reinschreibe) kann ich ja nicht signieren?

Danke für Hinweise und Ligrü
Erich
Mitglied: 142232
142232 Jan 17, 2020 updated at 15:41:10 (UTC)
Goto Top
Welche Dateiendung sollte ich dann da nehmen ?
Ich nehme immer den Original-Dateinamen + mit der Endung *.signature angehängt.
Ein Textfile (wo ich dann den Hash reinschreibe) kann ich ja nicht signieren?
Du hast das Prinzip offensichtlich noch nicht verstanden. Am einfachsten die Signatur direkt als Binary-File speichern. Oder eben die Plaintextsignatur in ein File. Das File selbst must du nicht signieren!!

Kann man auch alles mit der PS und dem Namespace System.Security.Cryptography.RSACryptoServiceProvider abfackeln, das bietet entsprechende Methoden zum erstellen und gleichzeitigen Signieren eines Hashes mit Zertifikaten.
https://docs.microsoft.com/de-de/dotnet/api/system.security.cryptography ...
Member: StefanKittel
StefanKittel Jan 17, 2020 at 22:27:30 (UTC)
Goto Top
Hallo,
das mit dem Hash war nur ein Denkanstoss.

Eine Signatur ist ja ein Hash der Datei welche mit einem privaten Schlüssel signiert wird und dem öffentlichen Schlüssel zum überprüfen.
Nur den Hash kann ich nach der Manipulation der Datei ja auch neu erstellen.

Aber grundsätzlich funktionieren alle (rechtssicheren) Archive nach dem Prinzip.
Hash erstellen und so speichern dass dieser nicht manipulierbar ist. z.B. in der Blocklist.

Wenn Du die Hashes irgendwo noch getrennt speicherst kannst Du eine Datei ja jederzeit dagegen überprüfen.

Eine Signatur einer Datei ist genau das.