Может ли sn.exe использовать хранилище сертификатов Windows? - PullRequest
4 голосов
/ 15 июня 2009

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

Я вижу опцию для указания имени CSP и имени контейнера.

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

Спасибо.

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

1 Ответ

0 голосов
/ 18 сентября 2017

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

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

...