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

Powershell для переноса сертификатов на новый компьютер - как определить, можно ли экспортировать сертификат

Я использую следующую оболочку 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.