DU-E autenticar servidor com certificado digital e enviar xml

Delphi

17/07/2018

Vamos direto ao ponto.
Vamos precisar dos seguintes componentes: TIdHTTP (Indy Clients) e TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers), TMemo(mmResponse) e TButton (Standard)

O certificado digital deve estar convertido para .pem ( https://www.sslshopper.com/ssl-converter.html )

-> Configurando TIdHTTP
AllowCookies := True
HandleRedirects := True
HTTPOptions
hoKeepOrigProtocol :=True
IOHandler := IdSSLIOHandlerSocketOpenSSL1
ProxyParams
BasicAuthentication :=True
ProxyPassword <senha>
ProxyPort <porta>
ProxyServer <servidor>
ProxyUsername <usuário>
Request
Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
AcceptChasSet := 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'
AcceptLanguage :='pt-BR'
CharSet :='UTF-8'
ContentType := 'application/json'
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);'

-> Configurando idSSLIOHandlerSocketOpenSSL1
SSLOptions
CertFile := 'cert.pem'
KeyFile := 'cert.pem'
Method := 'sslvTLSv1'
Mode := 'sslmClient'
RootCertFile := 'cert.pem'


-> Simplifiquei o código para focar na programação dos objetos envolvidos no processo de autenticação no servidor e envio do arquivo xml.

Variáveis globais
Token, XCSRF, URL : string;

Function Autenticar(): boolean;
var
Response : string;
Request: TStringList;
begin
Result:=True;
URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de validação }
// URL := 'https://portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de produção }

Request := TStringList.Create;

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Role-Type', 'IMPEXP');

IdHTTP1.Response.Clear;
IdHTTP1.Response.ContentType := 'application/json';
IdHTTP1.Response.CharSet := 'UTF-8';
IdHTTP1.Response.KeepAlive := True;

Try
try
Response := IdHTTP1.Post(URL, Request);
// mmResponse.Lines.Add(IdHTTP1.Response.RawHeaders.CommaText); { ver os valores do response num memo }
Token := IdHTTP1.Response.RawHeaders.Values['Set-Token']; {recebendo o valor de header Set-Token}
XCSRF := IdHTTP1.Response.RawHeaders.Values['X-CSRF-Token']; {recebendo o valor de header X-CSRF-Token}
except
on E: EIdHTTPProtocolException do
begin
result:=false;
mmResponse.Lines.Add(E.ErrorMessage);
end;
end;
Finally
Request.Free;
End;
end;

Procedure EnviarXML;
var
Response: String;
Arquivo : TMemoryStream;
Begin
Arquivo := TMemoryStream.Create;
Arquivo.LoadFromFile(Trim(<caminho do arquivo .xml>));

URL := 'https://val.portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de validação }
//URL := 'https://portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de produção }

IdHTTP1.Request.ContentType := 'Application/xml';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Authorization', Token); { valor pego na autenticação }
IdHTTP1.Request.CustomHeaders.AddValue('X-CSRF-Token', XCSRF); { valor pego na autenticação }

Try
try
mmResponse.Lines.Clear;
Response:=IdHTTP1.Post(URL, Arquivo); { enviando arquivo }
mmResponse.Lines.Add(Response);
except
on E:EIdHTTPProtocolException do
begin
mmResponse.Lines.Clear;
mmResponse.Lines.Add(e.ErrorMessage);
end;
end;
Finally
Arquivo.Free();
End;
End;

Evento Botão Enviar
if Autenticar then
EnviarXML;



Se alguém conseguiu com os componentes REST do delphi posta ai.
Marcio Almeida

Marcio Almeida

Curtidas 1

Melhor post

Osvaldo Anjo

Osvaldo Anjo

15/08/2018

Parabéns Castro
Estou procurando também sobre rest.
Se eu conseguir eu posto

Abraços
GOSTEI 2

Mais Respostas

Adriano Barbosa

Adriano Barbosa

17/07/2018

Eu também preciso disso, vou tentar fazer com REST se conseguir posto aqui.
GOSTEI 1
Rodrigo Pereira

