ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Assinar NFS-e da Pref. Sao Paulo

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> NFe
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
giordanirocha
Novato
Novato


Registrado: Sexta-Feira, 25 de Novembro de 2005
Mensagens: 27

MensagemEnviada: Ter Mai 25, 2010 10:32 am    Assunto: Assinar NFS-e da Pref. Sao Paulo Responder com Citação

Bom dia pessoal.
Alguem ja conseguiu assinar a NFS-e para a pref. de Sao Paulo ?

Valeu.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
giordanirocha
Novato
Novato


Registrado: Sexta-Feira, 25 de Novembro de 2005
Mensagens: 27

MensagemEnviada: Seg Mai 31, 2010 4:56 pm    Assunto: Re: Assinar NFS-e da Pref. Sao Paulo Responder com Citação

giordanirocha escreveu:
Bom dia pessoal.
Alguem ja conseguiu assinar a NFS-e para a pref. de Sao Paulo ?

Valeu.

Pessoal, consegui assinar utilizando o codigo abaixo retirado de livro, sites, etc.

Código:

function TNFSeSignature.AssinarRpsAdicional(sAssinatura: AnsiString;
  sSerial: string; out sAssinaturaHash: AnsiString): Boolean;
var
  CertStore : IStore3;
  Certs       : ICertificates;
  Cert        : ICertificate2;
  Assinante : Isigner2;
  SignedData : IsignedData;
  Util : IUtilities;
  V              : OleVariant;
  i : byte;
begin
  try
    result := true;
    CertStore         := CoStore.Create;
    CertStore.Open( CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_READ_ONLY );
    V                 := sSerial;
    Certs             := CertStore.Certificates ;
    Assinante         := CoSigner.Create;

    i := 0;
    while i < Certs.Count do
    begin
       Cert := IInterface( Certs.Item[ i+1 ] ) as ICertificate2;
       if UpperCase(Cert.SerialNumber) = UpperCase(V) then
       begin
          Assinante.Certificate := IInterface( Certs.Item[ i+1 ] ) as  ICertificate;
          i := Certs.Count;
       end;
       i := i + 1;
    end;

    Assinante.Options := CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;
    SignedData := CoSignedData.Create;
    SignedData.Content := sAssinatura;

    sAssinatura := SignedData.Sign(Assinante, false, CAPICOM_ENCODE_BASE64);
    util := CoUtilities.Create;
    sAssinaturaHash :=util.BinaryStringToByteArray(sAssinatura);
  except on e:exception do
    raise exception.create('Erro ao assinar!');
  end;
end;


O detalhe é que a assinatura esta ficando grande em relação aos exemplos disponibilizados por SP. Uma assinatura para cancelamento, que considera 20 caracteres, para ter o hash e a assinatura fica com mais de 2800 caracteres.
Se alguém tiver alguma sugestão....

Giordani
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
giordanirocha
Novato
Novato


Registrado: Sexta-Feira, 25 de Novembro de 2005
Mensagens: 27

MensagemEnviada: Sex Jun 11, 2010 11:00 am    Assunto: Re: Assinar NFS-e da Pref. Sao Paulo Responder com Citação

Como a solução anterior não funcionou, criei esta outra em C#:
Pessoal, consegui assinar o RPS. Comecei a fazer os testes e depois vou reportar.
A assinatura ficou em C# (em dll), pois não consegui fazer em delphi 2007.
Vou transcrever o código abaixo:
Citação:

public string SignRPS(X509Certificate2 cert, String sAssinatura)
{

//recebe o certificado e a string a ser assinada
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

//pega a chave privada do certificado digital
rsa = cert. PrivateKey as RSACryptoServiceProvider;

//cria o array de bytes e realiza a conversao da string em array de bytes
byte[] sAssinaturaByte = enc.GetBytes(sAssinatura);

RSAPKCS1SignatureFormatter rsaf = new RSAPKCS1SignatureFormatter(rsa);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();

//cria a variavel hash que armazena o resultado do sha1
byte[] hash;
hash = sha1.ComputeHash(sAssinaturaByte);

//definimos o metodo a ser utilizado na criptografia e assinamos
rsaf.SetHashAlgorithm("SHA1");
sAssinaturaByte = rsaf.CreateSignature(hash);

//por fim fazemos a conversao do array de bytes para string
string convertido;
convertido = Convert.ToBase64String(sAssinaturaByte);

return convertido;
}


Esta solução foi baseado em intensa pesquisa. E o pontapé inicial veio do manual da prefeitura de RECIFE.

bye.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
carlosasjr
Novato
Novato


Registrado: Segunda-Feira, 2 de Março de 2009
Mensagens: 39

MensagemEnviada: Ter Set 27, 2011 5:42 pm    Assunto: Re: Assinar NFS-e da Pref. Sao Paulo Responder com Citação

Amigo, você me enviaria essa dll?

carlosasjr2003@hotmail.com


giordanirocha escreveu:
Como a solução anterior não funcionou, criei esta outra em C#:
Pessoal, consegui assinar o RPS. Comecei a fazer os testes e depois vou reportar.
A assinatura ficou em C# (em dll), pois não consegui fazer em delphi 2007.
Vou transcrever o código abaixo:
Citação:

public string SignRPS(X509Certificate2 cert, String sAssinatura)
{

//recebe o certificado e a string a ser assinada
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

//pega a chave privada do certificado digital
rsa = cert. PrivateKey as RSACryptoServiceProvider;

//cria o array de bytes e realiza a conversao da string em array de bytes
byte[] sAssinaturaByte = enc.GetBytes(sAssinatura);

RSAPKCS1SignatureFormatter rsaf = new RSAPKCS1SignatureFormatter(rsa);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();

//cria a variavel hash que armazena o resultado do sha1
byte[] hash;
hash = sha1.ComputeHash(sAssinaturaByte);

//definimos o metodo a ser utilizado na criptografia e assinamos
rsaf.SetHashAlgorithm("SHA1");
sAssinaturaByte = rsaf.CreateSignature(hash);

//por fim fazemos a conversao do array de bytes para string
string convertido;
convertido = Convert.ToBase64String(sAssinaturaByte);

return convertido;
}


Esta solução foi baseado em intensa pesquisa. E o pontapé inicial veio do manual da prefeitura de RECIFE.

bye.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> NFe Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB