Назад | Перейти на главную страницу

Лучший способ просмотреть сертификаты Windows, чем MMC?

Я пытаюсь просмотреть сертификаты 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