Windowsに搭載されているルート証明書と、手動で追加されたルート証明書を識別したいケースは少なくない。特に、Microsoftが信頼しているルート証明書だけを抽出したい場合や、証明書の公開鍵サイズや署名アルゴリズムの情報を確認したい場合に便利なのが、PowerShellによるスクリプトである。
Microsoftが信頼しているルート証明書のリストを更新する
Microsoftは、Windows Updateを通じて信頼されたルート証明書リスト(authroot.stl
)を配布している。このリストはSST形式で取得可能であり、certutil
コマンドを用いてローカルにダウンロードできる。
PowerShellの起動
Windows
キー +R
を押して「ファイル名を指定して実行」を開く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)で指定可能。