Я использую следующую оболочку PowerShell, чтобы получить список сертификатов, включая все заархивированные, чтобы я мог легко перенести их на новый компьютер.
$store=new-object
System.Security.Cryptography.X509Certificates.X509Store("My","CurrentUser")
$store.open("ReadOnly,IncludeArchived")
$privateCerts = $store.Certificates | Where-Object { $_.hasPrivateKey }
Однако, когда я пытаюсь экспортировать их в файлы pfx, например,
$privateCerts| Foreach-Object { [system.IO.file]::WriteAllBytes("$($_.thumbprint)$($_.Subject).pfx", ($_.Export('PFX', 'password')) ) }
Он генерирует исключения для всех, которые не экспортируются. Теперь я знаю, что не могу их экспортировать, но я бы просто пропустил их, чтобы сценарий не выдал ошибку. Я могу обойти это, перехватив исключение, но есть ли способ определить, можно ли экспортировать сертификат.
Я нашел ссылку на x509keystorageflags, у которого есть «экспортируемый» бит, который я мог проверить, но не могу понять, как получить эту информацию для сертификата с помощью PowerShell.
В Exportable
бит установлен в самом контейнере закрытого ключа, а не непосредственно в сертификате:
$privateCerts = $store.Certificates | Where-Object {$_.HasPrivateKey}
$Exportables = $privateCerts | Where-Object {$_.PrivateKey.CspKeyContainerInfo.Exportable}
Я не думаю, что это сработает для других типов, кроме пар ключей на основе RSA.