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