Rodrigo Pereira

17/07/2018

Vamos direto ao ponto.
Vamos precisar dos seguintes componentes: TIdHTTP (Indy Clients) e TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers), TMemo(mmResponse) e TButton (Standard)

O certificado digital deve estar convertido para .pem ( https://www.sslshopper.com/ssl-converter.html )

-> Configurando TIdHTTP
AllowCookies := True
HandleRedirects := True
HTTPOptions
hoKeepOrigProtocol :=True
IOHandler := IdSSLIOHandlerSocketOpenSSL1
ProxyParams
BasicAuthentication :=True
ProxyPassword <senha>
ProxyPort <porta>
ProxyServer <servidor>
ProxyUsername <usuário>
Request
Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
AcceptChasSet := 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'
AcceptLanguage :='pt-BR'
CharSet :='UTF-8'
ContentType := 'application/json'
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);'

-> Configurando idSSLIOHandlerSocketOpenSSL1
SSLOptions
CertFile := 'cert.pem'
KeyFile := 'cert.pem'
Method := 'sslvTLSv1'
Mode := 'sslmClient'
RootCertFile := 'cert.pem'


-> Simplifiquei o código para focar na programação dos objetos envolvidos no processo de autenticação no servidor e envio do arquivo xml.

Variáveis globais
Token, XCSRF, URL : string;

Function Autenticar(): boolean;
var
Response : string;
Request: TStringList;
begin
Result:=True;
URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de validação }
// URL := 'https://portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de produção }

Request := TStringList.Create;

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Role-Type', 'IMPEXP');

IdHTTP1.Response.Clear;
IdHTTP1.Response.ContentType := 'application/json';
IdHTTP1.Response.CharSet := 'UTF-8';
IdHTTP1.Response.KeepAlive := True;

Try
try
Response := IdHTTP1.Post(URL, Request);
// mmResponse.Lines.Add(IdHTTP1.Response.RawHeaders.CommaText); { ver os valores do response num memo }
Token := IdHTTP1.Response.RawHeaders.Values['Set-Token']; {recebendo o valor de header Set-Token}
XCSRF := IdHTTP1.Response.RawHeaders.Values['X-CSRF-Token']; {recebendo o valor de header X-CSRF-Token}
except
on E: EIdHTTPProtocolException do
begin
result:=false;
mmResponse.Lines.Add(E.ErrorMessage);
end;
end;
Finally
Request.Free;
End;
end;

Procedure EnviarXML;
var
Response: String;
Arquivo : TMemoryStream;
Begin
Arquivo := TMemoryStream.Create;
Arquivo.LoadFromFile(Trim(<caminho do arquivo .xml>));

URL := 'https://val.portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de validação }
//URL := 'https://portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de produção }

IdHTTP1.Request.ContentType := 'Application/xml';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Authorization', Token); { valor pego na autenticação }
IdHTTP1.Request.CustomHeaders.AddValue('X-CSRF-Token', XCSRF); { valor pego na autenticação }

Try
try
mmResponse.Lines.Clear;
Response:=IdHTTP1.Post(URL, Arquivo); { enviando arquivo }
mmResponse.Lines.Add(Response);
except
on E:EIdHTTPProtocolException do
begin
mmResponse.Lines.Clear;
mmResponse.Lines.Add(e.ErrorMessage);
end;
end;
Finally
Arquivo.Free();
End;
End;

Evento Botão Enviar
if Autenticar then
EnviarXML;



Se alguém conseguiu com os componentes REST do delphi posta ai.
GOSTEI 0
Rodrigo Pereira

Rodrigo Pereira

17/07/2018

bom dia, vc tem esse projetinho ai, com exemplo do xml q deve ser enviado?
GOSTEI 0
Washington Silva

Washington Silva

17/07/2018

Vamos direto ao ponto.
Vamos precisar dos seguintes componentes: TIdHTTP (Indy Clients) e TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers), TMemo(mmResponse) e TButton (Standard)

