Erstellen eines Zertifikats per Inf-Datei und ein kleiner Unterschied zwischen der ISE und Visual Studio Code

Visual Studio Code ist ein genialer Universaleditor mit unzähligen Erweiterungen. Eine davon macht Code zu einem mehr als vollwertigen Editor für PowerShell-Skripte inklusive Eingabehilfen und einer deutlich besseren Debugger-Unterstützung. Die einzige kleine Einschränkung gegenüber der ISE ist, dass bei „Code“ eine Befehlsfolge in einer Datei gespeichert werden muss, damit sie als PowerShell-Skript ausgeführt werden kann.

Eine weitere Eigenheit von Code hat mich vor einiger Zeit etwas Nerven gekostet. Ein Skript führte zu einem eigentlich harmlosen „Die Zeichenfolge hat kein Abschlusszeichen“-Fehler, dessen Ursache ich einfach nicht finden konnte. In der ISE wurde dasselbe Skript problemlos ausgeführt. Am Ende stellt sich heraus, dass es genau die BOM-Bytes waren, die bei der ISE automatisch einer Textdatei vorangestellt werden. Nachdem ich das Skript auch in Code als „UTF-8 with BOM“ gespeichert hatte, funktioniert es dort genauso.

Das Skript ist eine kleine Demo des Protect-CMS-Cmdlets, das in der Windows PowerShell die Verschlüsselung von Zeichenketten mit Hilfe eines für die Dokumentesignierung geeigneten Zertifikats erledigt. Das Zertifikat wird mit Hilfe einer Inf-Datei und dem Befehlszeilentool certreg.exe angelegt. In die Inf-Datei muss lediglich ein Wert für subject eingetragen werden.

<#
 .Synopsis
 Ein Kennwort verschlüsseln per Cryptographic Message Syntax (CMS) und einem Zertifikat
 .Notes
 Geht nicht bei PowerShell Core
#>

# Schritt 1: Zertifikat anlegen, das für die Dokumentverschlüsselung geeignet ist

$InfPfad = Join-Path -Path $PSScriptRoot -ChildPath PsKursZertifikat.inf

{[Version]
    Signature = "$Windows NT$"
    
    [Strings]
    szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
    szOID_DOCUMENT_ENCRYPTION = "1.3.6.1.4.1.311.80.1"
    
    [NewRequest]
    Subject = "cn=pskurs"
    MachineKeySet = false
    KeyLength = 2048
    KeySpec = AT_KEYEXCHANGE
    HashAlgorithm = Sha1
    Exportable = true
    RequestType = Cert
    KeyUsage = "CERT_KEY_ENCIPHERMENT_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE"
    ValidityPeriod = "Years"
    ValidityPeriodUnits = "1000"
    
    [Extensions]
    %szOID_ENHANCED_KEY_USAGE% = "{text}%szOID_DOCUMENT_ENCRYPTION%"
}  | Out-File -FilePath $InfPfad

# Set-Content geht nicht, da {} nicht mitgespeichert werden darf

$CerPfad = Join-Path -Path $PSScriptRoot -ChildPath PsKursZertifikat.cer

# Zertifikat vorher löschen
dir Cert:\CurrentUser\my | Where-Object Subject -eq "cn=pskurs" | del

# Cer-Datei löschen
$CerPfad | Remove-Item -ErrorAction Ignore

# Zertifikat anlegen
Certreq.exe -new $InfPfad $CerPfad

$PwPfad = Join-Path -Path $PSScriptRoot -ChildPath PwCert.dat

# Wurde die Cer-Datei angelegt?
Test-Path -Path $CerPfad

# Alle Zertifikate auflisten, mit denen sich Dokumente verschlüsseln lassen
dir -Path Cert:\CurrentUser\My –DocumentEncryptionCert

# Schritt 2: Kennwort mit dem Zertifikat verschlüsseln
$PwString = "demo+1234"

$PwString | Protect-CmsMessage -To "cn=pskurs2" > $PwPfad

# Schritt 3: Kennwort wieder einlesen
$PwNeu = Get-Content -Path $PwPfad | Unprotect-CmsMessage
$PwNeu

# Details der verschlüsselten Nachrichten ausgeben
Get-Content -Path $PwPfad  | Get-CmsMessage

Ein Gedanke zu „Erstellen eines Zertifikats per Inf-Datei und ein kleiner Unterschied zwischen der ISE und Visual Studio Code

  1. christian

    Hi
    danke dafür, eine nette Idee.

    Eine Sache aber – es ist nicht zwingend notwendig die Datei abzuspeichern. Es reicht unten rechts statt „Plain Text“ „PowerShell“ auszuwählen. Dann muss nicht ständig gespeichert werden.
    Das lässt sich auch voreinstellen.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.