 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
giordanirocha Novato

Registrado: Sexta-Feira, 25 de Novembro de 2005 Mensagens: 27
|
Enviada: Ter Mai 25, 2010 10:32 am Assunto: Assinar NFS-e da Pref. Sao Paulo |
|
|
Bom dia pessoal.
Alguem ja conseguiu assinar a NFS-e para a pref. de Sao Paulo ?
Valeu. |
|
Voltar ao Topo |
|
 |
giordanirocha Novato

Registrado: Sexta-Feira, 25 de Novembro de 2005 Mensagens: 27
|
Enviada: Seg Mai 31, 2010 4:56 pm Assunto: Re: Assinar NFS-e da Pref. Sao Paulo |
|
|
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 |
|
 |
giordanirocha Novato

Registrado: Sexta-Feira, 25 de Novembro de 2005 Mensagens: 27
|
Enviada: Sex Jun 11, 2010 11:00 am Assunto: Re: Assinar NFS-e da Pref. Sao Paulo |
|
|
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 |
|
 |
carlosasjr Novato

Registrado: Segunda-Feira, 2 de Março de 2009 Mensagens: 39
|
Enviada: Ter Set 27, 2011 5:42 pm Assunto: Re: Assinar NFS-e da Pref. Sao Paulo |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|