У меня был тот же вопрос в конце этой недели.
ДА , его можно настроить на использование хранилища сертификатов Windows, и если вы действительно заботитесь о безопасности, вам следует абсолютно сделать это. Это очень затрудняет случайную утечку секретного ключа (и если вы используете смарт-карту, например, Yubikey, утечка секретного ключа становится невозможной - ОС никогда ее не видит).
Я задокументировал, как это сделать в двух разных , но связанных, манерах в постах на моем блоге.
Если вы просто используете сертификат в своем личном хранилище сертификатов, но не используете смарт-карту, это относительно просто.
В PowerShell вам необходимо получить данные вашего сертификата:
Set-Location "cert:\Path\To\Your\Certificate"
# Usually "cert:\CurrentUser\My" is what you want
$cert=Get-Item ".\(your-certificate-thumbprint)"
Вам необходимо определить Имя контейнера ключей и CSP, который используется для доступа к этому контейнеру ключей (если это не смарт-карта, CSP по умолчанию работает)
$cert=Get-Item .\(ThumbprintOfYourKey)
$cert.PrivateKey.CspKeyContainerInfo | fl *
Это даст нечто похожее на следующее:
MachineKeyStore : False
ProviderName : Microsoft Base Smart Card Crypto Provider
ProviderType : 1
KeyContainerName : c0f031c2-0b5e-171b-d552-fab7345fc10a
UniqueKeyContainerName : c0f031c2-0b5e-171b-d552-fab7345fc10a
KeyNumber : Signature
Exportable : False
HardwareDevice : True
Removable : True
Accessible : True
Protected : True
CryptoKeySecurity : System.Security.AccessControl.CryptoKeySecurity
RandomlyGenerated : False
В моем случае я использую Yubikey, поэтому CSP является «Microsoft Base Smart Card Card Crypto Provider». Это означает, что для строгой подписи моего кода мне нужно выполнить:
sn.exe -c "Microsoft Base Smart Card Crypto Provider"
В какой-то момент перед сборкой (только один раз не нужно запускать каждую сборку, однако я привел ссылки на некоторые сценарии, чтобы помочь с этим во втором посте на эту тему).
Здесь есть два варианта: вы указываете sn.exe создать ключ, который содержит только открытый ключ, и знак задержки с этим ключом (установите флажок в нижней части вкладки «Подписывание» в свойствах проекта), затем посткомпилируйте, подпишите с помощью sn.exe -Rc "your-container-name" "key.snk"
или вы можете использовать простой способ: AssemblyKeyNameAttribute
в файле AssemblyInfo.cs
следующим образом:
[assembly: AssemblyKeyNameAttribute("Your Key Container Name")]
Компилятор будет обрабатывать все остальное за вас. Просто имейте в виду, что вам нужно убедиться, что ваш CSP настроен с использованием sn.exe -c
до того, как вы попытаетесь построить, или вы получите Keyset not found ошибка при сборке (наряду с название вашего контейнера ключей).