2009-06-15 5 views
3

Pour signer un assembly avec sn.exe dans .NET, est-il possible de spécifier une clé publique pour laquelle la clé privée est contenue uniquement dans le keystore Windows CryptoAPI?Sn.exe peut-il utiliser le magasin de certificats Windows?

Je vois l'option permettant de spécifier le nom CSP et le nom du conteneur.

Y a-t-il des valeurs à utiliser pour accéder aux certificats Windows? (c'est-à-dire ceux accessibles à partir de Windows EFS, Outlook, Internet Explorer, etc.)

Merci.

Commentaire: Spécifiquement, je pose cette question parce qu'il y a quelques clés qui n'ont pas la clé privée marquée comme exportable, donc je ne peux pas exporter un .pfx et suivre cette route.

+0

J'ai trouvé l'article MSDN sur les magasins d'ordinateurs, mais il s'agit de la gestion des droits ActiveDirectory. Je ne trouve pas non plus le répertoire DRM dont il est question. Cependant, il y avait un répertoire Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys, et plusieurs fichiers nommés avec juste un numéro de série ou un GUID. (256bit-hex) _ (32bit) - (16bit) - (16bit) - (16 bits) - (48bit) est le format du nom de fichier. Sont-ils utilisables/adressables pour identifier la clé publique de sn.exe? – maxwellb

Répondre

-1

J'ai eu la même question à la fin de cette semaine.

OUI, il peut être configuré pour utiliser le magasin de certificats Windows et si vous être vraiment conscient sécurité, vous devez absolument faire. Il est très difficile de fuir accidentellement la clé privée (et si vous utilisez une carte à puce comme un Yubikey, cela rend impossible la fuite de la clé privée - le système d'exploitation ne la voit jamais).

J'ai documenté comment faire cela dans twodifferent, mais liés, manières dans les messages sur mon blog.

Si vous utilisez simplement un certificat dans votre magasin de certificats personnel, mais que vous n'utilisez pas de carte à puce, c'est relativement facile.

Dans PowerShell, vous devez obtenir les détails de votre certificat:

Set-Location "cert:\Path\To\Your\Certificate" 
# Usually "cert:\CurrentUser\My" is what you want 
$cert=Get-Item ".\(your-certificate-thumbprint)" 

Vous devez déterminer le nom du conteneur clé et CSP qui est utilisé pour accéder à ce conteneur de clé (si ce n'est pas une carte à puce, la par défaut fonctionne CSP)

$cert=Get-Item .\(ThumbprintOfYourKey) 
$cert.PrivateKey.CspKeyContainerInfo | fl * 

Cela produira quelque chose de semblable à ce qui suit:

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 

Dans mon cas, j'utilise un Yubikey, donc le CSP est "Microsoft Base Crypto Provider Card". Cela signifie pour nom fort signer mon code, je dois courir:

sn.exe -c "Microsoft Base Smart Card Crypto Provider" 

À un certain moment avant de construire (une seule fois, il n'a pas besoin d'être exécuté à chaque génération, mais je l'ai lié à certains scripts aider avec cela dans le deuxième post sur ce sujet).

Deux options s'offrent à vous: vous indiquez à sn.exe de créer une clé contenant uniquement la clé publique et le signe de retard avec cette touche (cochez la case en bas de l'onglet "Signature" dans les propriétés du projet) , puis post-construction, inscrivez-vous à l'aide sn.exe -Rc "your-container-name" "key.snk" ou vous pouvez utiliser la voie facile: AssemblyKeyNameAttribute dans le fichier AssemblyInfo.cs comme suit:

[assembly: AssemblyKeyNameAttribute("Your Key Container Name")] 

le compilateur traitera tout le reste pour vous.Gardez à l'esprit que vous devez vous assurer que votre CSP est définie en utilisant sn.exe -cavant vous essayez de construire ou vous obtiendrez une erreur Keyset pas trouvé lors de la construction (avec le nom de votre conteneur de clé).

Questions connexes