Az alábbi függvény jó példa arra, hogyan lehet ügyesen több .NET osztály együttműködésével összetett feladatot végrehajtani. Itt egy tetszőleges URL-en található titkosított weboldal tanúsítványát lehet ellenőrizni, akár abban az esetben is, ha a tanúsítvány valami miatt nem érvényes: például lejárt, vagy nem egyezik az URL-ben található név a tanúsítványban felsorolt nevekkel:
function Check-WebCertificate{
param([string] $url)
$timeoutMilliseconds = 10000
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$req = [Net.HttpWebRequest]::Create($url)
$req.Timeout = $timeoutMilliseconds
try {
[void] $req.GetResponse()
}
catch {
Write-Error $_.exception.innerexception.message
}
if($req.ServicePoint.Certificate){
$Cert = [Security.Cryptography.X509Certificates.X509Certificate2]$req.ServicePoint.Certificate.Handle
try {
$SAN = ($Cert.Extensions | Where-Object {$_.Oid.Value -eq "2.5.29.17"}).Format($true) -replace "DNS Name=",""
}
catch {
$SAN = $null
}
$expiration = $cert.NotAfter
$result = @{
ExpiresInDays = ($expiration - (get-date)).TotalDays
Expiration = $expiration
Name = $req.ServicePoint.Certificate.GetName()
Issuer = $cert.Issuer
Subject = $cert.Subject
SAN = $SAN
}
}
New-Object -TypeName PSObject -Property $result
}
Nézzük, mit eredményez ez, ha futtatjuk:
PS C:\> Check-WebCertificate -url https://msdn.microsoft.com
Name : CN=msdn.microsoft.com
Expiration : 2016.08.21. 19:22:07
ExpiresInDays : 262,888992282201
Issuer : CN=Microsoft IT SSL SHA2, OU=Microsoft IT, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Subject : CN=msdn.microsoft.com
SAN : msdn.microsoft.com
server1.msdn.microsoft.com
server2.msdn.microsoft.com
server3.msdn.microsoft.com
Látható, hogy legfontosabb adatokat sikerült a tanúsítványról megszerezni egy Net.HttpWebRequest hívás során. Itt most minket nem az „igazi” válasz érdekel minket, azt elnyomom a GetResponse hívás try blokkjában. Hanem a válasz körülményei érdekelnek, amik a $req objektum tulajdonságaiban vannak, többek között a tanúsítvány is. Ahhoz, hogy bármilyen eredményre jussunk egy rossz tanúsítvány esetében is, a [Net.ServicePointManager]::ServerCertificateValidationCallback statikus tulajdonságnak egy fix „zöld jelzést” adó {$true} szkriptblokkot adunk.
Ugyan a tanúsítvány a $req.ServicePoint.Certificate tulajdonságban is benne van, ez csak egy minimálverziós tanúsítvány, aminek nincs meg a számunkra fontos minden tulajdonsága. Így ennek a handle tulajdonságának felhasználásával egy teljes értékű tanúsítványt készítünk a $cert változóba, ahonnan már minden számunkra fontos információ kiolvasható, amiből egy egyedi objektumot készítek.