From fd30ef2e79997c27a41ab88480f95e7793612820 Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 28 Nov 2024 13:01:15 +0000 Subject: [PATCH] =?UTF-8?q?cert=5Fopn2ex=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cert_opn2ex | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 cert_opn2ex diff --git a/cert_opn2ex b/cert_opn2ex new file mode 100644 index 0000000..9353c4a --- /dev/null +++ b/cert_opn2ex @@ -0,0 +1,115 @@ +<# +############################################################# +# Script zum Import von Exchange-Zertifikaten, welche auf der OPNsense erzeugt wurden +# Copyright (C) Marius 2024 +# Dieses Skript erstellt und importiert automatisch Zertifikate aus den gegebenn .pem Files +# importiert diese in Microsoft Exchange und löscht alte Zertifikate. +############################################################# +#> + +# Pfad zum Zertifikatsverzeichnis +$CertDir = "PFAD ZUM EXPORTIEREN SCRIPT DER OPNSENSE" +$CertFile = Join-Path $CertDir "fullchain.pem" # Vollständige Zertifikatskette +$KeyFile = Join-Path $CertDir "key.pem" +$PfxFile = Join-Path $CertDir "cert.pfx" + +# Lade Exchange-Snap-In +try { + Write-Host "Lade Exchange-Snap-In..." + Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 -ErrorAction Stop + Write-Host "Exchange-Snap-In erfolgreich geladen." -ForegroundColor Green +} catch { + Write-Host "Fehler beim Laden des Exchange-Snap-Ins: $_" -ForegroundColor Red + return +} + +# Überprüfen, ob die benötigten Dateien im Verzeichnis vorhanden sind +if (!(Test-Path $CertFile) -or !(Test-Path $KeyFile)) { + Write-Host "Die erforderlichen Dateien (fullchain.pem oder key.pem) wurden nicht gefunden. Script beendet." -ForegroundColor Yellow + return +} + +Write-Host "Zertifikatsdateien gefunden. Erstelle .pfx-Datei..." + +# OpenSSL-Befehl ausführen +try { + $OpenSSLPath = "C:\Program Files\OpenSSL-Win64\bin\openssl.exe" # Pfad zu OpenSSL + & "$OpenSSLPath" pkcs12 -export -out "$PfxFile" -inkey "$KeyFile" -in "$CertFile" -password pass:!Sonne2000 + + # Überprüfen, ob die PFX-Datei erfolgreich erstellt wurde + if (Test-Path $PfxFile) { + Write-Host ".pfx Datei wurde erfolgreich erstellt: $PfxFile" -ForegroundColor Green + + # Seriennummer aus der vollständigen PEM-Datei extrahieren + Write-Host "Extrahiere Seriennummer aus der PEM-Datei..." + $SerialNumber = & "$OpenSSLPath" x509 -in "$CertFile" -serial -noout | ForEach-Object { $_.Split('=')[-1].Trim() } + + Write-Host "Seriennummer extrahiert: $SerialNumber" + + # Überprüfen, ob das Zertifikat bereits in Exchange vorhanden ist + $ExistingCert = Get-ExchangeCertificate | Where-Object { $_.SerialNumber -eq $SerialNumber } + + if ($ExistingCert) { + Write-Host "Das Zertifikat ist bereits in Exchange vorhanden. Kein Import erforderlich." -ForegroundColor Yellow + $Thumbprint = $ExistingCert.Thumbprint + } else { + # Zertifikat importieren + Write-Host "Importiere Zertifikat in Exchange..." + $ImportCert = Import-ExchangeCertificate -FileData ([System.IO.File]::ReadAllBytes($PfxFile)) -Password (ConvertTo-SecureString -String "!Sonne2000" -AsPlainText -Force) -PrivateKeyExportable:$true -FriendlyName "mx0.edv-ffb.de Zertifikat (ACME Client)" + + # Thumbprint direkt aus Exchange holen + $ImportedCert = Get-ExchangeCertificate | Where-Object { $_.FriendlyName -eq "mx0.edv-ffb.de Zertifikat (ACME Client)" } + if ($ImportedCert) { + $Thumbprint = $ImportedCert.Thumbprint + Write-Host "Zertifikat erfolgreich importiert: $Thumbprint" + } else { + Write-Host "Fehler: Zertifikat wurde importiert, aber kein Thumbprint gefunden." -ForegroundColor Red + return + } + } + + # Zertifikat aktivieren + if ($Thumbprint) { + Enable-ExchangeCertificate -Thumbprint $Thumbprint -Services POP,IMAP,SMTP,IIS -Force + Write-Host "Zertifikat wurde erfolgreich für Exchange-Dienste aktiviert." -ForegroundColor Green + + # Altes Zertifikat löschen + Write-Host "Suche und lösche das alte Zertifikat..." + $OldCert = Get-ExchangeCertificate | Where-Object { $_.FriendlyName -eq "mx0.edv-ffb.de (ACME Client)" -and $_.Thumbprint -ne $Thumbprint } + if ($OldCert) { + Remove-ExchangeCertificate -Thumbprint $OldCert.Thumbprint -Confirm:$false + Write-Host "Altes Zertifikat erfolgreich gelöscht: $($OldCert.Thumbprint)" -ForegroundColor Cyan + } else { + Write-Host "Kein altes Zertifikat gefunden, das gelöscht werden muss." -ForegroundColor Yellow + } + } else { + Write-Host "Kein Thumbprint verfügbar. Zertifikat konnte nicht aktiviert werden." -ForegroundColor Red + } + + # Entferne TLS-Zertifikat vom Send Connector + Write-Host "Entferne TLS-Zertifikat vom Outbound Office365 Send Connector..." + Set-SendConnector -Identity 'Outbound Office365' -TlsCertificateName $Null + Write-Host "TLS-Zertifikat erfolgreich entfernt." -ForegroundColor Cyan + + # Lösche alle Dateien im Verzeichnis + Write-Host "Lösche alle Dateien im Verzeichnis..." + Get-ChildItem -Path $CertDir -File | Remove-Item -Force + Write-Host "Alle Dateien wurden aus dem Verzeichnis gelöscht." -ForegroundColor Cyan + + # IIS-Dienst neu starten mit Timer + Write-Host "Starte IIS-Dienst neu..." + $startTime = Get-Date + iisreset > $null + while (-not (Get-Service W3SVC).Status -eq "Running") { + $elapsed = (Get-Date) - $startTime + Write-Host "Es wird versucht den Dienst zu starten... ($($elapsed.Seconds) Sekunden)" -NoNewline + Start-Sleep -Seconds 1 + Write-Host "`r" -NoNewline + } + Write-Host "`nIIS-Dienst wurde erfolgreich neu gestartet." -ForegroundColor Green + } else { + Write-Host "Fehler beim Erstellen der .pfx Datei." -ForegroundColor Red + } +} catch { + Write-Host "Ein Fehler ist aufgetreten: $_" -ForegroundColor Red +} \ No newline at end of file