Powershell-stuff/cert_opn2ex
2024-11-28 13:01:15 +00:00

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
}