Ir para conteúdo
  • Cadastre-se

dev botao

Certificado Digital - Serializar


Rodrigo Coradi
Ver Solução Respondido por André Ferreira de Moraes,
  • Este tópico foi criado há 2458 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa noite,

Estou com a necessidade de usar a manifestação do destinatário, porém eu precisava poder usar em qualquer computador e não somente no que esta o certificado digital (A1).
Seria possível alguma forma de serializar ele no banco de dados ou alguma outra forma de realizar isso?
Alguém já fez algo parecido?

Obrigado e aguardo.

Link para o comentário
Compartilhar em outros sites

14 horas atrás, Rodrigo Coradi disse:

Boa noite,

Estou com a necessidade de usar a manifestação do destinatário, porém eu precisava poder usar em qualquer computador e não somente no que esta o certificado digital (A1).
Seria possível alguma forma de serializar ele no banco de dados ou alguma outra forma de realizar isso?
Alguém já fez algo parecido?

Obrigado e aguardo.

Se vc usa CAPICOM somente como já mencionado, atraves de uma aplicação central. Mas se vc usar a OpenSSL, basta vc gravar o arquivo pfx no seu banco, junto com a senha, e quando for utilizar em qualquer maquina pode re-cria-lo localmente, pois a instalação não é necessaria, apenas o caminho do pfx e a senha do mesmo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Com OpenSSL basta salvar o conteúdo do arquivo no banco de dados e informá-lo na propriedade DadosPFX.

ACBrNFe1.Configuracoes.Geral.SSLLib := libOpenSSL;
ACBrNFe1.Configuracoes.Certificados.DadosPFX := Certificado;
ACBrNFe1.Configuracoes.Certificados.Senha := Senha;

 

  • Curtir 1
djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

1 hora atrás, sossystem disse:

Se vc usa CAPICOM somente como já mencionado, atraves de uma aplicação central. Mas se vc usar a OpenSSL, basta vc gravar o arquivo pfx no seu banco, junto com a senha, e quando for utilizar em qualquer maquina pode re-cria-lo localmente, pois a instalação não é necessaria, apenas o caminho do pfx e a senha do mesmo.

 

2 minutos atrás, André Ferreira de Moraes disse:

Com OpenSSL basta salvar o conteúdo do arquivo no banco de dados e informá-lo na propriedade DadosPFX.


ACBrNFe1.Configuracoes.Geral.SSLLib := libOpenSSL;
ACBrNFe1.Configuracoes.Certificados.DadosPFX := Certificado;
ACBrNFe1.Configuracoes.Certificados.Senha := Senha;

 

Obrigado @André Ferreira de Moraes e @sossystem pelas informações, vai ajudar bastante.
Eu estava pensando nisso mesmo, só queria saber se daria certo por se tratar de certificado digital a questão de serializar o arquivo e salvar no banco de dados.

Vou testar então.
Agora só vou correr atrás para serializar o arquivo no banco de dados.

Só uma dúvida @André Ferreira de Moraes , depois de salvar o arquivo no banco de dados, para passar 

ACBrNFe1.Configuracoes.Certificados.DadosPFX := Certificado;

eu preciso gerar ele localmente na máquina correto ?


Muito obrigado.

Link para o comentário
Compartilhar em outros sites

47 minutos atrás, André Ferreira de Moraes disse:

Não.

Esse 

ACBrNFe1.Configuracoes.Certificados.DadosPFX

pelo que entendi é a chave privada do certificado (A1), correto ?
Eu passando uma vez o caminho do certificado, é possível me retornar esse DadosPFX sem estar criptografado ?
Porque pelo que fui depurando no Acbr eu encontrei o ponto em que ele gera esse registro descriptografado com EncodeBase64 , porém tem uma forma de me retornar isso para salvar no banco ?

Link para o comentário
Compartilhar em outros sites

  • Moderadores
  • Solution

Leia o arquivo e salve no seu banco.

var
  FS: TFileStream;
begin
  FS := TFileStream.Create(PFXFile, fmOpenRead);
  try
    FS.ReadAnsiString; //SALVE NO SEU BANCO;
  finally
    FS.Free;
  end;
end;

Para recuperar o arquivo, use:

ACBrNFe1.Configuracoes.Certificados.DadosPFX := Campo_Gravado_no_BD;

 

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

1 hora atrás, André Ferreira de Moraes disse:

Leia o arquivo e salve no seu banco.


var
  FS: TFileStream;
