1

Я создал сертификат PFX с помощью командной строки Visual Studio Developer следующим образом;

makecert -r -pe -n "CN=mycert" -sky exchange "mycert.cer" -sv "mycert.pvk"
pvk2pfx -pvk "mycert.pvk" -spc "mycert.cer" -pfx "mycert.pfx" -pi [password]

Затем я использую PowerShell для опроса сертификата

$cert = Get-PfxCertificate [Location]
$cert.Verify()
# Returns 'False'

Как я могу получить этот сертификат для шифрования?

Обновить

@root предложил использовать команду Import-PfxCertificate . Это то, что происходит, когда я запускаю его.

Import-PfxCertificate -FilePath [Path]
Import-PfxCertificate : The PFX file you are trying to import requires either a different password or membership in an Active Directory principal to which it is protected.
At line:1 char:1
+ Import-PfxCertificate -FilePath [...]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-PfxCertificate], Win32Exception
    + FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.CertificateServices.Commands.Im 
   portPfxCertificate

Дальнейшее обновление

@ McDonald's предложил безопасный способ передачи пароля команде Import-PfxCertificate . Это то, что я пытался;

Import-PfxCertificate -FilePath [Path] -Password (Get-Credential).Password
$cert = dir cert:\localmachine\my | where { $_.Thumbprint -eq [Thumbprint] } | Select-Object
$cert.Verify()

Все еще возвращает ложь. Есть еще подсказки?

2 ответа2

3

Метод Verify проверяет, является ли сертификат доверенным. Чтобы точно понять, почему проверка не проходит, нам нужно построить цепочку:

$cert = Get-PfxCertificate -FilePath .\mycert.pfx
$chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
$chain.ChainStatus

Когда я повторяю ваши шаги и запускаю эти команды, я получаю статус UntrustedRoot . Это означает, что проверка завершилась неудачно, потому что сертификат не подписан доверенным центром сертификации, что имеет смысл, учитывая, что мы сами его подписываем (-r на makecert).

Чтобы проверить сертификат, импортируйте его в хранилище доверенных корневых центров сертификации:

Import-PfxCertificate -CertStoreLocation Cert:\CurrentUser\Root -FilePath .\testcert.pfx -Password (Read-Host 'Password' -AsSecureString)

Введите пароль PFX, примите большой диалог с предупреждением, и сертификат будет добавлен. Тогда проверка пройдет. Если вы предпочитаете графический интерфейс, certmgr.msc сделает эту работу.


Вы можете просто использовать параметры RSA без доверенности сертификата на вашем компьютере. Допустим, число 137 является секретным сообщением для владельца закрытого ключа. Мы можем использовать открытый ключ для шифрования нашего сообщения:

$public = Get-PfxCertificate .\mycert.cer
$public.PublicKey.Key.Encrypt(@(137), $false)

Затем каким-то образом полученный зашифрованный большой массив байтов (назовем его $message) попадает к владельцу закрытого ключа, который восстанавливает исходное число:

$private = Get-PfxCertificate .\mycert.pfx
$private.PrivateKey.Decrypt($message)

Обычно что-то более интересное / продвинутое (см. MSDN) будет сделано с ключами. Дело в том, что приложения могут использовать сертификат, не доверяя ему на машине.

0

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

Шаг 1: Создайте сертификат

$publicCert = New-SelfSignedCertificate -DnsName $dnsName `
    -CertStoreLocation Cert:\LocalMachine\My

Сертификат не является доверенным

$publicCert.Verify()
False

Шаг 2: Экспорт сертификата PFX

$cred = Get-Credential
Export-PfxCertificate -Cert $publicCert -FilePath $certPath -Password $cred.Password

Шаг 3. Установите сертификат в хранилище корневых сертификатов.

Import-PfxCertificate -FilePath $certPath -CertStoreLocation Cert:\CurrentUser\Root `
    -Password $cred.Password

Шаг 4. Проверьте сертификат еще раз

$publicCert.Verify()
True

Затем вы можете следовать инструкциям @ BenN о том, как использовать сертификат для расшифровки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .