2017-10-16 3 views
1

privé Comment puis-je assurer que le code C# utilise un password pour utiliser le certificate's private key? Le certificat est installé dans le magasin CurrentUser/Personal. J'ai essayé mais mon code utilise toujours la clé privée sans demander de mot de passe.Exécution d'une signature numérique à l'aide rapide X509Certificate2 un mot de passe à utiliser la clé

enter image description here

byte[] fileData = File.ReadAllBytes(path); 
ContentInfo contentInfo = new ContentInfo(fileData); 

SignedCms signedCms = 
new SignedCms(SubjectIdentifierType.SubjectKeyIdentifier, contentInfo, true); 
CmsSigner signer = 
new CmsSigner(SubjectIdentifierType.SubjectKeyIdentifier, MyLoadedCert); 
signer.IncludeOption = X509IncludeOption.WholeChain; 
signedCms.ComputeSignature(signer); // Works fine without prompting password 

byte[] encoded = signedCms.Encode(); 
File.WriteAllBytes(signatureFilePath, encoded); 

Répondre

1

Quand je courais votre code avec une protection clé forte a permis que j'ai une exception Provider could not perform the action since the context was acquired as silent.. En effet, je n'ai pas spécifié le paramètre silent dans la méthode ComputeSignature et, par défaut, il est défini sur true (il semble).

Lorsque vous modifiez cette ligne de code

signedCms.ComputeSignature(signer); 

à

signedCms.ComputeSignature(signer, false); 

il demandera l'interaction de l'utilisateur en cas de besoin à savoir lorsque vous avez spécifié une forte protection clé dans Assistant Importation de certificat. La documentation peut être trouvée here. L'action par défaut/le niveau de protection de la clé privée forte est moyen, ce qui signifie que l'utilisateur devra approuver (cliquer sur OK) l'utilisation de la clé privée. Vous pouvez le changer en Haute protection et régler le mot de passe si vous le souhaitez (voir les écrans ci-dessous).

After strong private key protection checkbox is set

Choose level of protection

Selected High level of protection

+0

Il est de ne pas jeter une exception pour moi. Mais si je mets 'signedCms.ComputeSignature (signataire, false)' alors il demande un mot de passe dans une fenêtre externe. Pourquoi en mode silencieux cela ne fonctionne pas? Est-ce quelque chose requis dans mon certificat? –

+0

@GokulE C'est IMHO mode silencieux = aucune interaction de l'utilisateur autorisé. Je n'ai trouvé aucun moyen dans .NET pour vérifier si un certificat a une forte protection des clés, mais peut-être que je n'ai pas regardé assez fort :) – pepo