Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

Postado

Estou fazendo o consumo de uma API Rest na qual precisa carregar um certificado.

Consumi ele no Postman e funcionou:

-> Entrei em File -> settings -> certificates -> coloquei o HOST e o arquivo *.p12

-> Fiz uma requisição POST, com <authorization> basic, passando usuário e senha..

-> Header só adicionei: Content-Type : application/json

-> Body:  {"grant_type""client_credentials"}

 

Eu tentei fazer exatamente isso com o REST Debugger.. 
Não deu certo.. authorization, content type, body td isso eu configurei..

Mas o certificado eu não sei aonde colocar no RESTClient/RESTRequest ou RESTResponse

 

Alguém já passou por isso? ou sabe alguma solução alternativa?

  • 2 semanas depois ...
  • Solution
Postado

Consegui, usando o INDY.. 

 

    HttpClient := TIdHTTP.Create( nil );
    HttpClient.ConnectTimeout := 20000;
    HttpClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    with TIdSSLIOHandlerSocketOpenSSL(HttpClient.IOHandler).SSLOptions do
    begin
      CertFile := [CaminhoCertificado.crt.pem];   //mudar caminho certificado aqui
      KeyFile  := [CaminhoCertificado.key.pem];   //mudar caminho certificado aqui
      Mode := sslmUnassigned;
      SSLVersions := [sslvTLSv1_2];   //mudar protocolos de SSL aqui
    end;
	
	with HttpClient do
    begin
      Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
      Request.ContentType := 'application/json';
      Request.CharSet     := 'utf-8';
      Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
      HandleRedirects := True;
      HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];
    end;
	
	Body:= '[conteudo body]';     //mudar body aqui
    JsonToSend := TMemoryStream.Create;
    WriteStringToStream(JsonToSend, Body, IndyTextEncoding_UTF8);
    JsonToSend.Position := 0;

    sResponse := HttpClient.Post([URL],JsonToSend);    //mudar URL aqui

 

  • Curtir 1
  • Obrigado 1
  • 9 meses depois ...
Postado

gkenji Boa tarde amigo, gostaria de saber qual as uses vc declarou no seu codigo e os tipo de variavel que vc usou nessa linha baixo.

Body:= '[conteudo body]';     //mudar body aqui
    JsonToSend := TMemoryStream.Create;
    WriteStringToStream(JsonToSend, Body, IndyTextEncoding_UTF8);
    JsonToSend.Position := 0;

    sResponse := HttpClient.Post([URL],JsonToSend);    //mudar URL aqui
  • 3 meses depois ...
Postado

Bom dia,

 

with TIdSSLIOHandlerSocketOpenSSL(HttpClient.IOHandler).SSLOptions do
    begin
      CertFile := [CaminhoCertificado.crt.pem];   //mudar caminho certificado aqui
      KeyFile  := [CaminhoCertificado.key.pem];   //mudar caminho certificado aqui
      Mode := sslmUnassigned;
      SSLVersions := [sslvTLSv1_2];   //mudar protocolos de SSL aqui
    end;

eu vejo nesse codigo que passas o caminho do certificado digital, mas esse arquivo é qual extensão ?, pfx?, pem?, e vejo que nao passas a senha do certificado, onde seria para colocar ?

 

Postado
Em 03/05/2021 at 15:18, gkenji disse:

Consegui, usando o INDY.. 

 

    HttpClient := TIdHTTP.Create( nil );
    HttpClient.ConnectTimeout := 20000;
    HttpClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    with TIdSSLIOHandlerSocketOpenSSL(HttpClient.IOHandler).SSLOptions do
    begin
      CertFile := [CaminhoCertificado.crt.pem];   //mudar caminho certificado aqui
      KeyFile  := [CaminhoCertificado.key.pem];   //mudar caminho certificado aqui
      Mode := sslmUnassigned;
      SSLVersions := [sslvTLSv1_2];   //mudar protocolos de SSL aqui
    end;
	
	with HttpClient do
    begin
      Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
      Request.ContentType := 'application/json';
      Request.CharSet     := 'utf-8';
      Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
      HandleRedirects := True;
      HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];
    end;
	
	Body:= '[conteudo body]';     //mudar body aqui
    JsonToSend := TMemoryStream.Create;
    WriteStringToStream(JsonToSend, Body, IndyTextEncoding_UTF8);
    JsonToSend.Position := 0;

    sResponse := HttpClient.Post([URL],JsonToSend);    //mudar URL aqui

 

Meses depois de ter iniciado minha migração desse serviço, do Delphi para o NodeJS, acho esse ouro aqui!

👏👏👏👏👏👏

Muito obrigado! Espero que todos tenham conseguido aí também.

  • 5 meses depois ...
Postado
Em 12/05/2022 at 07:55, gkenji disse:

Nem lembrava mais desse código.. 

Utilizei para fazer a comunicação com o PIX .. 

Caso tenham dúvidas só falar.. abraço!

To precisando disso pra fazer a comunicação com pix tbm, mas estou usando java :(

 

  • 4 semanas depois ...
Postado
Em 03/05/2021 at 15:18, gkenji disse:

Consegui, usando o INDY.. 

 

    HttpClient := TIdHTTP.Create( nil );
    HttpClient.ConnectTimeout := 20000;
    HttpClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    with TIdSSLIOHandlerSocketOpenSSL(HttpClient.IOHandler).SSLOptions do
    begin
      CertFile := [CaminhoCertificado.crt.pem];   //mudar caminho certificado aqui
      KeyFile  := [CaminhoCertificado.key.pem];   //mudar caminho certificado aqui
      Mode := sslmUnassigned;
      SSLVersions := [sslvTLSv1_2];   //mudar protocolos de SSL aqui
    end;
	
	with HttpClient do
    begin
      Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
      Request.ContentType := 'application/json';
      Request.CharSet     := 'utf-8';
      Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
      HandleRedirects := True;
      HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];
    end;
	
	Body:= '[conteudo body]';     //mudar body aqui
    JsonToSend := TMemoryStream.Create;
    WriteStringToStream(JsonToSend, Body, IndyTextEncoding_UTF8);
    JsonToSend.Position := 0;

    sResponse := HttpClient.Post([URL],JsonToSend);    //mudar URL aqui

 

Obrigado vou testar, fiz um teste aqui usando Indy mas retornou o seguinte erro :

 

Could not load certificate.
error:23076071 : PKCS12 routines : PKCS12_parse : mac verify failure

 

o KeyFile é um arquivo de Certificado também ou uma senha por extenso do tipo "senhacertificado123" ?

Atenciosamente, 

Moysés A. Silva

 

  • Moderadores
Postado
6 horas atrás, Moysés A. Silva disse:

Obrigado vou testar, fiz um teste aqui usando Indy mas retornou o seguinte erro :

 

Could not load certificate.
error:23076071 : PKCS12 routines : PKCS12_parse : mac verify failure

 

o KeyFile é um arquivo de Certificado também ou uma senha por extenso do tipo "senhacertificado123" ?

Atenciosamente, 

Moysés A. Silva

 

pera tu está usando o componennte ACBrPIXCD? ou está implementando algo seu?

 

  • Curtir 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
8 horas atrás, Juliomar Marchetti disse:

pera tu está usando o componennte ACBrPIXCD? ou está implementando algo seu?

 

Não estou usando o ACBrPIXCD, estou fazendo algo nosso para a Empresa onde trabalho, só falta o HandShake mesmo para ter o retorno do access_token do Sicoob para o restante das requisições.

Atenciosamente, 

Moysés A. Silva.

Postado (editado)
Em 03/05/2021 at 15:18, gkenji disse:

Consegui, usando o INDY.. 

 

    HttpClient := TIdHTTP.Create( nil );
    HttpClient.ConnectTimeout := 20000;
    HttpClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

    with TIdSSLIOHandlerSocketOpenSSL(HttpClient.IOHandler).SSLOptions do
    begin
      CertFile := [CaminhoCertificado.crt.pem];   //mudar caminho certificado aqui
      KeyFile  := [CaminhoCertificado.key.pem];   //mudar caminho certificado aqui
      Mode := sslmUnassigned;
      SSLVersions := [sslvTLSv1_2];   //mudar protocolos de SSL aqui
    end;
	
	with HttpClient do
    begin
      Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
      Request.ContentType := 'application/json';
      Request.CharSet     := 'utf-8';
      Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
      HandleRedirects := True;
      HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];
    end;
	
	Body:= '[conteudo body]';     //mudar body aqui
    JsonToSend := TMemoryStream.Create;
    WriteStringToStream(JsonToSend, Body, IndyTextEncoding_UTF8);
    JsonToSend.Position := 0;

    sResponse := HttpClient.Post([URL],JsonToSend);    //mudar URL aqui

 

Quais as declarações nas Variáveis e Uses ?

Atenciosamente, 

Moysés A. Silva.

Editado por Moysés A. Silva
Postado
21 minutos atrás, Moysés A. Silva disse:

Quais as declarações nas Variáveis e Uses ?

Atenciosamente, 

Moysés A. Silva.

Esse fonte é muito antigo Moysés, não vo lembrar tudo..
Mas passando o olho ai, é o componente do Indy TIdHTTP

Variaveis deve ser isso
HttpClient: TIdHTTP;
JsonToSend: TMemoryStream;

Para acertar os uses, é só colocar um componente do indy TIdHttp e um TIdSSLIOHandlerSocketOpenSSL

Postado
39 minutos atrás, gkenji disse:

Esse fonte é muito antigo Moysés, não vo lembrar tudo..
Mas passando o olho ai, é o componente do Indy TIdHTTP

Variaveis deve ser isso
HttpClient: TIdHTTP;
JsonToSend: TMemoryStream;

Para acertar os uses, é só colocar um componente do indy TIdHttp e um TIdSSLIOHandlerSocketOpenSSL

certo, ja tem os componentes do Indy TIdHttp e um TIdSSLIOHandlerSocketOpenSSL, mesmo assim não reconheceu ( WriteStringToStream, IndyTextEncoding_UTF8 e o sResponse)

 em anexo prints do com erro:

"Error connecting with SSL.

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed" e código do teste para o HandShake da Requisição token do Sicoob

 

Atenciosamente, 

Moysés A. Silva.

Erros Indy Sicoob.rar

Postado

Deu erro de SSL, essa mensagem de erro "certificate verify failed", me parece que não é o certificado correto..

Caso seja correto o certificado..

 

verifica esse ponto do código.. 

Mode := sslmUnassigned; <--- verifica esse ponto também.. 
SSLVersions := [sslvTLSv1_2];   <--- pesquisa, existe outros tipos de forma de SSL versões e etc..

  • 3 meses depois ...
Postado

Boa noite pessoal não sei se o tópico já foi resolvido, mas apanhei bastante para fazer uma requisição até achar o código que o amigo postou e funciona perfeitamente, para quem estiver com duvida de como funciona essa chamada do certificado via o arquivo .pem eu tive o mesmo problema, pois eu somente possuía o arquivo .pfx, mas felizmente encontrei uma forma de fazer, para os casos onde vocês possuírem apenas o arquivo .pfx é preciso fazer a conversão via OpenSSL com os seguintes comandos:

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out certificate.crt

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out private.key

comandos o parametro <filename.pfx> é o caminho do certificado, após essa conversão vai ser criados os arquivos .crt  e . key e podem ser chamados assim: 

    SSLIOHandler.SSLOptions.CertFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.crt';
    SSLIOHandler.SSLOptions.KeyFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.key';