begin
  FS := TFileStream.Create(PFXFile, fmOpenRead);
  try
    FS.ReadAnsiString; //SALVE NO SEU BANCO;
  finally
    FS.Free;
  end;
end;

Para recuperar o arquivo, use:


ACBrNFe1.Configuracoes.Certificados.DadosPFX := Campo_Gravado_no_BD;

 

Obrigado @André Ferreira de Moraes vou testar dessa forma

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Arrobba Sistemas disse:

Utilizo o Delphi XE5 e não encontrei a seguente função:

FS.ReadAnsiString; //SALVE NO SEU BANCO;

Alguém sabe me dizer se foi alterado essa parte no XE5 quando se utiliza FileStream?

Da seguinte forma:

sDadosPFX := ReadStrFromStream(FS,FS.Size); //de USES no pacote synautil

 

Link para o comentário
Compartilhar em outros sites

5 horas atrás, André Ferreira de Moraes disse:

Leia o arquivo e salve no seu banco.


var
  FS: TFileStream;
begin
  FS := TFileStream.Create(PFXFile, fmOpenRead);
  try
    FS.ReadAnsiString; //SALVE NO SEU BANCO;
  finally
    FS.Free;
  end;
end;

Para recuperar o arquivo, use:


ACBrNFe1.Configuracoes.Certificados.DadosPFX := Campo_Gravado_no_BD;

 

@André Ferreira de Moraes consegui recuperar dessa forma o ReadAnsiString, porém ao salvar no banco de dados ele se perde nos caracteres especiais.
Não sei se é meu Banco ou o próprio delphi,ou tipo de Dado.
Estou utilizando o Mysql 5, o campo é um LongText (utf8).
Se eu copio e colo o resultado retornado na mão, o banco de dados aceita, porém quando dou o POST do delphi, ele se perde nos caracteres especias e não salva corretamente.
Da mesma forma no momento de recuperar, ele me retorna o valor errado (mesmo salvando na mão o valor correto no banco).

Link para o comentário
Compartilhar em outros sites

Tambem estou com esse problema.... no meu caso utilizo Firebird 2.0 + Delphi XE5, criei no banco um campo do tipo BLOB, mais como voce disse, ele salva pela "metade" e se salvar na mão dentro do banco, ao recuperar pelo delphi ele não vem o valor correto.

Para passar para o banco utilizo:
dtsCertificados.DataSet.FieldByName('DADOS_PFX').AsString := sDadosPFX( Variável do tipo AnsiString );

Para recuperar do banco:
NFe.Configuracoes.Certificados.DadosPFX := dmCad.cdsCertificadoDADOS_PFX.AsString;

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Arrobba Sistemas disse:

ele salva pela "metade" e se salvar na mão dentro do banco, ao recuperar pelo delphi ele não vem o valor correto.
 

Isso ta com cara de limitacao do componente que vc usa para conectar o delphi no banco de dados

Link para o comentário
Compartilhar em outros sites

Seguinte... a parte de pegar os dados do certificado estou conseguindo, salvo o "texto" que é retornado pela função ReadStrFromStream(FS,FS.Size) uma variável do tipo AnsiString, e funciona certinho enquanto a aplicação esta aberta, meu problema esta em armazenar essa informação da variável no banco de dados Firebird, fiz alguns testes com tipo de dados VARCHAR(10000) para armazenar essa informação que tem cerca de 6 mil caracteres, mais como VARCHAR não consegui, ao passar do Delphi para o Firebird não salva os 6 mil caracteres e sim somente a metade, se eu colocasse essa informação na "mão" dentro do banco ficava normal, mais ao puxar para o Delphi novamente acontecia o mesmo, retornava apenas metade dos dados, ai tentei utilizar campo BLOB, mais como nunca trabalhei com BLOB fiz alguns testes mais não obtive exito. Alguém ja armazenou os dados do pfx dentro do banco e poderia me dar uma ajuda de como conseguiu fazer?

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • Moderadores
12 minutos atrás, Arrobba Sistemas disse:

