{"id":2756,"date":"2026-09-11T09:22:05","date_gmt":"2026-09-11T07:22:05","guid":{"rendered":"https:\/\/hitco.at\/blog\/?p=2756"},"modified":"2026-09-11T09:30:58","modified_gmt":"2026-09-11T07:30:58","slug":"beliebige-dateien-7z-zip-yaml-mittels-catalogfiles-powershell-signieren","status":"publish","type":"post","link":"https:\/\/hitco.at\/blog\/beliebige-dateien-7z-zip-yaml-mittels-catalogfiles-powershell-signieren\/","title":{"rendered":"Beliebige Dateien (z.B. 7z, zip, yaml, &#8230;) mittels Catalog-Files und PowerShell signieren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Die Nutzung eines Code-Signing-Zertifikats zur Authenticode-Signatur ist f\u00fcr zahlreiche Datei-Typen die dies unterst\u00fctzen direkt inline m\u00f6glich. Als Beispiele seien *.exe, *.dll, *.ps1, &#8230; genannt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses kurze How-To besch\u00e4ftigt sich allerdings mit <strong>Datei-Typen, die keine Signatur unterst\u00fctzen<\/strong>. Beispielsweise ein YAML-Konfigurationsfile im Textformat, oder ZIP-Container sowie 7zip-Containerfiles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine elegante Variante beliebige Dateien unter Windows zu signieren ist die Nutzung von CatalogFiles (*.cat). Der Vorteil hierbei: Die Werkzeuge zur Signatur-Erstellung und zur Signatur-Pr\u00fcfung sind in Form der PowerShell-Commandlets <code><strong>New-FileCatalog<\/strong><\/code> sowie <code><strong>Test-FileCatalog<\/strong><\/code> auf jedem modernen Windows-System bereits vorhanden.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Catalog-Files: *.cat<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Catalog-Datei (*.cat) ist eine digital signierte Windows-Sicherheitskatalogdatei (Security Catalog). Diese speichert kryptografische Hashwerte (SHA1 oder SHA256 Fingerprints) einer Sammlung von Dateien. Typischerweise werden Catalog-Files verwendet, um Treiber- und Software-Pakete zu signieren. Man kann damit allerdings beliebige Dateien signieren, die Nutzung ist nicht auf Treiber- und Software-Pakete beschr\u00e4nkt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Statt jede einzelne Datei separat zu signieren, wird nur die Katalogdatei selbst mit einem Authenticode-Zertifikat digital signiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei zum Beispiel der Installation von Treibern pr\u00fcft Windows die Signatur der .cat-Datei und vergleicht die gespeicherten Hashes der Treiber-Dateien mit den tats\u00e4chlichen Dateien. Stimmt alles \u00fcberein, gilt das Paket als unver\u00e4ndert und vertrauensw\u00fcrdig. Die Datei ist intern eine PKCS#7-Struktur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir machen uns die einfache M\u00f6glichkeit Catalog-Files zu erstellen und zu pr\u00fcfen nun zu Nutze, um damit beliebige Dateien zu signieren sowie deren Signatur zu pr\u00fcfen.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Ein Catalog-File erstellen<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Erstellen wir zur Demonstration mittels <code><a href=\"https:\/\/learn.microsoft.com\/en-us\/powershell\/module\/microsoft.powershell.security\/new-filecatalog\" target=\"_blank\" rel=\"noopener\">New-FileCatalog<\/a><\/code> ein Catalog-File, das nachfolgende 6 Dateien signiert:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; highlight: [1]; title: ; notranslate\" title=\"\">\nPS C:\\temp\\Demofiles&gt; dir\n\n    Verzeichnis: C:\\temp\\Demofiles\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\n-a----        10.09.2026     23:27            748 Config.yaml\n-a----        10.09.2026     23:16          38601 Demodokument.pdf\n-a----        10.09.2026     23:18          84063 Demofiles.7z\n-a----        10.09.2026     23:17          84508 Demofiles.zip\n-a----        10.09.2026     21:56          52742 Grafik.png\n-a----        10.09.2026     23:27           2646 Readme.txt\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Schritt 1: Erstellung des Catalog-Files:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Erstellung des Catalog-Files ist unspektakul\u00e4r, wir w\u00e4hlen bewusst ein Catalog File in Version 2.0 um SHA256 Hashes zu erhalten, andernfalls w\u00fcrde man mit Version 1.0 nur SHA1 Hashes erzeugen, welche heutzutage aber keine akzeptable Kollisionsresistenz mehr bieten.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; highlight: [1]; title: ; notranslate\" title=\"\">\nPS C:\\temp\\Demofiles&gt; New-FileCatalog -Path . -CatalogFilePath signed-catalog.cat -CatalogVersion 2.0\n\nMode                 LastWriteTime         Length Name\n----                 -------------         ------ ----\n-a----        10.09.2026     23:33           2094 signed-catalog.cat\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Schritt 2: Authenticode-Signieren des Catalog-Files:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nun f\u00fchren wir die Authenticode-Signatur des Catalog-Files durch, das funktioniert wie von *.exe, *.dll, oder *.ps1 Dateien gewohnt:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; highlight: [1,7]; title: ; notranslate\" title=\"\">\n# Vorbereitung: Wir selektieren unser im Windows Certificate Store hinterlegtes Code-Signing-Zertifikat\nPS C:\\temp\\Demofiles&gt; $CertSubject = &quot;*HITCo Demo-Authenticode-Signer*&quot;\nPS C:\\temp\\Demofiles&gt; $Cert = Get-ChildItem -Path &quot;Cert:\\CurrentUser\\My&quot; | Where-Object { $_.Subject -like $CertSubject } | Select-Object -First 1\nPS C:\\temp\\Demofiles&gt; $Cert.Subject\nCN=HITCo Demo-Authenticode-Signer, OU=Dev-Department, O=HITCo.at, C=AT\n\n# Mit $Cert signieren wir nun das Catalog-File\nPS C:\\temp\\Demofiles&gt; Set-AuthenticodeSignature -FilePath .\\signed-catalog.cat -Certificate $Cert -TimestampServer &quot;http:\/\/timestamp.sectigo.com&quot;\n\n    Verzeichnis: C:\\temp\\Demofiles\n\n\nSignerCertificate                         Status                                                Path\n-----------------                         ------                                                ----\nB41CCA64A43FCA6B4E0CA1B03D580F1F3BB2DA4D  Valid                                                 signed-catalog.cat\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Anmerkung: Wie man sich eine Root-CA und daraus ein Signatur-Zertifikat ausstellt habe ich im Blog-Post <a href=\"https:\/\/hitco.at\/blog\/certificate-authority-windows-powershell-ca-smime-codesigning\/\" data-type=\"post\" data-id=\"2723\">Certificate Authority unter Windows mit PowerShell betreiben<\/a> erl\u00e4utert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das erstellte signed-catalog.cat enth\u00e4lt einen Katalog aller signierten Files mit deren Hashes, sowie eine Authenticode-Signatur mit dem verwendeten Code-Signing-Zertifikat samt Trusted-Timestamp-Signatur vom TimeStampServer Sectigo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/hitco.at\/blog\/wp-content\/uploads\/Catalogfile-Signature.png\"><img loading=\"lazy\" decoding=\"async\" width=\"566\" height=\"1005\" src=\"https:\/\/hitco.at\/blog\/wp-content\/uploads\/Catalogfile-Signature.png\" alt=\"\" class=\"wp-image-2771\" srcset=\"https:\/\/hitco.at\/blog\/wp-content\/uploads\/Catalogfile-Signature.png 566w, https:\/\/hitco.at\/blog\/wp-content\/uploads\/Catalogfile-Signature-169x300.png 169w, https:\/\/hitco.at\/blog\/wp-content\/uploads\/Catalogfile-Signature-80x142.png 80w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" \/><\/a><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Signatur-Pr\u00fcfung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Nun m\u00f6chten wir die Signatur-Pr\u00fcfung vornehmen. Wenn wir alle Files, die vom Catalog-File umfasst sind, im aktuellen Verzeichnis liegen haben, klappt das sehr einfach wie folgt:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; highlight: [1,17,21,33]; title: ; notranslate\" title=\"\">\n# Alle Dateien im aktuellen Verzeichnis gegen das CatalogFile pr\u00fcfen\nPS C:\\temp\\Demofiles&gt; $SignTest = Test-FileCatalog -Detailed -CatalogFilePath .\\signed-catalog.cat -Path .\nPS C:\\temp\\Demofiles&gt; $SignTest | Format-List\n\nStatus        : Valid\nHashAlgorithm : SHA256\nCatalogItems  : {&#x5B;Demofiles.zip, F3AA0DEC172207FFCED86AE63B2C5A48FD2B1FC206A1952A5114C5241F629245], &#x5B;Demodokument.pdf,\n                E8877A3D8ABB380ADB31D0BD68A2528EE438FDD19026D5CFE9A3C39ADBB91681], &#x5B;Demofiles.7z,\n                DA9F3D66C1AD8F043EBE86B44DB2C2C09934EDF2699E82FB54A055C3CAA18139], &#x5B;Grafik.png,\n                9E5C13BF40ACAEB7B887C68A3EA852D548767149DF470B57BFBD1B2E3C694E84]...}\nPathItems     : {&#x5B;Config.yaml, 04AB91927E7829A6816CA2515004301C9BB7FEE1319D15A11D848F93FA1A6EF6], &#x5B;Demodokument.pdf,\n                E8877A3D8ABB380ADB31D0BD68A2528EE438FDD19026D5CFE9A3C39ADBB91681], &#x5B;Demofiles.7z,\n                DA9F3D66C1AD8F043EBE86B44DB2C2C09934EDF2699E82FB54A055C3CAA18139], &#x5B;Demofiles.zip,\n                F3AA0DEC172207FFCED86AE63B2C5A48FD2B1FC206A1952A5114C5241F629245]...}\nSignature     : System.Management.Automation.Signature\n\n# Pr\u00fcfung erfolgreich?\nPS C:\\temp\\Demofiles&gt; $SignTest.Status -eq &quot;Valid&quot; -and $SignTest.HashAlgorithm -eq &quot;SHA256&quot;\nTrue\n\n# Welche Files wurden gepr\u00fcft?\nPS C:\\temp\\Demofiles&gt; $SignTest.PathItems\n\nKey              Value\n---              -----\nConfig.yaml      04AB91927E7829A6816CA2515004301C9BB7FEE1319D15A11D848F93FA1A6EF6\nDemodokument.pdf E8877A3D8ABB380ADB31D0BD68A2528EE438FDD19026D5CFE9A3C39ADBB91681\nDemofiles.7z     DA9F3D66C1AD8F043EBE86B44DB2C2C09934EDF2699E82FB54A055C3CAA18139\nDemofiles.zip    F3AA0DEC172207FFCED86AE63B2C5A48FD2B1FC206A1952A5114C5241F629245\nGrafik.png       9E5C13BF40ACAEB7B887C68A3EA852D548767149DF470B57BFBD1B2E3C694E84\nReadme.txt       679A0DB2BA2B5B8BECEC22AC1F892E1246371F637C246723DA8CD06292140B2F\n\n# Wer hat das unterschrieben?\nPS C:\\temp\\Demofiles&gt; $SignTest.Signature.SignerCertificate.Subject\nCN=HITCo Demo-Authenticode-Signer, OU=Dev-Department, O=HITCo.at, C=AT\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Wenn wir allerdings nur einige Files pr\u00fcfen m\u00f6chten, muss das -FilesToSkip Argument verwendet werden, weil die Catalog-File-Pr\u00fcfung sonst fehlschl\u00e4gt:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: powershell; highlight: [1,6,26,34]; title: ; notranslate\" title=\"\">\n# Wir m\u00f6chten nur zwei Files aus dem Catalog-File pr\u00fcfen, das schl\u00e4gt auf diese Weise aber fehl:\nPS C:\\temp\\Demofiles&gt; $SignTest = Test-FileCatalog -Detailed -CatalogFilePath .\\signed-catalog.cat `\n                                  -Path &quot;Config.yaml&quot;, &quot;Demofiles.zip&quot;\nPS C:\\temp\\Demofiles&gt; $SignTest.Status\nValidationFailed\n\n# Es schl\u00e4gt deshalb fehl, weil wir nur zwei PathItems gepr\u00fcft haben, aber sechs CatalogItems zur Pr\u00fcfung vorhanden sind:\nPS C:\\temp\\Demofiles&gt; $SignTest.PathItems\n\nKey           Value\n---           -----\nConfig.yaml   04AB91927E7829A6816CA2515004301C9BB7FEE1319D15A11D848F93FA1A6EF6\nDemofiles.zip F3AA0DEC172207FFCED86AE63B2C5A48FD2B1FC206A1952A5114C5241F629245\n\n\nPS C:\\temp\\Demofiles&gt; $SignTest.CatalogItems\n\nKey              Value\n---              -----\nDemofiles.zip    F3AA0DEC172207FFCED86AE63B2C5A48FD2B1FC206A1952A5114C5241F629245\nDemodokument.pdf E8877A3D8ABB380ADB31D0BD68A2528EE438FDD19026D5CFE9A3C39ADBB91681\nDemofiles.7z     DA9F3D66C1AD8F043EBE86B44DB2C2C09934EDF2699E82FB54A055C3CAA18139\nGrafik.png       9E5C13BF40ACAEB7B887C68A3EA852D548767149DF470B57BFBD1B2E3C694E84\nReadme.txt       679A0DB2BA2B5B8BECEC22AC1F892E1246371F637C246723DA8CD06292140B2F\nConfig.yaml      04AB91927E7829A6816CA2515004301C9BB7FEE1319D15A11D848F93FA1A6EF6\n\n# Um dies zu bewerkstelligen, ermitteln wir die zu skippenden Files:\nPS C:\\temp\\Demofiles&gt; $MissingFiles = $SignTest.CatalogItems.Keys | Where-Object { $SignTest.PathItems.Keys -notcontains $_ }\nPS C:\\temp\\Demofiles&gt; $MissingFiles\nDemodokument.pdf\nDemofiles.7z\nGrafik.png\nReadme.txt\n\n# Und nun teilen wir mit, welche Dateien im Zuge der Pr\u00fcfung zu \u00fcberspringen sind: \nPS C:\\temp\\Demofiles&gt; $SignTest = Test-FileCatalog -Detailed -CatalogFilePath .\\signed-catalog.cat `\n                                  -Path &quot;Config.yaml&quot;, &quot;Demofiles.zip&quot; -FilesToSkip $MissingFiles\nPS C:\\temp\\Demofiles&gt; $SignTest.Status\nValid\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Die Nutzung eines Code-Signing-Zertifikats zur Authenticode-Signatur ist f\u00fcr zahlreiche Datei-Typen die dies unterst\u00fctzen direkt inline m\u00f6glich. Als Beispiele seien *.exe, *.dll, *.ps1, &#8230; genannt. Dieses kurze How-To besch\u00e4ftigt sich allerdings mit Datei-Typen, die keine Signatur unterst\u00fctzen. Beispielsweise ein YAML-Konfigurationsfile im Textformat, oder ZIP-Container sowie 7zip-Containerfiles. Eine elegante Variante beliebige Dateien unter Windows zu signieren ist die Nutzung von CatalogFiles (*.cat)&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":2771,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3,635,4,23],"tags":[637,636,217,639,638],"class_list":["post-2756","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it","category-powershell","category-security","category-windows","tag-7z","tag-catalogfile","tag-powershell","tag-yaml","tag-zip"],"_links":{"self":[{"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/posts\/2756","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/comments?post=2756"}],"version-history":[{"count":26,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/posts\/2756\/revisions"}],"predecessor-version":[{"id":2800,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/posts\/2756\/revisions\/2800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/media\/2771"}],"wp:attachment":[{"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/media?parent=2756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/categories?post=2756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hitco.at\/blog\/wp-json\/wp\/v2\/tags?post=2756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}