Powershell Zertifikate prüfen?
folgende Sache:
Ich habe eine csv Datei in der 2 Webseiten verlinkt sind. Ich möchte die Zertifikate dieser Seite prüfen und eventuell eine Warnmeldung haben, wenn diese auslaufen. Versuche vergeblich hierfür ein Script zu schreiben. Wäre nett wenn mir jemand helfen könnte.
2 Antworten
Die Nummer mit den Zertifikaten kann ich mir Dank ZaoDaDong sparen.
bliebe der eigentlich einfachere Teil, die Arbeit mit CSVs...
Gewöhn kommen gut exportierte CSV nicht ohne Header, aber es gibt sie...
"test - Headerles.csv"
"2021-05-22","5","bla und Blub","https://www.gutefrage.net/frage/powershell-zertifikate-pruefen","666"
"13.06.2021","47","Blalali Ritschratsch","https://www.google.com/search?q=example","0.314"
getHeaderlessCSV.ps1
#CSV-Datei (ohne Header) in ein costom-Objekte laden...
#Header selbst definieren
$Header="Datum","Irgendwas","WasAnderes","Link","sonstwas"
$myObjekts = Import-Csv 'test - Headerles.csv' -Header $Header
#einzeln anzeigen
$myObjekts|%{
Write-Host 'Das aktuell Opjekt:' -f green
$_
}
pause
Die "normale" CSV-Datei kommt s daher:
test.csv
"Datum","Irgendwas","WasAnderes","Link","sonstwas"
"2021\05\22","5","bla und Blub","https://www.gutefrage.net/frage/powershell-zertifikate-pruefen","666"
"13.06.2021","47","Blalali Ritschratsch","https://www.google.com/search?q=example","0.314"
das Vorgehen ist fast gleich, nur das wir keinen expliziten Header definieren müssen.
getCSV.ps1
Import-Csv 'test.csv'|%{
Write-Host 'Das aktuell Opjekt:' -f green
$_
}
...allerdings haben die Felder des importierten Objekts alle den Typ String. Das ist erstmal nicht weiter schlimm, da Powershell bei einfachen Typen die Conversion der Datentypen am späteren Einsatzort von selbst vornimmt.
aber schöner kann es sein, wenn wir gleich voll typisierte Objekte "bauen". dabei können wir wirklich kreativ sein.
Import-Csv 'test.csv'|%{
[PSCustomObject]@{
Date = (Get-Date $_.Datum)
ShoeSize = [int]$_.Irgendwas
Name = $_.WasAnderes
Uri = [uri]$_.Link
XValue = [double]$_.sonstwas
}
}
pause
...aber wieder zu ZaoDaDong's Link (Butter bei die Fische):
$myCertificateStamps = Import-Csv 'test.csv'|%{
$req = [Net.HttpWebRequest]::Create($_.link)
$req.GetResponse() >$Null
[PSCustomObject]@{
URL = $_.Link
# vergiss solchen Kack wie 'Name mit Leerzeichen' = "Laberrhababer" !!! In Properties immer saubere Feldbezeichner verwenden!!!
CertStartDate = $req.ServicePoint.Certificate.GetEffectiveDateString()
CertEndDate = $req.ServicePoint.Certificate.GetExpirationDateString()
}
}
$myCertificateStamps|format-list *
$myCertificateStamps[0].url
$myCertificateStamps[0].CertEndDate
pause
Aber Dir ist schon klar, das die Anordnung/Namen der Felder in Deiner csv ganz anders sein kann als in meiner Demo? Das musst Du natürlich selbst anpassen.
Ich habe nicht umsonst in den ersten beiden Codeblöcken gezeigt wie man mit verschiedenen CSV-Typen verfährt.
+ $req = [Net.HttpWebRequest]::Create($_.link)
naklar... ich rufe in der Demo (Butter bei die Fische) das csv als Datei mit Haeder auf.
In der Hoffnung das du kapiert hast wie man generell ein csv behandelt. Hast Du überhaupt begriffen was in der Pipevariable $_ übergeben wird? und wo die Felder eines Objekts, welches Import-Csv übergibt herkommen?
und natürlich hagelt es Fehlermeldungen wenn bereits beim 1.Schritt eine Variable keinen oder den falschen Wert/Typ hat.
bevor Du mit Requests herumrödelst, sollte erstmal die Basis sitzen. Du must ersmal lernen wie eine Pipeline funktioniert, wie Foreach-Objekt (%{...}) arbeitet.
Ich habe nicht umsonst die ersten Beiden Demos so unterschiedlich geschrieben... (ich erwarte dann das der Fragesteller allein vergleicht und einen Aha-Effect hat...
Alles gut, hatte einige Gedankenfehler. Deine sachen klappen alle soweit, danke auf jeden fall!!.
Nur hab ich in der csv datei nicht nur eine Spalte sondern mehrere, dementsprechend mehrere url`s. Dein Skript gibt zurzeit nur die erste url wieder. Gibt es (z.B. mit ForEach) eine möglichkeit das zu berücksichtigen ?
ps: falls jetzt die Frage der Gültigkeitsprüfung aufkommen sollte...
Datumangaben sind vergleichbar. (basierend auf den Variablen des Letzten Codelistings:
$myCertificateStamps|%{
$_.url
if ((get-date $_.CertEndDate) -lt (get-date)){
write-host 'abgelaufen' -f red
}
else {
write-host ('gueltig bis {0}'-f $_.CertEndDate) -f green
}
}
Hier steht beschrieben, wie man das umsetzen kann: https://www.tutorialspoint.com/how-to-get-website-ssl-certificate-validity-dates-with-powershell
Die zeigen leider nicht, wie man dir urls aus einer csv Datei holt
Das ist doch eher trivial. https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-7.2
So sieht meine Fehlermeldung aus, wenn ich an meine csv datei verlinke mit deiner Methode. Muss ich noch etwas ändern statt dem Pfad ?