Home > Windows にまつわる e.t.c.

PowerShell で有効期限が迫った証明書を探す


Windows では、証明書の有効期限が迫った証明書がある場合に、イベントログのアプリケーションログにイベント ID 64 が記録されます。

 

イベントログには証明書の拇印しか表示されないので、どの証明の期限が迫っているのか探すのが意外と手間です。

GUI で証明書を確認する場合、証明書は「現在のユーザー」(certmgr.msc)と「ローカルコンピューター」(certlm.msc)の2か所に分かれています。

更に、GUI では拇印が一覧表示されていないので、有効期限で sort してアタリを付けて証明書を開き拇印を確認する必要があります。

GUI では手間がかかりますが、PowerShell であれば簡単に対象の証明書検索することが出来ます。

$ThumbprintOrg にイベントログで検出された拇印をセットして検索すれば、現在のユーザーとローカルコンピューターの両方の証明書ストアから該当の証明書を一発で見つけられます。

$ThumbprintOrg = 'c5 fd 67 a7 8d 82 92 fc da f6 a0 26 d0 51 05 a5 26 4a e3 54'
$Thumbprint = $ThumbprintOrg -replace " ",""
$Certs = dir cert: -Recurse
[array]$Tergets = $Certs |? Thumbprint -eq $Thumbprint
$Tergets | Select PSParentPath, Issuer, NotAfter

 

今回の例では「LocalMachine\My」の証明書なので、[ローカルコンピューター]-[個人]に格納されている「MS-Organization-P2P-Access [2020]」証明書であることがわかります。

証明書を開くと、確かにイベントログに記録されていた証明書であることがわかります。

 

自動削除されない証明書の場合で、新しい証明書がセットされている等、削除して構わない状態であれば証明書を削除すれば警告は出なくなります。

Web Server の SSL 証明書が切れそうになっているとかの場合は、急いで更新してください。

今回の例は Azure AD が発行した証明書が自動削除される前に検出されたイベントなので対応の必要が無いケースでした。

 

既に期限が切れている証明書を削除するのであれば、先に証明書を検出した結果を使って、以下のスクリプトで削除すると簡単です。

foreach( $Terget in $Tergets ){
    if( $Terget.NotAfter -lt (Get-Date) ){
        $CertPath = Join-path $Terget.PSParentPath $Terget.PSChildName
        echo "Expired certificate : $CertPath"
        Remove-Item $CertPath
    }
}

 

リモートコンピュータのローカルコンピューター証明書の確認と削除をする場合はこんな感じにすると良いです。

function RemoveExpiredCertificate($ThumbprintString){
    $ThumbprintOrg = $ThumbprintString
    $Thumbprint = $ThumbprintOrg -replace " ",""
    $Certs = dir Cert:\LocalMachine\my
    [array]$Tergets = $Certs |? Thumbprint -eq $Thumbprint
    $Tergets | Select PSParentPath, Issuer, NotAfter
    foreach( $Terget in $Tergets ){
        if( $Terget.NotAfter -lt (Get-Date) ){
            $CertPath = Join-path $Terget.PSParentPath $Terget.PSChildName
            echo "Expired certificate : $CertPath"
            Remove-Item $CertPath
        }
    }
}

Invoke-Command -ScriptBlock $function:RemoveExpiredCertificate -ComputerName hogehoge -ArgumentList 'c5 fd 67 a7 8d 82 92 fc da f6 a0 26 d0 51 05 a5 26 4a e3 54'

 

GitHub にスクリプト置いているので、御入用であればこちらから Clone してください

https://github.com/MuraAtVwnet/RemoveCert

git@github.com:MuraAtVwnet/RemoveCert.git

 

関連情報

リモート コンピューターのバッチ操作(Invoke-Command)
https://www.vwnet.jp/Windows/PowerShell/InvokeCommand.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.