Certificats:Ne trouve pas le certificat et la clé privée de déchiffrement d'Erreur lors de la signer

StackOverflow https://stackoverflow.com/questions/3936065

Question

Je travaille dans une société avec de nombreux serveurs et d'Ordinateurs pour les développeurs.Les serveurs sont win2003, PC, les développeurs de Windows XP.

Dans un serveur Win2003 nommé preiis01, dans l'environnement de préproduction, d'autres personnes dans l'entreprise d'installer un certificat client à l'aide de tout autre utilisateur (domainCompany\adminsystems) pour se connecter au serveur preiis01.

Quelqu'un administrateur utilise l'utilisateur "domainCompany\adminsystems" vous connecter au serveur preiis01 (à l'aide de Terminal Serveur de Bureau à Distance pour Windows XP).

l'utilisateur admin est domainCompany\adminsystems", qui installe le certificat.

Admin utilisateur de l'installer comme ceci:

Ouverture d'une Session comme "domainCompany\adminsystems" Certificat de fichier PFX.Faire Installer le fichier PFX et l'aide de l'Assistant.La clé privée ne pas vérifier pour l'exportation.Entrez le mot de passe et à installer.

Il est une application Web dont l'Identité du pool d'applications est:Compte SERVICE RÉSEAU.

serveur web IIS 6.0.

dans preiis01,

Qu'admin utilisateur exécute la console mmc -> composant logiciel Enfichable dans -> Certificats de l'ordinateur Local.Dans node -> Partage -> Certificats, il avait vu le certificat du client:

Émis À ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1

Publié Par FNMT Clase 2 CA

Dans les propriétés du certificat, l'empreinte:"93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13"

Qu'admin utilisateur exécute cette commande:

winhttpcertcfg.exe LOCAL_MACHINE\Mon -s "ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1" -g -un "SERVICE RÉSEAU"

Le résultat est:

Certificat correspondant:

CN=ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1

OU=703015476

OU=FNMT Clase 2 CA

O=FNMT

C=ES

L'octroi de la clé privée d'accès pour compte:NT AUTHORITY ETWORK SERVICE

Maintenant, admin utilisateur exécute cette commande:

winhttpcertcfg.exe -l-c LOCAL_MACHINE\Mon -s "ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1"

Le résultat est:

Certificat correspondant:

CN=ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1

OU=700012476

OU=FNMT Clase 2 CA

O=FNMT

C=ES

D'autres comptes et des groupes avec l'accès à la clé privée comprennent:domainCompany T adminsystems AUTHORITY\SYSTEM BUILTIN\Administrateurs NT AUTHORITY ETWORK SERVICE

Maintenant, dans une page aspx dans l'application web dans un serveur Win2003, IIS 6.0, j'ai ce code:

NOte:de la valeur pour X509Certificate2.HasPrivateKeyAccess() est NON (false) pour "ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1" certificat.

ASP.NET l'application s'exécute en utilisant l'identité ::NT AUTHORITY ETWORK SERVICE

lbInfo.Text += "<br/><br/>ASP.NET application executes using the identity :: <b>" + WindowsIdentity.GetCurrent().Name + "</b><br>";


            var store = new X509Store(StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            Certificates = store.Certificates;
            repeater1.DataSource = Certificates;
            repeater1.DataBind();

            var nombreCertificado = "ENTIDAD COMPANY INSURE SA - CIF A93 - NOMBRE SURNAME1 NAME1";

            store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);

            X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySubjectName, nombreCertificado, false);

            if (col.Count > 0)
            {
                X509Certificate2 certificate = col[0];
                store.Close();
                Message.Text = "Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;

                FirmarConCertificado(nombreCertificado, certificate);

            }
            else
            {
                store.Close();
                Message.Text = "El certificado " + nombreCertificado + " no esta instalado en la máquina";
            }


public void FirmarConCertificado(string nombreCertificado, X509Certificate2 certificate)
{
    try
    {
 var mensaje = "Datos de prueba";
                System.Text.Encoding enc = System.Text.Encoding.Default;
                byte[] data = enc.GetBytes(mensaje);

                var contentInfo = new System.Security.Cryptography.Pkcs.ContentInfo(data);
                var signedCms = new System.Security.Cryptography.Pkcs.SignedCms(contentInfo, true);

                var cmsSigner = new System.Security.Cryptography.Pkcs.CmsSigner(certificate);

                //  Sign the CMS/PKCS #7 message
                signedCms.ComputeSignature(cmsSigner);

                //  Encode the CMS/PKCS #7 message
               var ret = Convert.ToBase64String(signedCms.Encode());

 Message.Text += "Firmado con Certificado " + nombreCertificado + " encontrado en " + StoreLocation.LocalMachine;
 }
 catch (Exception ex)
 {
 Message.Text = "Error al firmar con certificado: " + ex.ToString();
 Message.Text += "<br /><br />InnerException: " + ex.InnerException;
 }

}

Le code ne fonctionne pas pour moi, et j'obtiens cette erreur:Ne trouve pas le certificat et la clé privée de déchiffrement.

Ligne d'erreur est:signedCms.ComputeSignature(cmsSigner);

Erreur al firmar con certificado:Système.De sécurité.La cryptographie.CryptographicException:Ne trouve pas le certificat et la clé privée de déchiffrement.

