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.