-
Total de ítens
49 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Posts postados por mdbs99
-
-
35 minutos atrás, Daniel Simoes disse:
Acredito que não exista vantagem de desempenho usar a versão 32 bits, compilada com MinGW.
Ok!
35 minutos atrás, Allan Wolski disse:Marcos, para compilação em 32 bits não há necessidade de alteração alguma. Pode continuar utilizando da forma como vinha fazendo.
Para compilação em 64 bits o ACBr irá definir a diretiva USE_MINGW automaticamente.Ok, obrigado!
- 2
-
Agora fiquei confuso.
Pensando apenas em 32 bits, tem vantagem ou desvantagem usar uma ou outra versão?
E quando eu for migrar para 64 bits, o ACBr irá "ligar" a diretiva automaticamente quando for 64 ou preciso fazer isso manualmente caso opte por usar essa versão?
- 1
-
Ótima notícia!
5 horas atrás, Daniel Simoes disse:...porém compiladas com o MinGW... (usam a mesma nomenclatura das DLLs de 64 bits)... Vou subir essas DLLs para o nosso SVN
Quando você diz compiladas com MinGW, muda alguma coisa?
Após atualizar o fontes, obrigatoriamente tenho que atualizar as DLL de 32 bits?Obrigado.
- 1
-
Testado e aprovado!
Pessoal, muito obrigado!
-
Já atualizei e testei. Está funcionando muito bem, obrigado!
2 horas atrás, Daniel Simoes disse:Porém, no conteúdo de X509Certificate, notei que não existem todas as extensões como no PFX... Ou seja, não funciona ler o CPF pelas extensões do Certificado, se a origem do certificado é a informação da Tag "X509Certificate"
Essa parte não entendi, pois eu consigo ler as informações — CPNJ, por exemplo — carregando o Certificado utilizando o "X509Certificate".
-
Sim, você está correto. Vi que a informação de ambos os tipos ficam no "token" CN=...
-
Seguindo a ideia que peguei lá na lista FPC, tentei utilizar as funções da unit LConvEncoding... porém sem sucesso.
Outra ideia, também lá da lista, é utilizar esse projeto http://chsdet.sourceforge.net
Mas agora me ocorreu uma ideia: Os componentes do ACBr estão preparados para ler Certificados de CNPJ, tanto que os nomes dos métodos tem relação com PJ. Mas, se estou utilizando Certificado de PF, é possível que o ACBr — especificamente o TDFeOpenSSL — está lendo as informações em "posições" erradas? Eu ainda não sei, vou pesquisar, mas creio que o Certificado de PJ pode ser diferente do PF.O que acham?
-
Postei na lista do FreePascal sobre como saber a codificação de uma string.
Espero que alguém dê alguma ideia por lá...
- 1
-
Nada ainda por aqui...
Infelizmente não tive tanto tempo quanto gostaria pra trabalhar nisso ontem.
-
Amanhã, feriado, vou tentar trabalhar nessa conversão.
-
"Fico pensando se há algum "flag" em algum lugar informando o "padrão" ou o "encode" que foi utilizado. "
Ahá! Agora ficou "fácil" pro Daniel fazer a mágica dele...
-
31 minutos atrás, Daniel Simoes disse:
Acho mais simples descobrir uma maneira de converter UTF16 para UTF8
Pode ser.
Uma dúvida: Essa codificação não deveria ser padrão em todos os certificados?
Outra: Mesmo que consigamos converter, como iremos saber se devemos ou não converter? Fico pensando se há algum "flag" em algum lugar informando o "padrão" ou o "encode" que foi utilizado.
-
6 horas atrás, Daniel Simoes disse:
Achei algo que parece ser o nosso caso...
O Nome e CPF estão em UTF16
Realmente parece que todo o resto é lido corretamente mas especificamente o Nome/RazãoSocial parece estar codificado diferente.
Pode ser isso, codificado em UTF-16.
Vou ver se consigo fazer alguma coisa no FreePascal.
5 horas atrás, EMBarbosa disse:Será que não seria o caso de tentar descobrir como conseguir a mesma funcionalidade de passar esse parâmetro ao ler o certificado?
É uma boa ideia. Se já existir essa opção nas funções da DLL pode ser algo mais prático a se fazer (talvez pra vocês que já conhecem a estrutura).
-
É claro.
Mandei em Private (XML e certificado)
-
Daniel,
Tá quase!
Eu tentei dessa forma abaixo.
Onde o atributo "FX509Certificate" é o conteúdo do Node que vem no XML.function TSignatureCPFInfo.Value: string; var A: TDFeSSL; begin A := TDFeSSL.Create; try A.SSLLib := libOpenSSL; with TDFeOpenSSL(A.SSLClass) do begin LerX509Info(FX509Certificate); Result := CertSubjectName; end; finally A.Free; end; end;
O resultado, no entanto, vem assim:
C=BR, O=ICP-Brasil, OU=Secretaria da Receita Federal do Brasil - RFB, OU=RFB e-CPF A3, OU=Certificado de Teste, OU=Autenticado por Irreal Certificadora Digital Virtual, CN=\x00A\x00N\x00D\x00R\x00\xC9\x00 \x00D\x00O\x00 \x00E\x00S\x00P\x00\xCD\x00R\x00I\x00T\x00O\x00 \x00S\x00A\x00N\x00T\x00O\x00 \x00B\x00O\x00G\x00A\x00D\x00O\x00:\x000\x004\x007\x00.\x008\x008\x001\x00.\x009\x000\x007\x00-\x002\x009 -
Estou obtendo alguns erros:
Compile package ACBrDFeComum 0.0: Exit code 1, Errors: 2
ACBrDFeOpenSSL.pas(125,14) Error: There is no method in an ancestor class to be overridden: "GetCertIssuerName:AnsiString;"
ACBrDFeOpenSSL.pas(126,14) Error: There is no method in an ancestor class to be overridden: "GetCertCertificadora:AnsiString;"Então retirei os "overrides".
Compilando novamente... erro:
ACBrDFeOpenSSL.pas(988,21) Error: Identifier not found "GetCertificadoraFromSubjectName"
Acho que vc conseguiu compilar porque deve ter usando a versão já compilada memória, talvez... então basta dar um Build All pra ver esses erros aí também.
EDIT:
OK, acho que entendi. Preciso atualizar os fontes do SVN. -
OK, obrigado.
-
Olá Daniel,
Conseguiu algum tempo para esse meu problema?
-
Agradeço muitíssimo.
Aqui já tentei mas sempre obtenho erros (mal formatado, falta informação, etc). As msgs são em Inglês, é claro, mas é que não estou com meu ambiente de desenvolvimento no momento.
Obrigado.
-
Mas, Daniel, eu mesmo falei sobre esse site aqui...
De qq forma, vc consegue utilizar o exe do openssl e fazer as conversões na linha de comando? Porque aqui eu não consigo. Sempre dá erro.
O certificado que eu utilizo é um de teste (disponibilizado pelo meu cliente) sem senha. Não sei se isso impacta em alguma coisa, apenas mais uma informação.
-
Daniel,
Pensando melhor agora, eu não poderia usar a função PKCS12parse, visto que um dos parâmetros é a senha e... eu não as tenho.
Cada arquivo enviado ao servidor será assinado por um certificado diferente, de pessoas diferentes. Por isso preciso identificar o CPF pra saber quem assinou.
Bem, pelo que entendi no link que vc passou, um nó X509 estaria num formato P7B/PKCS#7:
P7B/PKCS#7
They contain “—–BEGIN PKCS—–” & “—–END PKCS7—–” statements. It can contain only Certificates & Chain certificates but not the Private key.
> They are Base64 encoded ASCII files
> They have extensions .p7b, .p7c
> Several platforms supports it. eg:- Windows OS, Java TomcatEntão tentei utilizar os códigos abaixo:
Convert P7B to PFX
——————————————————————————————————————————————————-
$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
$ openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CAcert.cerMas sem sucesso.
Também adicionei no arquivo (que contém os dados em base64) os statements “—–BEGIN PKCS—–” & “—–END PKCS7—–” mas também sem sucesso.
-
Daniel,
Analisei a "TDFeOpenSSL.VerificarAssinatura".
Basicamente ela carrega o certificado a partir do XML, utilizando várias funções... e depois chama xmlSecDSigCtxVerify() para verificar a assinatura.
A função que eu preciso, no entanto, está em ACBrDFeOpenSSL, linha 866:
function GetSubjectName( cert: pX509 ): String; var s: AnsiString; begin setlength(s, 4096); {$IFDEF USE_libeay32} Result := X509_NAME_oneline(X509_get_subject_name(cert), PAnsiChar(s), Length(s)); {$ELSE} Result := X509NameOneline(X509GetSubjectName(cert), s, Length(s)); {$ENDIF} if copy(Result,1,1) = '/' then Result := Copy(Result,2,Length(Result)); Result := StringReplace(Result, '/', ', ', [rfReplaceAll]); end;
Essa função irá trazer o SubjectName, que é a informação que preciso.
Mas veja que a função necessita de uma cert: pX509, declarada em OpenSSLExt... que é outra unit.
Até agora eu tenho uma parte de lê o XML encodado em BASE64, mas não tenho funções para ler as informações. E também tenho funções para ler a informação, mas tenho que ter antes uma instância de pX509.
Ainda não entendi como isso tudo funciona... estou tentando, mas ainda não consegui ver.
Se puder me ajudar, agradeço.
-
Ninguém? Nenhuma ideia?
-
Olá,
Não consigo fazer o load do certificado através do XML — node X509Certificate.
Dentro do método TDFeOpenSSL.LerPFXInfo, parece que só há uma função que obtém o ponteiro para um cert: pX509
Essa função é a : PKCS12parse(p12, FpDFeSSL.Senha, FPrivKey, cert, ca)
Procurei por outras funções e não achei nenhuma que pudesse me retornar uma "instância" de cert.
Eu tentei utilizar esse código:
var A: TDFeSSL; begin A := TDFeSSL.Create; try A.SSLLib := libOpenSSL; with TXMLComponent.Create(TFile.New('entrada.xml').Stream) do try A.DadosPFX := DecodeBase64 ( Document.DocumentElement .FindNode('Assinatura') .FindNode('Signature') .FindNode('KeyInfo') .FindNode('X509Data') .FindNode('X509Certificate').TextContent ); ShowMessage(A.CertSubjectName); finally Free; end; finally A.Free; end; end;
Através de um XML pré-gerado, já assinado, chamado "entrada.xml", tento decodificar a Base64 passando o resultado para a propriedade DadosPFX. Infelizmente obtenho um erro de leitura do certificado "provavelmente a senha está errada" (esse certificado nem tem senha) na chama a A.CertSubjectName.
Estou usando a Revision 12221.
Eu estive fazendo uma pesquisa e constatei que a informação que eu quero está, sim, dentro do nó X509Certificate. A prova disso é esse site: https://www.sslshopper.com/certificate-decoder.html
Apenas copiando e colando o conteúdo do nó, em Base64 mesmo, ele decodifica exibe todas as informações como nome, CPF, etc.
Restando apenas esse item para que eu conclua meu projeto, peço a ajuda dos senhores novamente.
Método VerificarAssinatura com CAPICOM
em Object Pascal - Delphi & Lazarus
Postado
Sugiro fazer uma limpeza de todas as .dcu/.ppu e fazer um build completo. Melhor ainda é baixar os fontes do trunk2 desde zero, ou seja, limpo.