O certificado digital deve estar convertido para .pem ( https://www.sslshopper.com/ssl-converter.html )

-> Configurando TIdHTTP
AllowCookies := True
HandleRedirects := True
HTTPOptions
hoKeepOrigProtocol :=True
IOHandler := IdSSLIOHandlerSocketOpenSSL1
ProxyParams
BasicAuthentication :=True
ProxyPassword <senha>
ProxyPort <porta>
ProxyServer <servidor>
ProxyUsername <usuário>
Request
Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
AcceptChasSet := 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'
AcceptLanguage :='pt-BR'
CharSet :='UTF-8'
ContentType := 'application/json'
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);'

-> Configurando idSSLIOHandlerSocketOpenSSL1
SSLOptions
CertFile := 'cert.pem'
KeyFile := 'cert.pem'
Method := 'sslvTLSv1'
Mode := 'sslmClient'
RootCertFile := 'cert.pem'


-> Simplifiquei o código para focar na programação dos objetos envolvidos no processo de autenticação no servidor e envio do arquivo xml.

Variáveis globais
Token, XCSRF, URL : string;

Function Autenticar(): boolean;
var
Response : string;
Request: TStringList;
begin
Result:=True;
URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de validação }
// URL := 'https://portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de produção }

Request := TStringList.Create;

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Role-Type', 'IMPEXP');

IdHTTP1.Response.Clear;
IdHTTP1.Response.ContentType := 'application/json';
IdHTTP1.Response.CharSet := 'UTF-8';
IdHTTP1.Response.KeepAlive := True;

Try
try
Response := IdHTTP1.Post(URL, Request);
// mmResponse.Lines.Add(IdHTTP1.Response.RawHeaders.CommaText); { ver os valores do response num memo }
Token := IdHTTP1.Response.RawHeaders.Values['Set-Token']; {recebendo o valor de header Set-Token}
XCSRF := IdHTTP1.Response.RawHeaders.Values['X-CSRF-Token']; {recebendo o valor de header X-CSRF-Token}
except
on E: EIdHTTPProtocolException do
begin
result:=false;
mmResponse.Lines.Add(E.ErrorMessage);
end;
end;
Finally
Request.Free;
End;
end;

Procedure EnviarXML;
var
Response: String;
Arquivo : TMemoryStream;
Begin
Arquivo := TMemoryStream.Create;
Arquivo.LoadFromFile(Trim(<caminho do arquivo .xml>));

URL := 'https://val.portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de validação }
//URL := 'https://portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de produção }

IdHTTP1.Request.ContentType := 'Application/xml';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Authorization', Token); { valor pego na autenticação }
IdHTTP1.Request.CustomHeaders.AddValue('X-CSRF-Token', XCSRF); { valor pego na autenticação }

Try
try
mmResponse.Lines.Clear;
Response:=IdHTTP1.Post(URL, Arquivo); { enviando arquivo }
mmResponse.Lines.Add(Response);
except
on E:EIdHTTPProtocolException do
begin
mmResponse.Lines.Clear;
mmResponse.Lines.Add(e.ErrorMessage);
end;
end;
Finally
Arquivo.Free();
End;
End;

Evento Botão Enviar
if Autenticar then
EnviarXML;



Se alguém conseguiu com os componentes REST do delphi posta ai.


Boa noite,

O meu código está retornando isso.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><error><message>Ocorreu um erro inesperado. Por favor, tente novamente. Se o problema persistir, acione a Central Serpro de Atendimento anexando todo o conteúdo do response.</message><code>PUCX-ER0001</code><tag>[DUEX-OSOHPO4184]</tag><date>2021-10-03T21:59:29</date><status>500</status><detail/><severity>ERROR</severity><info><ambiente>TRE</ambiente><mnemonico>DUEX</mnemonico><sistema>Declaração Única de Exportação</sistema><trackerId>ZLpprUVVop</trackerId><url>/due/api/ext/due</url><usuario>03011957495</usuario><visao>PRIV</visao></info></error>