Seguinte... a parte de pegar os dados do certificado estou conseguindo, salvo o "texto" que é retornado pela função ReadStrFromStream(FS,FS.Size) uma variável do tipo AnsiString, e funciona certinho enquanto a aplicação esta aberta, meu problema esta em armazenar essa informação da variável no banco de dados Firebird, fiz alguns testes com tipo de dados VARCHAR(10000) para armazenar essa informação que tem cerca de 6 mil caracteres, mais como VARCHAR não consegui, ao passar do Delphi para o Firebird não salva os 6 mil caracteres e sim somente a metade, se eu colocasse essa informação na "mão" dentro do banco ficava normal, mais ao puxar para o Delphi novamente acontecia o mesmo, retornava apenas metade dos dados, ai tentei utilizar campo BLOB, mais como nunca trabalhei com BLOB fiz alguns testes mais não obtive exito. Alguém ja armazenou os dados do pfx dentro do banco e poderia me dar uma ajuda de como conseguiu fazer?

Está usando IBX?

Ainda estou lidando com os vários bugs dele com a corrupção de caracteres e arquivos texto, e estudando a migração para FireDac.

No IBX eu consigo salvar o certificado como arquivo no banco e recuperar da seguinte forma:

CREATE TABLE ARQUIVOS (
    ID         INTEGER,
    NOME       VARCHAR(40),
    HASH_MD5   CHAR(32),
    ARQUIVO    BLOB SUBTYPE 0 SEGMENT SIZE 80
);
ALTER TABLE ARQUIVOS ADD CONSTRAINT ARQUIVOS_PK PRIMARY KEY (ID);

Para salvar o arquivo no banco:

IBQuery1.ParamByName('ARQUIVO').LoadFromFile(Filename, ftBlob);

E recuperar:

TBlobField(IBQuery1.FieldByName('ARQUIVO')).SaveToFile(Filename);

 

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, BigWings disse:

Está usando IBX?

Ainda estou lidando com os vários bugs dele com a corrupção de caracteres e arquivos texto, e estudando a migração para FireDac.

No IBX eu consigo salvar o certificado como arquivo no banco e recuperar da seguinte forma:


CREATE TABLE ARQUIVOS (
    ID         INTEGER,
    NOME       VARCHAR(40),
    HASH_MD5   CHAR(32),
    ARQUIVO    BLOB SUBTYPE 0 SEGMENT SIZE 80
);
ALTER TABLE ARQUIVOS ADD CONSTRAINT ARQUIVOS_PK PRIMARY KEY (ID);

Para salvar o arquivo no banco:


IBQuery1.ParamByName('ARQUIVO').LoadFromFile(Filename, ftBlob);

E recuperar:


TBlobField(IBQuery1.FieldByName('ARQUIVO')).SaveToFile(Filename);

 

Fiz também dessa forma que você disse, porém estou utilizando o Mysql, e deu certo comigo.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, BigWings disse:

Está usando IBX?

Ainda estou lidando com os vários bugs dele com a corrupção de caracteres e arquivos texto, e estudando a migração para FireDac.

No IBX eu consigo salvar o certificado como arquivo no banco e recuperar da seguinte forma:


CREATE TABLE ARQUIVOS (
    ID         INTEGER,
    NOME       VARCHAR(40),
    HASH_MD5   CHAR(32),
    ARQUIVO    BLOB SUBTYPE 0 SEGMENT SIZE 80
);
ALTER TABLE ARQUIVOS ADD CONSTRAINT ARQUIVOS_PK PRIMARY KEY (ID);

Para salvar o arquivo no banco:


IBQuery1.ParamByName('ARQUIVO').LoadFromFile(Filename, ftBlob);

E recuperar:


TBlobField(IBQuery1.FieldByName('ARQUIVO')).SaveToFile(Filename);

 

Estou utilizando IBX, funcionou perfeitamente, muito obrigado pela ajuda.... vou ajustar minha aplicação agora agora !! Valew

Link para o comentário
Compartilhar em outros sites

Gostaria de saber se algum de voces ja utilizou OpenSSL passando para o componente  ACBr ArquivoPFX ou DadosPFX na rede?
Exemplo:
Tenho o servidor e mais um terminal, o certificado digital eu recreio em cada maquina como foi citado pelo BigWings anteriormente e utilizo OpenSSL, meu arquivos Schemas ficam localizados em uma pasta dentro do servidor somente, ai que entra meu problema ao usar no terminal com o componente setado para \\Servidor\d\Aplicacao\Schemas e tentar enviar uma nota ele me retorna: 

the schema itself is not valid

anteriormente eu achava que era problema com o certificado, pelo fato de deixar o arquivo  PFX somente no servidor, ai criei uma rotina para salvar o certificado e recriar localmente nos terminais e acontece o mesmo erro, alguém passou por isso? ou sabe me dizer se é limitado mesmo e não pode usar os Schemas na rede quando é por OpenSSL?

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2458 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.