Может ли sn.exe использовать хранилище сертификатов Windows?

Можно ли указать открытый ключ, для которого закрытый ключ содержится только в хранилище ключей Windows CryptoAPI, для подписи сборки с помощью sn.exe в.NET?

Я вижу возможность указать имя CSP и имя контейнера.

Существуют ли значения для доступа к сертификатам Windows? (то есть те, которые доступны из Windows EFS, Outlook, Internet Explorer и т. д.)

Спасибо.

Комментарий: В частности, я спрашиваю об этом, потому что есть несколько ключей, у которых закрытый ключ не помечен как экспортируемый, поэтому я не могу экспортировать.pfx и следовать этому маршруту.

1 ответ

У меня был тот же вопрос в конце этой недели.

ДА, его можно настроить на использование хранилища сертификатов 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перед попыткой сборки или вы получитесообщение об ошибке набора ключей при сборке (вместе с именем вашего контейнера ключей).

Другие вопросы по тегам