<# ############################################################# # 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 }