segue o código completo:

var
  HTTPClient: TIdHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  HTTPClient := TIdHTTP.Create(nil);
  HTTPClient.Request.Clear;
  HTTPClient.Request.CharSet := 'utf-8';
  HTTPClient.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
  HTTPClient.Request.ContentType := 'application/json';
  HTTPClient.Request.CustomHeaders.Clear;
  HTTPClient.Request.CustomHeaders.FoldLines := false;
  HTTPClient.Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
  HTTPClient.HandleRedirects := True;
  HTTPClient.HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];

  SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    // Set up SSL IO Handler with certificate
    SSLIOHandler.SSLOptions.Mode := sslmClient;
    SSLIOHandler.SSLOptions.VerifyMode := [];
    SSLIOHandler.SSLOptions.VerifyDepth := 0;
    SSLIOHandler.SSLOptions.CertFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.crt';
    SSLIOHandler.SSLOptions.KeyFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.key';
    SSLIOHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];

    // Set up HTTP client with SSL IO Handler
    HTTPClient.IOHandler := SSLIOHandler;

    // Make API call
    Result := HTTPClient.Get(APIEndpoint); // APIEndpoint = sua url
  finally
    HTTPClient.Free;
    SSLIOHandler.Free;
  end;
end;

Obs: Faça download do OpenSSL (https://sourceforge.net/projects/openssl/) e execute o arquivo OpenSSL.exe e execute os comando acima.

fontes da conversão do certificado: https://support.kaspersky.com/KSC/12/pt-BR/201428.htm

  • Curtir 4
  • 6 meses depois ...
Postado

Olá pessoal, estive implementando a API Boleto e API PIX do itaú em delphi, aqui na empresa e agora está tudo funcionando, tenho algumas dúvidas sobre o certificado e queria saber se algum de vocês sabem me dizer....

1 - Pensando em segurança... Os arquivos "Certificado.crt" e "ChavePrivada.key" que são gerados, podem ficar junto com a aplicação ou não?

Pergunto isso porque o sistema que temos é utilizado por dezenas de usuários em cidades diferentes, que nesse caso, precisaria dos arquivos crt e key junto com o executável para que as requisições funcionem... Um usuário mal intencionado, poderia fazer mal uso desses dois arquivos?

2 - No tutorial do itaú, vi que eles sugerem a geração do arquivo .PFX + Senha, eu fiz a geração desse arquivo pras duas API. E daí vem minha dúvida principal: 

É possível fazer a autenticação no delphi com indy, usando APRENAS o arquivo "PFX + senha"? (E "descartar" o crt e key). Se sim, como declarar esses parâmetros?

Meu código atual que funciona é esse abaixo, que usa o arquivo Certificado.crt e o ChavePrivada.key. Queria usar apenas o .PFX + senha, se for possível...

    IOHandle.SSLOptions.CertFile     := CertFile_PIX;
    IOHandle.SSLOptions.KeyFile      := KeyFile_PIX;

Desde já obrigado pela ajuda contida aqui ^^

Postado
Em 25/09/2023 at 09:14, Juliomar Marchetti disse:

sim para cada um

e se tu usa o ACBrPIXCD ele já faz isso pra ti e tu pode carregar do banco e não precisa ser arquivo fixo

Não uso ACBrPIXCD, segundo a dica, agora estou fazendo o armazenamento do crt e key no banco de dados e crio eles em tempo de execução.

Ficou bem melhor do que distribuir os arquivos junto com o instalador (e vai facilitar possíveis atualizações de certificados/keys).

Obrigado pela solução.

  • 6 meses depois ...
Postado
Em 11/03/2023 at 18:43, RaphaelComba disse:

Boa noite pessoal não sei se o tópico já foi resolvido, mas apanhei bastante para fazer uma requisição até achar o código que o amigo postou e funciona perfeitamente, para quem estiver com duvida de como funciona essa chamada do certificado via o arquivo .pem eu tive o mesmo problema, pois eu somente possuía o arquivo .pfx, mas felizmente encontrei uma forma de fazer, para os casos onde vocês possuírem apenas o arquivo .pfx é preciso fazer a conversão via OpenSSL com os seguintes comandos:

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out certificate.crt

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out private.key

comandos o parametro <filename.pfx> é o caminho do certificado, após essa conversão vai ser criados os arquivos .crt  e . key e podem ser chamados assim: 

    SSLIOHandler.SSLOptions.CertFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.crt';
    SSLIOHandler.SSLOptions.KeyFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.key';

segue o código completo:

var
  HTTPClient: TIdHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  HTTPClient := TIdHTTP.Create(nil);
  HTTPClient.Request.Clear;
  HTTPClient.Request.CharSet := 'utf-8';
  HTTPClient.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
  HTTPClient.Request.ContentType := 'application/json';
  HTTPClient.Request.CustomHeaders.Clear;
  HTTPClient.Request.CustomHeaders.FoldLines := false;
  HTTPClient.Request.CustomHeaders.Values['Content-Type'] := 'application/json; application/x-www-form-urlencoded;';
  HTTPClient.HandleRedirects := True;
  HTTPClient.HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];

  SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    // Set up SSL IO Handler with certificate
    SSLIOHandler.SSLOptions.Mode := sslmClient;
    SSLIOHandler.SSLOptions.VerifyMode := [];
    SSLIOHandler.SSLOptions.VerifyDepth := 0;
    SSLIOHandler.SSLOptions.CertFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.crt';
    SSLIOHandler.SSLOptions.KeyFile := 'C:\Users\Maquina1\Desktop\Serasa\Cert.key';
    SSLIOHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];

    // Set up HTTP client with SSL IO Handler
    HTTPClient.IOHandler := SSLIOHandler;

    // Make API call
    Result := HTTPClient.Get(APIEndpoint); // APIEndpoint = sua url
  finally
    HTTPClient.Free;
    SSLIOHandler.Free;
  end;
