• Bewerte uns auf OMR Reviews: Klick

  • Achtet bitte in den Beiträgen darauf, dass ihr keine Informationen teilt, die der DSGVO unterliegen können. Verpixelt bitte die entsprechenden Stellen in Screenshots, postet hier auf keinen Fall Messagatracks ohne Rücksprache und auch in den Log Files können persönliche oder sensible Daten enthalten sein.

    Macht uns auch bitte per PN darauf aufmerksam wenn ihr etwas seht. Schreibt mich (@sören) einfach direkt an. 

Script: Ungültige S/MIME-Zertifikate finden/entfernen

Patrick

Member
Wie wir festgestellt haben, gibt es leider in manchen Fällen eine fehlerhafte Anzeige der Zertifikats-Gültigkeit in der NoSpamProxy-Konsole. In der Intranet-Rolle werden nur die Einzelzertifikate geprüft, nicht jedoch die Zertifikatskette. Dies kann dazu führen, dass Zertifikate in der Konsole zwar als gültig angezeigt werden, aber von der Gateway-Rolle als ungültig erkannt und damit auch nicht zur Verschlüsselung verwendet werden.
Insbesondere in Bezug auf die GlobalSign-Thematik mit der aufgehobenen Zertifizierungsstelle gab es bei uns nun einige ungültige Zertifikate.

Dass hier die Intranet-Rolle auch die Zertifikats-Kette prüft bzw. diesbezüglich auch ein Abgleich der Gateway- und Intranet-Rolle stattfindet wurde bereits als Feature-Request aufgenommen. Um hier aber schnell "aufzuräumen", habe ich ein Script zum Aufräumen geschrieben. Vielleicht ist das auch für andere hilfreich.

Es werden zunächst alle Zertifikate, die von "GlobalSign PersonalSign*" ausgestellt wurden, gesucht (nur „TrustedPeople“, nicht die Zertifikate der eigenen Domains; Filter kann auch angepasst werden; ohne Filter wird die Laufzeit aber etwas in die Höhe gehen...).
Diese werden danach durch den Befehl Test-NspCertificate geprüft. Im Fall von einem Ergebnis "NoError" findet nichts weiter statt.
Ansonsten wird das Zertifikat exportiert und danach aus dem NSP gelöscht.
Zusätzlich erfolgt eine Prüfung auf weitere gültige Zertifikate für die jeweilige Adresse. Das Ergebnis wird danach zurückgegeben.
E-Mail-Adressen, die kein gültiges Zertifikat mehr haben, werden zusätzlich in eine Datei geschrieben.

Das Script unterstützt auch die "WhatIf"- und "Confirm"-Parameter, auch empfehle ich die Ausführung mit -Verbose (wobei ich hier die VerbosePreference am Anfang sowieso auf "Continue" setze). 
Obligatorisch: Ohne Gewähr, auf eigene Gefahr, vor Ausführung durchlesen und zunächst testen. :)




