Tengo un problema al generar el sello para la contabilidad electrónica ya que me marca al validarlo en la pagina del sat como Sello mal Formado, en lo que he revisado el sello se genera igual a una factura electrónica, genero la cadena y luego la encripto con SHA1, los xslt los descargue de la pagina del sat hasta lo que se son los de la ultima versión.
La vdd ya he cambiado en algunas cosas lo de generar el sello y no me ha resultado espero puedan ayudarme, saludos.
public void GenerarSello(string rutaxml, string rutaxslt, string ArchivoCertificado, string ArchivoKey, string pass, out string mensaje)
{
mensaje = "";
try
{
string cadenaoriginal, sellodigital, nocertificado, certHex, Dato, Digestion, certificado = "";
//Generar Cadena Original
cadenaoriginal = GenerarCadenaOriginal(rutaxml, rutaxslt);
//Generar Certificado
X509Certificate2 cert = new X509Certificate2(ArchivoCertificado, pass);
byte[] certbyte = LeerArchivo(ArchivoCertificado); // leer certificado
certificado = Convert.ToBase64String(cert.GetRawCertData()); // genera certificado
certHex = cert.GetSerialNumberString(); // genera no. de certificado
string result = "";
while (certHex.Length > 0)
{
Dato = System.Convert.ToChar(System.Convert.ToUInt32(cert Hex.Substring(0, 2), 16)).ToString();
result = result + Dato;
certHex = certHex.Substring(2, certHex.Length - 2);
}
nocertificado = result;
//SHA1
SHA1 oSHA1 = SHA1CryptoServiceProvider.Create();
Byte[] textOriginal = Encoding.UTF8.GetBytes(cadenaoriginal);
Byte[] hash = oSHA1.ComputeHash(textOriginal);
StringBuilder oSB = new StringBuilder();
foreach (byte i in hash)
oSB.AppendFormat("{0:x2}", i);
Digestion = oSB.ToString();
//leer KEY
SecureString lSecStr = new SecureString();
lSecStr.Clear();
foreach (char c in pass.ToCharArray())
lSecStr.AppendChar(c);
Byte[] pLlavePrivadaBytes = System.IO.File.ReadAllBytes(ArchivoKey);
//Seguridad para Leer Certificado
RSACryptoServiceProvider rsa = opensslkey.DecodeEncryptedPrivateKeyInfo(pLlavePri vadaBytes, lSecStr);
SHA1CryptoServiceProvider hasher = new SHA1CryptoServiceProvider();
byte[] bytesFirmados = rsa.SignData(System.Text.Encoding.UTF8.GetBytes(Di gestion), hasher);
sellodigital = Convert.ToBase64String(bytesFirmados); // generar sello
}
catch (Exception e)
{
mensaje = e.Message.ToString();
}
}
public string GenerarCadenaOriginal(string rutaxml, string rutaxslt)
{
try
{
//XML
UTF8Encoding utf8WithoutBom = new UTF8Encoding(false);
StreamReader LeerXML = new StreamReader(rutaxml);
XPathDocument XMLgenerado = new XPathDocument(LeerXML);
//XSLT
XslCompiledTransform transformacionXslt = new XslCompiledTransform();
StreamReader LeerXSLT = new StreamReader(rutaxslt);
XPathDocument xslt = new XPathDocument(LeerXSLT);
transformacionXslt.Load(rutaxslt);
StringWriter str = new StringWriter();
XmlTextWriter myWriter = new XmlTextWriter(str);
//Transformacion
transformacionXslt.Transform(XMLgenerado, null, myWriter);
//Resultado
string cadenaOriginal = str.ToString();
string pathCadenaOriginal = @"C:\SAT\cadena\cadena.txt";
File.WriteAllText(pathCadenaOriginal, cadenaOriginal, utf8WithoutBom);
return cadenaOriginal;
}
catch (Exception e)
{
throw new Exception("Error -->" + e.Message);
}
}
internal static byte[] LeerArchivo(string path)
{
FileStream archivo = new FileStream(path, FileMode.Open, FileAccess.Read);
int tamanio = (int)archivo.Length;
byte[] dato = new byte[tamanio];
tamanio = archivo.Read(dato, 0, tamanio);
archivo.Close();
return dato;
}