Я пытаюсь просмотреть сертификаты Windows на своем компьютере, но пользовательский интерфейс для certmgr и MMC ужасен. В частности, мне нужен быстрый способ просмотра и сравнения отпечатков пальцев и понятных имен. Кто-нибудь знает лучший инструмент для этого?
Не обязательно должен быть графический интерфейс, меня устраивают консольные команды, если они работают лучше.
Вы можете открыть консоль Powershell и использовать команду dir в поставщике Cert: для отображения нужной информации. Например, в приведенных ниже командах будут перечислены отпечатки пальцев и темы (понятные имена) для сертификатов текущего пользователя и сертификатов компьютеров соответственно:
dir Cert:\CurrentUser\My
ls Cert:\LocalMachine\My\
Вы можете выполнить команду ниже, чтобы получить дополнительную информацию о том, как работать с сертификатами с помощью поставщика сертификатов в Powershell.
help certificate
Или вы можете прочитать больше онлайн Вот
Я создал сценарий PowerShell, который упрощает поиск сертификатов по отпечатку пальца, именам субъектов или серийным номерам.
По умолчанию он будет искать в хранилищах сертификатов «CurrentUser» и «LocalMachine», а также выполнять поиск без учета регистра по отпечатку пальца, именам субъектов и серийному номеру. Вы также можете добавить -PrivateKey, чтобы перечислить только сертификаты с закрытым ключом, и -expiration, чтобы перечислить сертификаты по дате истечения срока. За исключением случая использования флага -expiration, он вернет список реальных объектов .NET X509Certificate, которыми вы можете манипулировать.
Примеры использования:
get-cert a909
get-cert contoso -privateKey
он также добавляет два псевдонима: lscert, dircert
function Get-Cert {
param (
[string]$filter,
[string]$thumbprint,
[string]$subject,
[string]$altName,
[string]$serialNumber,
[switch]$expiration,
[switch]$privateKey,
[string[]]$certDirectoryOverride,
[string[]]$localFolders
)
$certDirectories = "cert:\CurrentUser\My", "cert:\LocalMachine\My"
# Set the cert store to list from
$certStores = $certDirectories
if ($certDirectoryOverride -ne $null) {
$certStores = $certDirectoryOverride
}
$items = @()
# get all certs from the stores
foreach ($store in $certStores) {
$items += ls $store
}
if ($localFolders) {
foreach ($folder in $localFolders) {
$localCertPaths = ls -path $folder -i *cer -rec
foreach ($certPath in $localCertPaths) {
$fullName = $certPath.FullName
$directoryName = $certPath.DirectoryName
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($certPath)
add-member -InputObject $cert -MemberType NoteProperty -Name PSParentPath -Value $directoryName -ErrorAction SilentlyContinue
add-member -InputObject $cert -MemberType NoteProperty -Name Path -Value $fullName
add-member -InputObject $cert -MemberType NoteProperty -Name FileName -Value $fileName
$items += $cert;
}
}
}
# add handy expiration property
$items | %{
add-member -InputObject $_ -MemberType ScriptProperty -Name Expiration -Value {[DateTime]$this.GetExpirationDateString()} -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name Path -Value PSPath -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name FileName -Value PSPath -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType ScriptProperty -Name SubjectAlternateNames -ErrorAction SilentlyContinue -Value {
return ($this.Extensions | Where-Object {$_.Oid.FriendlyName -eq "subject alternative name"}).Format(1).Replace("`r`n",", ").Replace("DNS Name=","")
}
add-member -InputObject $_ -MemberType AliasProperty -Name AlternateNames -Value SubjectAlternateNames -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name AlternativeNames -Value SubjectAlternateNames -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name SubjectAlternativeNames -Value SubjectAlternateNames -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name SubjectAltNames -Value SubjectAlternateNames -ErrorAction SilentlyContinue
add-member -InputObject $_ -MemberType AliasProperty -Name AltNames -Value SubjectAlternateNames -ErrorAction SilentlyContinue
}
# filter all the certs
if ($filter -ne $null) {
$items = $items | where-object {
($_.Thumbprint -match $filter) -or
($_.Subject -match $filter) -or
($_.SerialNumber -match $filter) -or
($_.SubjectAlternateName -match $filter)
}
}
if ($thumbprint -ne $null) {
$items = $items | where {$_.Thumbprint -match $thumbprint}
}
if ($subject -ne $null) {
$items = $items | where {$_.Subject -match $subject}
}
if ($altName -ne $null) {
$items = $items | where {$_.SubjectAlternateNames -match $altName}
}
if ($serialNumber -ne $null) {
$items = $items | where {$_.SerialNumber -match $serialNumber}
}
if ($privateKey) {
$items = $items | where {$_.PrivateKey -ne $null}
}
if ($expiration) {
return $items | sort expiration | ft expiration, thumbprint, subject
}
return $items
}
new-alias lscert Get-Cert -ErrorAction SilentlyContinue
new-alias dircert Get-Cert -ErrorAction SilentlyContinue
Вы можете использовать сценарий VBS, например:
Dim store
Set store = CreateObject("CAPICOM.Store")
WScript.Echo "Dumping local Root CAs:"
store.Open , "Root", 0 ' or "My" or "CA"
For Each cert In store.CERTIFICATES
WScript.Echo cert.SubjectName
'WScript.Echo cert.SerialNumber
WScript.Echo cert.Thumbprint
WScript.Echo "---------------------------------------"
Next
WScript.Echo "============================================================================="
WScript.Echo "Dumping Personal CAs:"
store.Open , "CA", 0
For Each cert In store.CERTIFICATES
WScript.Echo cert.SubjectName
'WScript.Echo cert.SerialNumber
WScript.Echo cert.Thumbprint
WScript.Echo "---------------------------------------"
Next
WScript.Echo "============================================================================="
WScript.Echo "Dumping Personal certificates:"
store.Open , "My", 0
For Each cert In store.CERTIFICATES
WScript.Echo cert.SubjectName
'WScript.Echo cert.SerialNumber
WScript.Echo cert.Thumbprint
WScript.Echo "---------------------------------------"
Next
Скопируйте код в файл с именем dumpcerts.vbs и выполните
cscript dumpcerts.vbs