GOSTEI 0
Luis Godinho

Luis Godinho

17/07/2018

Vamos direto ao ponto.
Vamos precisar dos seguintes componentes: TIdHTTP (Indy Clients) e TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers), TMemo(mmResponse) e TButton (Standard)

O certificado digital deve estar convertido para .pem ( https://www.sslshopper.com/ssl-converter.html )

-> Configurando TIdHTTP
AllowCookies := True
HandleRedirects := True
HTTPOptions
hoKeepOrigProtocol :=True
IOHandler := IdSSLIOHandlerSocketOpenSSL1
ProxyParams
BasicAuthentication :=True
ProxyPassword <senha>
ProxyPort <porta>
ProxyServer <servidor>
ProxyUsername <usuário>
Request
Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
AcceptChasSet := 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'
AcceptLanguage :='pt-BR'
CharSet :='UTF-8'
ContentType := 'application/json'
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);'

-> Configurando idSSLIOHandlerSocketOpenSSL1
SSLOptions
CertFile := 'cert.pem'
KeyFile := 'cert.pem'
Method := 'sslvTLSv1'
Mode := 'sslmClient'
RootCertFile := 'cert.pem'


-> Simplifiquei o código para focar na programação dos objetos envolvidos no processo de autenticação no servidor e envio do arquivo xml.

Variáveis globais
Token, XCSRF, URL : string;

Function Autenticar(): boolean;
var
Response : string;
Request: TStringList;
begin
Result:=True;
URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de validação }
// URL := 'https://portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de produção }

Request := TStringList.Create;

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Role-Type', 'IMPEXP');

IdHTTP1.Response.Clear;
IdHTTP1.Response.ContentType := 'application/json';
IdHTTP1.Response.CharSet := 'UTF-8';
IdHTTP1.Response.KeepAlive := True;

Try
try
Response := IdHTTP1.Post(URL, Request);
// mmResponse.Lines.Add(IdHTTP1.Response.RawHeaders.CommaText); { ver os valores do response num memo }
Token := IdHTTP1.Response.RawHeaders.Values['Set-Token']; {recebendo o valor de header Set-Token}
XCSRF := IdHTTP1.Response.RawHeaders.Values['X-CSRF-Token']; {recebendo o valor de header X-CSRF-Token}
except
on E: EIdHTTPProtocolException do
begin
result:=false;
mmResponse.Lines.Add(E.ErrorMessage);
end;
end;
Finally
Request.Free;
End;
end;

Procedure EnviarXML;
var
Response: String;
Arquivo : TMemoryStream;
Begin
Arquivo := TMemoryStream.Create;
Arquivo.LoadFromFile(Trim(<caminho do arquivo .xml>));

URL := 'https://val.portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de validação }
//URL := 'https://portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de produção }

IdHTTP1.Request.ContentType := 'Application/xml';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Authorization', Token); { valor pego na autenticação }
IdHTTP1.Request.CustomHeaders.AddValue('X-CSRF-Token', XCSRF); { valor pego na autenticação }

Try
try
mmResponse.Lines.Clear;
Response:=IdHTTP1.Post(URL, Arquivo); { enviando arquivo }
mmResponse.Lines.Add(Response);
except
on E:EIdHTTPProtocolException do
begin
mmResponse.Lines.Clear;
mmResponse.Lines.Add(e.ErrorMessage);
end;
end;
Finally
Arquivo.Free();
End;
End;

Evento Botão Enviar
if Autenticar then
EnviarXML;



Se alguém conseguiu com os componentes REST do delphi posta ai.



Bom dia!

Estou seguindo o passo a passo do projeto e quando vou testar esta retornando um erro que não consegui identificar.

Could not load root certificate.
error:0B084002:x509 certificate
routines:X509_load_cert_file:system lib.

Alguem saberia me dar uma dica do que pooderia ser?

Gratp.
GOSTEI 0
Luis Godinho

Luis Godinho

17/07/2018