Code:
function Test-NSPCertificateValidity {
	[CmdletBinding(SupportsShouldProcess=$true,
		confirmImpact="High")]
	param (
		[String]$SubjectOrThumbprint="GlobalSign PersonalSign",
		[String]$GatewayRole,
		[String]$CertificateExportFolder="C:\temp\certExport",
		[String]$InvalidCertLog="C:\temp\noValidCert.txt"
	)
	process {
		$VerbosePreference="Continue"
		Write-Verbose "Starting..."
		Write-Verbose "Checking prerequisites..."
		# test prerequisites
		if (!(Get-Command "Get-NSPCertificate" -ErrorAction SilentlyContinue)) {
			Write-Error "Script has to be run on a NoSpamProxy server."
			return $false
		}

		if (!(Test-Path $CertificateExportFolder)) {
			Write-Error "Folder $CertificateExportFolder does not exist."
			return $false
		}

		##########################################
		#######      Get Certificates      #######
		##########################################
		# get random NSP-Gateway if it is not set
		if (!$GatewayRole) {
			$GatewayRole=(Get-NspGatewayRole | Get-Random).Name
		}
		Write-Verbose "Gateway to be checked: $GatewayRole"
		Write-Verbose "Getting certificates..."
		# get certificates to be checked
		$Certificates=Get-NspCertificate -StoreIds TrustedPeople -SubjectOrThumbprint $SubjectOrThumbprint
		Write-Verbose "...found $($certificates.count) certificates to be checked."

		##########################################
		####   Looping through Certificates   ####
		##########################################
		$Results=@()
		foreach ($Cert in $Certificates) {
			$CurrentAddress=$Cert.MailAddresses[0].Address
			$CurrentThumbprint=$Cert.Thumbprint
			Write-Verbose "Checking $CurrentAddress"
			$CurrentStatus=(Test-NspCertificate -Thumbprint $CurrentThumbprint -GatewayRole $GatewayRole)[0].ValidationResult
			Write-Verbose "           Status: $CurrentStatus"

			# if status is anything other than "NoError"
			if ($CurrentStatus -ne "NoError") {
				##########################################
				######    Exporting Certificate     ######
				##########################################
				Write-Verbose "           Exporting Certificate"
				$CerFile = "$CertificateExportFolder\$CurrentAddress-$CurrentThumbprint.cer"
				$BytetCertificate = (Export-NspCertificate -Thumbprint $CurrentThumbprint).Certificate
				[io.file]::WriteAllBytes("$CerFile", $BytetCertificate)
				Write-Verbose "           Exported to $CerFile"

				##########################################
				#### Checking other Certs for Address ####
				##########################################
				# reset some variables
				$ValidCert="None"
				$ValidCertCount=0

				$OtherCerts=Get-NSPCertificate $CurrentAddress | where Thumbprint -ne $CurrentThumbprint
				if ($OtherCerts) {
					Write-Verbose "      Other certificates:"
					foreach ($OtherCert in $OtherCerts) {
						$Status=(Test-NspCertificate -Thumbprint $OtherCert.Thumbprint -GatewayRole $GatewayRole)[0].ValidationResult
						Write-Verbose "           $($OtherCert.Thumbprint) - $Status"
						if ($Status -eq "NoError") {
							# remember valid certificate for results - only returns the last valid certificate, but has count of valid certificates
							$ValidCert=$OtherCert.Thumbprint
							$ValidCertCount++
						}
					}
				}

				##########################################
				#####    Log Invalid Certificates    #####
				##########################################
				# add address without a valid certificate to the InvalidCertLog-File
				if ($ValidCertCount -eq 0) {
					$CurrentAddress | Out-File -Append -FilePath $InvalidCertLog
				}

				##########################################
				#######       Results Object       #######
				##########################################
				$Obj = New-Object PSObject
				$Obj | Add-Member -MemberType NoteProperty -Name Address -Value $currentAddress
				$Obj | Add-Member -MemberType NoteProperty -Name CertStatus -Value $currentStatus
				$Obj | Add-Member -MemberType NoteProperty -Name ValidCert -Value $validCert
				$Obj | Add-Member -MemberType NoteProperty -Name ValidCertCount -Value $validCertCount
				# adding object to results
				$Results+=$Obj

				##########################################
				#######     Remove Certificate     #######
				##########################################
				# supports -WhatIf and needs to be confirmed
				if ($psCmdlet.shouldProcess("$CurrentThumbprint","Removing invalid certificate")) {
					Remove-NspCertificate $CurrentThumbprint
				}
				Write-Verbose "----------------------"
			}
		}
		Write-Verbose "Done!"
		return $Results
	}
}
 

Anhänge

  • 2021-05-18_16h41_08.png
    2021-05-18_16h41_08.png
    152.1 KB · Aufrufe: 9
Hallo,

wir haben dazu den passenden Support-Call gefunden und werden das Verhalten der Intranet Rolle anpassen.
 
Zurück
Oben