au Système.De sécurité.La cryptographie.Pkcs.PkcsUtils.CreateSignerEncodeInfo(CmsSigner signataire, Boolean silencieux) à Système.De sécurité.La cryptographie.Pkcs.SignedCms.Signe(CmsSigner signataire, Boolean silencieux) à Système.De sécurité.La cryptographie.Pkcs.SignedCms.ComputeSignature(CmsSigner signataire, Boolean silencieux) à Système.De sécurité.La cryptographie.Pkcs.SignedCms.ComputeSignature(CmsSigner signataire) à ASP.dgsfp_test_testcert_aspx.FirmarConCertificado(String nombreCertificado, X509Certificate2 certificat) dans c:\de l'Entreprise\App est estCert.aspx:ligne 242

Ensuite, l'utilisateur admin (je me souviens, qui installer le certificat) exécute cette commande:

FindPrivateKey Mon LocalMachine -t "93 bc a4 ad 58 c9 3c af 8b eb 0b 2f 86 c7 9d 81 70 a6 c4 13" –c

FindPrivateKey Mon LocalMachine -n "ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1" –un

FindPrivateKey Mon LocalMachine -n "CN=ENTIDAD de la SOCIÉTÉ d'ASSURER SA - CIF A93 - NOMBRE NOM1 NOM1" –un

Le résultat pour l'ensemble des 3 commandes est le même:

FindPrivateKey aide l'utilisateur à trouver l' emplacement du fichier de Clé Privée d'un X. 50 9 Certificat.

Utilisation:FindPrivateKey [{ {-n } | {-t } } [-f | -d | -a]]

nom de l'objet, de la certificat

empreinte de la certificat (utilisation certmgr.exe pour obtenir c')

-f nom du fichier de sortie seulement

-d répertoire de sortie seulement

-une sortie de fichier absolu nom par exempleFindPrivateKey Mon CurrentUser -n "CN=John Doe"

par exempleFindPrivateKey Mon LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5 c 4c 9d 42 1d 6b 52" -c

FindPrivateKey ne pas obtenir quoi que ce soit, mais winhttpcertcfg.exe -l fonctionne très bien (certificat correspondant)

Nous avons donné des privilèges de l'utilisateur de Service Réseau à l'aide de la winhttpcertcfg.exe outil, et dans le code ASP.NET (il s'exécute sous le compte Service Réseau) le certificat est trouvé.Mais échoue lors de la signer à l'aide du certificat.

Si quelqu'un pouvait nous donner quelques informations sur le, ou des suggestions

mise à jour:

Utilisateur dans le domaine "domainCompany\Pre_Certificado" installer le Certificat dans le Magasin de l'ordinateur Local.

domainCompany\Pre_Certificado est Administrateur, dans le groupe IIS_WPG, a les Politiques Locales:“Ouvrir une session en tant que Service“

- Je configurer l'Identité du pool d'applications IIS 6.0 pour :domainCompany\Pre_Certificado

ASP.NET l'application s'exécute en utilisant l'identité ::domainCompany\Pre_Certificado

Je recycle pool d'applications et exécuter l'application, j'obtiens Système.De sécurité.La cryptographie.CryptographicException:Ne trouve pas le certificat et la clé privée de déchiffrement

Si j'ai de nouveau le test, ouvrez une session en session au serveur IIS, à l'aide de domainCompany\Pre_Certificado utilisateur, j'appelle la page en ASP.NET application et tout est OK.

(remarque:journal du serveur IIS à l'aide de Terminal Server)

Mais si le journal de session au serveur IIS (utilisateur:domainCompany\Pre_Certificado), j'obtiens le même message d'erreur:

Système.De sécurité.La cryptographie.CryptographicException:Ne trouve pas le certificat et la clé privée de déchiffrement

Des suggestions ??

Était-ce utile?

La solution

Veuillez vérifier cette document qui pourraient vous aider à résoudre le problème.Je vous recommande d'utiliser la commande suivante option:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER 

Autres conseils

Faire les 2 premières étapes que le même comme vous le feriez avec IIS 7.5 (cliquez ici)

  1. Créer et / ou l'Achat de certificats.Assurez-vous qu'il a une clé privée.
  2. Importer le certificat dans le "Ordinateur Local" compte.Mieux utiliser les Certificats de MMC. Assurez-vous de cocher la case "Autoriser l'exportation de la clé privée"
  3. Exécutez la commande ci-dessous en tant qu'administrateur.Remplacez le code suivant:

    • Remplacer [Sujet] avec l'objet du certificat et de l'utilisation des guillemets s'il contient des espaces.Je pense que vous pouvez aussi tout simplement mettre le premier mot tant qu'il n'y a pas d'autre cert qui commence avec le même sujet.
    • Remplacer [Store] avec le magasin de certificats que vous avez importées de, par défaut je crois, c'est "ROOT" ou "MON" sur IIS 6, c'est à dire"LOCAL_MACHINE OOT" ou "LOCAL_MACHINE\MES"
    • Remplacer [ordinateur] avec le nom de l'ordinateur.Vous pourriez être en mesure d'utiliser ".\" la notation de [computernam] c'est à dire". ÉSEAU de SERVICE", mais je ne l'ai pas essayé.

winhttpcertcfg.exe -g -a "[ordinateur]\SERVICE RÉSEAU" -c LOCAL_MACHINE\[Store] -s "[Sujet]"

Note: Si vous exécutez ASP.NET Application de la Piscine sous une identité autre que "NETWORK SERVICE", vous aurez besoin de la changer "SERVICE RÉSEAU" dans la commande ci-dessus à l'identité que vous utilisez le pool d'applications IIS.

Peut-être besoin d'accorder l'accès à l'utilisateur anonyme aussi.Si vous autorisez l'accès anonyme alors que la demande est en cours d'exécution en tant qu'utilisateur anonyme pas de service de réseau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top