115 lines
5.6 KiB
Plaintext
115 lines
5.6 KiB
Plaintext
<#
|
|
#############################################################
|
|
# 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
|
|
} |