end;

Obs: Faça download do OpenSSL (https://sourceforge.net/projects/openssl/) e execute o arquivo OpenSSL.exe e execute os comando acima.

fontes da conversão do certificado: https://support.kaspersky.com/KSC/12/pt-BR/201428.htm

Deu certo dessa forma colocando esses dois arquivo, alguém sabe se é possível converter o .pfx para esses dois arquivos diretamente no Delphi?

Postado
14 minutos atrás, User123135435 disse:

Deu certo dessa forma colocando esses dois arquivo, alguém sabe se é possível converter o .pfx para esses dois arquivos diretamente no Delphi?

Bom dia, cara eu não faço muita ideia de como fazer para executar comandos openssl via Delphi, talvez algum membro saiba, mas tem esse repositório no github (GitHub - lminuti/Delphi-OpenSSL: Delphi wrapper for OpenSSL), que faz uso do openssl via delphi da uma olhada nos fonte e verifica se lhe ajuda.

  • Curtir 1
  • Moderadores
Postado
18 minutos atrás, User123135435 disse:

Deu certo dessa forma colocando esses dois arquivo, alguém sabe se é possível converter o .pfx para esses dois arquivos diretamente no Delphi?

tem a unit do openssl que tu pode pegar e fazer que está no ACBr

dá pra fazer omesmo que a linha de comando

  • Curtir 1
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
Em 04/04/2024 at 11:11, Juliomar Marchetti disse:

tem a unit do openssl que tu pode pegar e fazer que está no ACBr

dá pra fazer omesmo que a linha de comando

Boa tarde, tudo bem? 

Poderia me mandar o print ou parte do código da rotina? Eu procurei no fonte mas não consegui encontrar a parte responsável por fazer essa extração do par de chaves do certificado

 

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.