Ir para conteúdo
  • Cadastre-se

mdbs99

Membros
  • Total de ítens

    49
  • Registro em

  • Última visita

Posts postados por mdbs99

  1.  

    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!

    • Curtir 2
  2. 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".

  3. 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?

  4. 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.

  5. 6 horas atrás, Daniel Simoes disse:

    Achei algo que parece ser o nosso caso...

    O Nome e CPF estão em UTF16

    http://security.stackexchange.com/questions/31760/what-are-those-nul-bytes-doing-in-certificate-subject-cn

    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).

  6. 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

     

  7. 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.

  8. 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 Tomcat

    Entã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.cer

    Mas 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.

  9. 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.

  10. 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.

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

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...