Ir para conteúdo
  • Cadastre-se

Alexandre Jansen

Membros
  • Total de ítens

    3
  • Registro em

  • Última visita

Tudo que Alexandre Jansen postou

  1. opa, blz? Realmente não sei o q pode ser, não uso o ACBr, acredito q o pessoal do suporte deles possa te ajudar. Abs!
  2. Obrigado! Mas consegui resolver, eu estava fazendo a assinatura sem o certificado, como é feito pelo ISSDigital, mas pra São Paulo é necessário que assine com o certificado que assinou tbm o xml. Segue código que fiz em c# para fazer isso: using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; public static class AssinaturaRPS { /// <summary> /// Gera a assinatura digital Base64 de uma string de dados, buscando o certificado pelo número de série. /// O processo segue o padrão: Hash SHA1 dos dados, assinado com a chave privada RSA (RSA-SHA1). /// </summary> /// <param name="dadosParaAssinar">A string ASCII que contém as informações do RPS.</param> /// <param name="numeroSerieCertificado">O número de série do certificado digital (em formato hexadecimal).</param> /// <returns>A assinatura digital em formato Base64.</returns> public static string GerarAssinaturaRPS(string dadosParaAssinar, string numeroSerieCertificado) { X509Certificate2 certificado = null; X509Store store = null; try { // 1. Abrir o repositório de certificados (StoreName.My é o repositório pessoal) // O StoreLocation.CurrentUser é o local mais comum para certificados de usuário. store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); // 2. Buscar o certificado pelo número de série // O número de série deve ser passado em formato hexadecimal (ex: "1234567890ABCDEF"). X509Certificate2Collection certificadosEncontrados = store.Certificates.Find( X509FindType.FindBySerialNumber, numeroSerieCertificado, validOnly: false // Inclui certificados expirados ou não válidos, ajuste conforme sua necessidade ); if (certificadosEncontrados.Count == 0) { throw new Exception($"Certificado com número de série '{numeroSerieCertificado}' não encontrado no repositório."); } // Pega o primeiro certificado encontrado (deve ser único pelo número de série) certificado = certificadosEncontrados[0]; // 3. Obter a chave privada RSA do certificado RSA chavePrivada = certificado.GetRSAPrivateKey(); if (chavePrivada == null) { throw new InvalidOperationException("O certificado não contém uma chave privada RSA utilizável para assinatura."); } // 4. Converter a cadeia de caracteres ASCII para bytes byte[] dadosEmBytes = Encoding.ASCII.GetBytes(dadosParaAssinar); // 5. Assinar o Hash (SHA1) utilizando RSA-SHA1 byte[] assinaturaEmBytes = chavePrivada.SignData( dadosEmBytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1 ); // 6. Retornar a assinatura em formato Base64 return Convert.ToBase64String(assinaturaEmBytes); } catch (Exception ex) { throw new Exception($"Ocorreu um erro no processo de assinatura: {ex.Message}"); } finally { // Fechar o repositório de certificados if (store != null) { store.Close(); } } } } // --- Exemplo de Uso --- public class ExemploUso { public static void Main() { // A string que tem que assinar string rpsString = "000043090030RPSNF00010101410220251126FNS00000000067991100000000000000006491202470008000144"; // Substitua pelo número de série do seu certificado (geralmente em formato hexadecimal) string seuNumeroDeSerie = "SEUNUMERODESERIEAQUI"; try { string assinaturaBase64 = AssinaturaRPS.GerarAssinaturaRPS(rpsString, seuNumeroDeSerie); Console.WriteLine("--- Resultado da Assinatura Digital ---"); Console.WriteLine($"String Assinada: {rpsString}"); Console.WriteLine($"Assinatura (Base64): {assinaturaBase64}"); } catch (Exception ex) { Console.WriteLine($"Ocorreu um erro: {ex.Message}"); } } }
  3. Olá a todos! Estou fazendo o teste assincrono de TesteEnvioLoteRpsAsync versao 2 do https://nfews.prefeitura.sp.gov.br/lotenfeasync.asmx?WSDL de São Paulo. Consegui enviar sem erro logo de cara, porém ao ConsultaSituacaoLoteSync, retorna o erro 1206 Assinatura Digital do RPS incorreta - String verificada Alguem já conseguiu fazer isso? Conferindo o layout, está correto o conteúdo.
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.