Vamos direto ao ponto.
Vamos precisar dos seguintes componentes: TIdHTTP (Indy Clients) e TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers), TMemo(mmResponse) e TButton (Standard)

O certificado digital deve estar convertido para .pem ( https://www.sslshopper.com/ssl-converter.html )

-> Configurando TIdHTTP
AllowCookies := True
HandleRedirects := True
HTTPOptions
hoKeepOrigProtocol :=True
IOHandler := IdSSLIOHandlerSocketOpenSSL1
ProxyParams
BasicAuthentication :=True
ProxyPassword <senha>
ProxyPort <porta>
ProxyServer <servidor>
ProxyUsername <usuário>
Request
Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
AcceptChasSet := 'pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3'
AcceptLanguage :='pt-BR'
CharSet :='UTF-8'
ContentType := 'application/json'
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);'

-> Configurando idSSLIOHandlerSocketOpenSSL1
SSLOptions
CertFile := 'cert.pem'
KeyFile := 'cert.pem'
Method := 'sslvTLSv1'
Mode := 'sslmClient'
RootCertFile := 'cert.pem'


-> Simplifiquei o código para focar na programação dos objetos envolvidos no processo de autenticação no servidor e envio do arquivo xml.

Variáveis globais
Token, XCSRF, URL : string;

Function Autenticar(): boolean;
var
Response : string;
Request: TStringList;
begin
Result:=True;
URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de validação }
// URL := 'https://portalunico.siscomex.gov.br/portal/api/autenticar'; { url para ambiente de produção }

Request := TStringList.Create;

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Role-Type', 'IMPEXP');

IdHTTP1.Response.Clear;
IdHTTP1.Response.ContentType := 'application/json';
IdHTTP1.Response.CharSet := 'UTF-8';
IdHTTP1.Response.KeepAlive := True;

Try
try
Response := IdHTTP1.Post(URL, Request);
// mmResponse.Lines.Add(IdHTTP1.Response.RawHeaders.CommaText); { ver os valores do response num memo }
Token := IdHTTP1.Response.RawHeaders.Values['Set-Token']; {recebendo o valor de header Set-Token}
XCSRF := IdHTTP1.Response.RawHeaders.Values['X-CSRF-Token']; {recebendo o valor de header X-CSRF-Token}
except
on E: EIdHTTPProtocolException do
begin
result:=false;
mmResponse.Lines.Add(E.ErrorMessage);
end;
end;
Finally
Request.Free;
End;
end;

Procedure EnviarXML;
var
Response: String;
Arquivo : TMemoryStream;
Begin
Arquivo := TMemoryStream.Create;
Arquivo.LoadFromFile(Trim(<caminho do arquivo .xml>));

URL := 'https://val.portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de validação }
//URL := 'https://portalunico.siscomex.gov.br/due/api/ext/due'; { url para ambiente de produção }

IdHTTP1.Request.ContentType := 'Application/xml';
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.AddValue('Authorization', Token); { valor pego na autenticação }
IdHTTP1.Request.CustomHeaders.AddValue('X-CSRF-Token', XCSRF); { valor pego na autenticação }

Try
try
mmResponse.Lines.Clear;
Response:=IdHTTP1.Post(URL, Arquivo); { enviando arquivo }
mmResponse.Lines.Add(Response);
except
on E:EIdHTTPProtocolException do
begin
mmResponse.Lines.Clear;
mmResponse.Lines.Add(e.ErrorMessage);
end;
end;
Finally
Arquivo.Free();
End;
End;

Evento Botão Enviar
if Autenticar then
EnviarXML;



Se alguém conseguiu com os componentes REST do delphi posta ai.



Bom dia!

Estou seguindo o passo a passo do projeto e quando vou testar esta retornando um erro que não consegui identificar.

Could not load root certificate.
error:0B084002:x509 certificate
routines:X509_load_cert_file:system lib.

Alguem saberia me dar uma dica do que pooderia ser?

Gratp.


Resolvido. Bastaba remover a indicação do campo RootCert.

Att,
GOSTEI 0
POSTAR