Web tanúsítványának ellenőrzése távolról

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.



Word To HTML Converter