Перераспределить сертификаты x509 в разные магазины - PullRequest
1 голос
/ 02 июля 2019

У меня есть файл p7b, который содержит 4 сертификата.Но они мне нужны в нескольких магазинах.Поэтому я сначала импортирую сертификаты в Cert:\LocalMachine\My хранилище, а затем мне нужно переместить некоторые из них в другое место.Пока у меня есть этот код:

Import-Certificate -FilePath "C:\SCOM\cert\cert_{dns name}.p7b" -CertStoreLocation Cert:\LocalMachine\My
$certIntermediate = Get-Item -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -Contains "ABB Intermediate CA"}
$certRootCA = Get-Item -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -Contains "ABB Root CA"}
$certIssuing = Get-Item -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -Contains "ABB Issuing CA"}
$store = Get-Item -Path Cert:\LocalMachine\My
$store.Open("ReadWrite")
$store.Remove($certIntermediate)
$store.Remove($certRootCA)
$store.Remove($certIssuing)
$store.Close()
$storeIntermediate = Get-Item -Path Cert:\LocalMachine\CA
$storeIntermediate.Open("ReadWrite")
$storeIntermediate.add($certIntermediate)
$storeIntermediate.close()
$storeAuthRoot = Get-Item -Path Cert:\LocalMachine\AuthRoot
$storeAuthRoot.Open("ReadWrite")
$storeAuthRoot.add($certRootCA)
$storeAuthRoot.add($certIssuing)
$storeAuthRoot.close()

Игнорировать часть {имя DNS} в первом ряду, это просто общая замена.Проблема в строках 2-4.Если указать путь к сертификату напрямую (например, Cert:\LocalMachine\My\8B4027E6B32E4E45C1DDB6A211), остальная часть сценария будет работать.

Очевидно, что я не знаю отпечатки пальцев перед импортом сертификатов, поэтому не могу его использовать.И Where-Object, похоже, не работает.Я попытался Get-ChildItem вместо Get-Item, я попытался Where вместо Where-Object, я попытался -ccontains (случайно) и -like вместо -contains, но сертификаты не "загружаются" впеременные.Когда я пытаюсь удалить их позже в коде, я получаю сообщение об ошибке значение не может быть нулевым .Как выбрать правильные сертификаты для их перемещения?

1 Ответ

0 голосов
/ 02 июля 2019

Я заметил три вещи, которые необходимо уточнить для вашего сценария.

  1. Прежде всего, проблема в том, что командлет Get-Item дает вам хранилище, а не сертификат (ы):
PS> Get-Item -Path Cert:\LocalMachine\My

Name : My

То, что вы хотели использовать, это Get-ChildItem:

PS> Get-ChildItem -Path Cert:\LocalMachine\My


   PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
34BF9D3F534C2501977557CC9A48C9F5AAAAAAAA  CN=localhost

Кстати, это объясняет, почему это работает, когда вы предоставляете отпечаток.Это связано с тем, что вы указываете путь к сертификату Get-Item вместо пути к магазину.

PS> $cert = Get-Item -Path Cert:\CurrentUser\My\34BF9D3F534C2501977557CC9A48C9F5AAAAAAAA
PS> $cert


   PSParentPath: Microsoft.PowerShell.Security\Certificate::CurrentUser\My

Thumbprint                                Subject
----------                                -------
34BF9D3F534C2501977557CC9A48C9F5AAAAAAAA  CN=localhost
Другая вещь - это использование -contains.Пожалуйста, смотрите этот ответ для более подробного объяснения.Как правило, он не предназначен для сравнения подстрок.Вместо этого используйте что-нибудь другое (например, -like):
Get-ChildItem -Path Cert:\CurrentUser\My\  | Where-Object {$_.Subject -like "*google*"}
? и Where являются псевдонимами Where-Object, вы можете проверить это здесь:
PS>  get-alias | ? resolvedcommandname -eq "Where-Object"

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ? -> Where-Object
Alias           where -> Where-Object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...