x509 - The key set is not set

0

I use the x509certificate class from C # to read an A3 certificate for XML signature, it happens that it was necessary to renew the certificate and at first nothing changed, it continued same type, but when trying to sign now is giving the error "The set of keys is not defined "at the very moment that I try to read his private key using the" X509Cert.PrivateKey ", code follows.

I did a search but did not find anything related to this, I also tried to verify if it was not permission to access but the key is normal.

////Seleciona o armazenamento de certificado usado pelo usuário atual.
            X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
            X509Certificate2Collection collection1 = (X509Certificate2Collection)collection.Find(X509FindType.FindBySubjectDistinguishedName, _xnome, false);
            if (collection1.Count == 0)
            {
                resultado = 1;
            }
            else
            {
                //Certificado ok
                X509Cert = collection1[0];
                string x;

                //Retorna informações do algoritmo para esse certificado X.509v3 como uma cadeia de caracteres. (Herdado de X509Certificate.)
                x = X509Cert.GetKeyAlgorithm().ToString();

                //Cria um novo documento xml
                XmlDocument doc = new XmlDocument();

                //Formata o documento para ignorar espaços
                doc.PreserveWhitespace = false;

                try
                {
                    //Carregar o arquivo XML pelo nome                    
                    doc.LoadXml(_conteudoXml);                        
                    List<XmlNode> nodes = new List<XmlNode>();
                    foreach (XmlNode node in doc.SelectNodes("//*['Signature']"))
                    {
                        nodes.Add(node);
                    }
                    foreach (XmlNode node in nodes)
                    {
                        if (Convert.ToString(node.Name) == "Signature")
                        {
                            node.ParentNode.RemoveChild(node);                             
                        }

                    }

                    //Verifica se a tag a ser assinada existe é única
                    int qtdeRefUri = doc.GetElementsByTagName(_RefUri).Count;

                    if (qtdeRefUri == 0)
                    {
                        //A URI indicada não existe
                        resultado = 2;
                    }
                    //Exsiste mais de uma tag a ser assinada
                    else
                    {
                        try
                        {
                            for (int i = 0; i < qtdeRefUri; i++)
                            {
                                //Cria o objeto SignedXml.
                                SignedXml signedXml = new SignedXml(doc);

                                //Define o objeto de AsymmetricAlgorithm que representa a chave particular associada com um certificado.
                                signedXml.SigningKey = X509Cert.PrivateKey;

                                //Cria a referência a ser assinada
                                Reference reference = new Reference();

                                //Pega o uri que deve ser assinada
                                XmlAttributeCollection _Uri = doc.GetElementsByTagName(_RefUri).Item(i).Attributes;

                                foreach (XmlAttribute _atributo in _Uri)
                                {
                                    //Verifica se a URI informada possui o Id
                                    if (_atributo.Name == "Id")
                                    {
                                        reference.Uri = "#" + _atributo.InnerText;
                                    }
                                }

                                //Adiciona o envelopamento para referência
                                XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                                reference.AddTransform(env);

                                //Adiciona a Canonatização para referência
                                XmlDsigC14NTransform c14 = new XmlDsigC14NTransform();
                                reference.AddTransform(c14);

                                //Adiciona referência para o SignedXml objeto.
                                signedXml.AddReference(reference);

                                //Cria novo objeto KeyInfo
                                KeyInfo keyInfo = new KeyInfo();

                                //Carrega o certificado e insere KeyInfoX509Data                                    
                                keyInfo.AddClause(new KeyInfoX509Data(X509Cert));

                                //Adiciona Keyinfo para o SignedXml.
                                signedXml.KeyInfo = keyInfo;

                                //Adiciona a assinatura no XML com autenticação por ser chave privada
                                signedXml.ComputeSignature();

                                //Referencia xml, coloca assinatura e salva                                    
                                XmlElement xmlDigitalSignature = signedXml.GetXml();

                                //Assina no final da Uri informada.
                                XmlElement xmlElement = doc.GetElementsByTagName(_RefUri)[i] as XmlElement;
                                xmlElement.ParentNode.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

                                XMLDoc = new XmlDocument();
                                XMLDoc.PreserveWhitespace = false;
                                XMLDoc = doc;
                            }
                        }
                        catch (CryptographicException ex)
                        {
                            resultado = 3;
                        }
                    }

Thanks for the help right away.

    
asked by anonymous 23.03.2017 / 19:11

0 answers