Powershell: S-MIME verschlüsselte und signierte E-Mail inkl. sicherem Anhang verschicken (Mailkit-Bibliothek)
- edit (18.12.2020) -
Falls Ihr vor dieser Aufgabe stehen solltet, gibt es hier eine Lösung dafür:
Der Code benötigt eine DLL die aus einem Projekt bei codeproject.com entstanden ist (Der c# Quellcode ist dort einsehbar). Falls Ihr keine Möglichkeit zum Kompilieren des Codes habt, könnt Ihr diese hier herunterladen (Hinweis: benötigt .NET 3.5).
## edit (18.12.2020): ##
Da hier das Interesse ja doch einigermaßen hoch an dem Thema ist , habe ich mal eine Powershell-Funktion mit der frei verfügbaren Mailkit-Bibliothek gescriptet die so gut wie sämtliche Möglichkeiten von Send-MailMessage bietet und darüber hinaus zusätzliche wie Inline-Images im HTML-Code und natürlich das signierte, verschlüsselte und kombinierte signierte+verschlüsselte Mails unterstützt.
Viel Erfolg
Grüße @colinardo
Hinweis: Powershell Code mit der öffentlich frei verfügbaren Mailkit-Bibliothek statt der CPI.Net DLL findet ihr weiter unten im Beitrag als Download.
Falls Ihr vor dieser Aufgabe stehen solltet, gibt es hier eine Lösung dafür:
Der Code benötigt eine DLL die aus einem Projekt bei codeproject.com entstanden ist (Der c# Quellcode ist dort einsehbar). Falls Ihr keine Möglichkeit zum Kompilieren des Codes habt, könnt Ihr diese hier herunterladen (Hinweis: benötigt .NET 3.5).
Powershell: Verschlüsselte und signierte E-Mail inkl. sicherem Anhang erstellen
Hinweise was anzupassen ist, findet Ihr im Quellcode# Code-Bibliothek laden
add-type -Path ".\Cpi.Net.SecureMail.dll"
# Zertifikat zur Verschlüsselung und Signierung der Mail inkl. dessen Passwort angeben
$mycert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2("D:\yourcryptocert.p12","PASSWORD_OF_CERTIFICATE")
# Öffentliches Zertifikat das Empfängers laden
$recipientCert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2("D:\recipient.cer")
# Sichere Mail-Nachricht erstellen
$mail = new-object Cpi.Net.SecureMail.SecureMailMessage
# Sender und Empfänger zur Nachricht hinzufügen
$mail.From = new-object Cpi.Net.SecureMail.SecureMailAddress("sender@domain.com","SENDERNAME",$mycert,$mycert)
$mail.To.Add((new-object Cpi.Net.SecureMail.SecureMailAddress("recipient@domain.com","RECIPIENTNAME",$recipientCert)))
$mail.Subject = "Dies ist der Betreff der Nachricht"
$mail.Body = "Diese der Body der Nachricht"
# Attachment zur Nachricht hinzufügen
$mail.Attachments.Add((new-object Cpi.Net.SecureMail.SecureAttachment("d:\yourattachment.txt")))
# Maileigenschaften festlegen (verschlüsselt und signiert)
$mail.IsSigned = $true
$mail.IsEncrypted = $true
# SMTP-Client mit Credentials erstellen
$smtp = new-object System.Net.Mail.SmtpClient("smtp.yourdomain.com", 25)
$smtp.Credentials = new-object System.Net.NetworkCredential("SMTPUSERNAME","SMTPPASSWORD")
# senden der Nachricht
$smtp.Send($mail)
## edit (18.12.2020): ##
Da hier das Interesse ja doch einigermaßen hoch an dem Thema ist , habe ich mal eine Powershell-Funktion mit der frei verfügbaren Mailkit-Bibliothek gescriptet die so gut wie sämtliche Möglichkeiten von Send-MailMessage bietet und darüber hinaus zusätzliche wie Inline-Images im HTML-Code und natürlich das signierte, verschlüsselte und kombinierte signierte+verschlüsselte Mails unterstützt.
Download gibt's hier:
mailkit_send_signed_encrypted_241025.zip
(siehe Kommentar weiter unten)Viel Erfolg
Grüße @colinardo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 241025
Url: https://administrator.de/contentid/241025
Ausgedruckt am: 23.11.2024 um 23:11 Uhr
30 Kommentare
Neuester Kommentar
Hallo,
feine Sache das!
Aber bei einigen wird es auf dasselbe Problem stoßen, das der TO hier hatte (Powershell: Send a mime encrypted email with excel file attachment).
Danke dafür!
Gruß
ANKH
feine Sache das!
Aber bei einigen wird es auf dasselbe Problem stoßen, das der TO hier hatte (Powershell: Send a mime encrypted email with excel file attachment).
Danke dafür!
Gruß
ANKH
Klasse, kommt wie gerufen und klappt hervorragend
Vielen Dank auch für die Bereitstellung der DLL, das hat es mir doch ziemlich erleichtert
Gruß
jodel32
Vielen Dank auch für die Bereitstellung der DLL, das hat es mir doch ziemlich erleichtert
Gruß
jodel32
Servus Colinardo,
ich habe gestern gesucht aber das scheint weiterhin der einzige einfache Weg zu sein um signierte Mails schicken zu können. Klappt auch gut aber meinst du es wäre möglich ein Zertifikat aus dem Zertifikatsspeicher zu benutzen? Das wäre mir lieber als die Zertifikate und Passwörter so abzulegen.
Grüße und schönes Wochenende
ich habe gestern gesucht aber das scheint weiterhin der einzige einfache Weg zu sein um signierte Mails schicken zu können. Klappt auch gut aber meinst du es wäre möglich ein Zertifikat aus dem Zertifikatsspeicher zu benutzen? Das wäre mir lieber als die Zertifikate und Passwörter so abzulegen.
Grüße und schönes Wochenende
Hallo Uwe
wie kann ich mit dem Script den Inhalt eines Ordners als Anhang mitsenden?
Sobald Ich versuche mehr als Einen Anhang zu versenden bleibt der Script
AUSFÜHRLICH: Creating smtp client.
AUSFÜHRLICH: Connecting to smtp server '*'.
AUSFÜHRLICH: Authentification with smtp server '*'.
AUSFÜHRLICH: Creating mail message.
stehen!
Vielen Dank
wie kann ich mit dem Script den Inhalt eines Ordners als Anhang mitsenden?
Sobald Ich versuche mehr als Einen Anhang zu versenden bleibt der Script
AUSFÜHRLICH: Creating smtp client.
AUSFÜHRLICH: Connecting to smtp server '*'.
AUSFÜHRLICH: Authentification with smtp server '*'.
AUSFÜHRLICH: Creating mail message.
stehen!
Vielen Dank
Hallo Uwe,
jetzt bekomme ich diese Fehlermeldung!
jetzt bekomme ich diese Fehlermeldung!
Exception calling "Connect" with "3" argument(s): "An error occurred while attempting to establish an SSL or TLS connection.
The host name did not match the name given in the server's SSL certificate.
"
At C:\PShell\Mailversand.ps1:164 char:13
+ throw $_.Exception.Message
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Exception calli...certificate.
":String) , RuntimeException
+ FullyQualifiedErrorId : Exception calling "Connect" with "3" argument(s): "An error occurred while attempting to establish an SSL or TLS connection.
The host name did not match the name given in the server's SSL certificate.
"
Hallo Uwe,
das Versenden klappt bei mir ohne Signieren einwandfrei.
Wenn ich die Parameter
einschalte, erhalte ich folgende Fehlermeldung:
Die Exception tritt an der Code-Stelle
auf.
Das Zertifikat ist laut certmgr.msc geeignet für
Digital Signature, Non-Repudiation, Key Encipherment (e0)
Hast Du eine Idee?
Vielen Dank,
Jürgen
das Versenden klappt bei mir ohne Signieren einwandfrei.
Wenn ich die Parameter
-smime_mode Sign `
-PrivateCertificate (Get-Item Cert:\CurrentUser\TrustedPeople\59F5E10B1AF686FD71CA0F99462C6DDAC5745948) `
-PublicCertificates @(Get-Item Cert:\CurrentUser\TrustedPeople\59F5E10B1AF686FD71CA0F99462C6DDAC5745948) `
einschalte, erhalte ich folgende Fehlermeldung:
Exception calling ".ctor" with "1" argument(s): "Invalid provider type specified.
"
At D:\temp\SendMail\SendMailkit.ps1:172 char:13
+ throw $_.Exception.Message
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Exception calli...e specified.
":String) , RuntimeException
+ FullyQualifiedErrorId : Exception calling ".ctor" with "1" argument(s): "Invalid provider type specified.
Die Exception tritt an der Code-Stelle
'Sign' {
Write-Verbose "SMIME: Signing message."
$mail.body = [MimeKit.Cryptography.ApplicationPkcs7Mime]::Sign([MimeKit.Cryptography.CmsSigner]::new($PrivateCertificate),$mail.Body)
}
auf.
Das Zertifikat ist laut certmgr.msc geeignet für
Digital Signature, Non-Repudiation, Key Encipherment (e0)
Hast Du eine Idee?
Vielen Dank,
Jürgen
Hallo Uwe,
vielen Dank für Deine Unterstützung
Leider hakt es weiterhin an der gleichen Stelle.
Ich habe das Zertifikat im Store unter CurrentUser\My abgelegt und
lade es über den entsprechenden Skript-Parameter von dort erfolgreich
in die Variable $PrivateCertificate.
Wenn ich dann allerdings in die Code-Zeile zum Signieren hinein-steppe:
wird die für mich nicht entschlüsselbare Exeption geworfen:
Das Zertifikat kann ich über Outlook erfolgreich zum Signieren verwenden.
certutil bemerkt u.a. folgendes zum von mir verwendeten Zertifikat:
Hast Du noch einen Tipp für mich?
Vielen Dank,
Jürgen
vielen Dank für Deine Unterstützung
Leider hakt es weiterhin an der gleichen Stelle.
Ich habe das Zertifikat im Store unter CurrentUser\My abgelegt und
lade es über den entsprechenden Skript-Parameter von dort erfolgreich
in die Variable $PrivateCertificate.
Wenn ich dann allerdings in die Code-Zeile zum Signieren hinein-steppe:
$mail.body = [MimeKit.Cryptography.ApplicationPkcs7Mime]::Sign([MimeKit.Cryptography.CmsSigner]::new($PrivateCertificate),$mail.Body)
wird die für mich nicht entschlüsselbare Exeption geworfen:
Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en): "Ungültigen Anbietertyp angegeben
"
In C:\Users\st1g\Downloads\Sent signed Mail\MailKit.ps1:203 Zeichen:13
+ throw $_.Exception.Message
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (Ausnahme beim A...yp angegeben
":String) , RuntimeException
+ FullyQualifiedErrorId : Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en): "Ungültigen Anbietertyp angegeben
Das Zertifikat kann ich über Outlook erfolgreich zum Signieren verwenden.
certutil bemerkt u.a. folgendes zum von mir verwendeten Zertifikat:
Anbieter = Microsoft Software Key Storage Provider
Anbietertyp = 0
RSA
Export Policy = 1
NCRYPT_ALLOW_EXPORT_FLAG -- 1
Algorithm Group: RSA
Algorithm Name: RSA
Length: 2048 (0x800)
Lengths:
dwMinLength = 512 (0x200)
dwMaxLength = 16384 (0x4000)
dwIncrement = 8 (0x8)
dwDefaultLength = 1024 (0x400)
Block Length: 256 (0x100)
Export Policy: 1 (0x1)
NCRYPT_ALLOW_EXPORT_FLAG -- 1
Key Usage: 16777215 (0xffffff)
NCRYPT_ALLOW_DECRYPT_FLAG -- 1
NCRYPT_ALLOW_SIGNING_FLAG -- 2
NCRYPT_ALLOW_KEY_AGREEMENT_FLAG -- 4
NCRYPT_ALLOW_KEY_IMPORT_FLAG -- 8
NCRYPT_ALLOW_ALL_USAGES -- ffffff (16777215)
Virtual Iso: 0 (0x0)
Per Boot Key: 0 (0x0)
Key Usage = ffffff (16777215)
NCRYPT_ALLOW_DECRYPT_FLAG -- 1
NCRYPT_ALLOW_SIGNING_FLAG -- 2
NCRYPT_ALLOW_KEY_AGREEMENT_FLAG -- 4
NCRYPT_ALLOW_KEY_IMPORT_FLAG -- 8
NCRYPT_ALLOW_ALL_USAGES -- ffffff (16777215)
Der private Schlüssel eignet sich nicht zum Nur-Text-Export.
Verschlüsselungstest wurde durchgeführt
CertUtil: -dump-Befehl wurde erfolgreich ausgeführt.
Hast Du noch einen Tipp für mich?
Vielen Dank,
Jürgen