Windows ルートストアの証明書情報を取得・分類する方法(PowerShell)

Windowsに搭載されているルート証明書と、手動で追加されたルート証明書を識別したいケースは少なくない。特に、Microsoftが信頼しているルート証明書だけを抽出したい場合や、証明書の公開鍵サイズや署名アルゴリズムの情報を確認したい場合に便利なのが、PowerShellによるスクリプトである。

Microsoftが信頼しているルート証明書のリストを更新する

Microsoftは、Windows Updateを通じて信頼されたルート証明書リスト(authroot.stl)を配布している。このリストはSST形式で取得可能であり、certutilコマンドを用いてローカルにダウンロードできる。

PowerShellの起動

  1. Windows キー + R を押して「ファイル名を指定して実行」を開く
  2. powershell と入力し「OK」をクリック
certutil -generateSSTFromWU authroot.sst

PowerShellスクリプトで証明書情報を抽出する

以下のPowerShellスクリプトでは、ローカルマシンのWindows ルートストアから特定の文字列を含む証明書を検索し、各証明書がMicrosoftにより信頼されているかどうかを判定する。さらに、証明書の主な属性に加え、公開鍵のビット長や署名アルゴリズム名も取得できる。
以下例では、例として「ISRG」(Let’ Encryptの組織名)を入れているが、空文字にした場合は、全件出力される。

$caName = "ISRG"  # ← CA名をここに設定

# authroot.sst から Microsoft 配布証明書を読み込む
$tempStore = New-Object System.Security.Cryptography.X509Certificates.X509Store "AuthRoot","CurrentUser"
certutil -generateSSTFromWU authroot.sst
$sstCerts = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection
$sstCerts.Import("authroot.sst")
$trustedThumbprints = $sstCerts | ForEach-Object { $_.Thumbprint.ToUpper() }

# ローカルルートストアから該当証明書を抽出
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$store.Open("ReadOnly")
$certs = $store.Certificates | Where-Object { $_.Subject -like "*$caName*" }

foreach ($cert in $certs) {
    $thumb = $cert.Thumbprint.ToUpper() -replace "\s", ""
    $isMicrosoftTrusted = $trustedThumbprints -contains $thumb

    [PSCustomObject]@{
        Issuer                 = $cert.Issuer
        Subject                = $cert.Subject
        SerialNumber           = $cert.SerialNumber
        NotBefore              = $cert.NotBefore
        NotAfter               = $cert.NotAfter
        EnhancedKeyUsageList   = $cert.EnhancedKeyUsageList
        FriendlyName           = $cert.FriendlyName
        Thumbprint             = $cert.Thumbprint
        PublicKeyAlgorithm     = $cert.PublicKey.Oid.FriendlyName
        SignatureAlgorithm     = $cert.SignatureAlgorithm.FriendlyName
        PublicKeySize          = $cert.PublicKey.Key.KeySize
        IsMicrosoftTrusted     = $isMicrosoftTrusted
    }
}

$store.Close()

出力例

Issuer               : CN=ISRG Root X1, O=Internet Security Research Group, C=US
Subject              : CN=ISRG Root X1, O=Internet Security Research Group, C=US
SerialNumber         : 008210CFB0D240E3594463E0BB63828B00
NotBefore            : 2015/06/04 20:04:38
NotAfter             : 2035/06/04 20:04:38
EnhancedKeyUsageList : {クライアント認証 (1.3.6.1.5.5.7.3.2), サーバー認証 (1.3.6.1.5.5.7.3.1)}
FriendlyName         : ISRG Root X1
Thumbprint           : CABD2A79A1076A31F21D253635CB039D4329A5E8
PublicKeyAlgorithm   : RSA
SignatureAlgorithm   : sha256RSA
PublicKeySize        : 4096
IsMicrosoftTrusted   : True

Issuer               : CN=ISRG Root X2, O=Internet Security Research Group, C=US
Subject              : CN=ISRG Root X2, O=Internet Security Research Group, C=US
SerialNumber         : 41D29DD172EAEEA780C12C6CE92F8752
NotBefore            : 2020/09/04 9:00:00
NotAfter             : 2040/09/18 1:00:00
EnhancedKeyUsageList : {クライアント認証 (1.3.6.1.5.5.7.3.2), サーバー認証 (1.3.6.1.5.5.7.3.1)}
FriendlyName         : ISRG Root X2
Thumbprint           : BDB1B93CD5978D45C6261455F8DB95C75AD153AF
PublicKeyAlgorithm   : ECC
SignatureAlgorithm   : sha384ECDSA
PublicKeySize        :
IsMicrosoftTrusted   : True

ECCの場合は、このスクリプトではPublicKeySizeを取得できない。

信頼されたルート証明書リスト (authrootwu) の検証出力から "SequenceNumber" と "ThisUpdate" を抽出

PowerShell で確認できる。

certutil -verifyctl -f authrootwu | Select-String "SequenceNumber|ThisUpdate"

解説:

  • certutil -verifyctl -f authrootwu:ルート証明書の状態を検証
  • | Select-String "SequenceNumber|ThisUpdate":PowerShell の Select-String コマンドレットで、対象のキーワードを含む行を抽出。複数キーワードは |(正規表現の OR)で指定可能。

タイトルとURLをコピーしました