Ir para conteúdo
  • Cadastre-se

dev botao

Conexão WS com HTTPRio sem Certificado


Ver Solução Respondido por Cleonir,
  • Este tópico foi criado há 1711 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Boa tarde Amigos, conclui minha integrações com CIOT e-Frete, inclusive pretendo agora contribuir com o projeto ACBr, porém, me deparei com o seguinte problema:
Enquanto fazia os testes para integração, em minha maquina não havia certificado digital algum no repositorio, e eu queria fazer a conexao com usuario e senha para efetuar os testes de homologação. Unica forma que encontrei disto funcionar, foi marcando a propriedade do HTTPRio, em WebNodes, Invokes, soPickFirstClientCertificate como TRUE. Fazendo isto, eu nao entendi o motivo, mas o HTTPRio ignora a mensagem de obrigatoriedade do certificado e segue o login normalmente. Porém, quando o computador tem um certificado digital instalado, e essa opção marcada, o HTTPRio envia esse certificado da maquina, com isso, ocasiona erro de login, pois nao é o certificado digital da empresa homologada para emitir. Se eu colocar a propriedade como FALSE, o erro de que Requer um certificado digital é apresentado novamente. Alguem já passou por isso e conseguiu resolver, usando HTTPRio ?  Conecto em um WebService tipo SOAP. Se alguem puder me dar uma ajuda, agradeço desde já.
Outro detalhe, tentei utilizar o numero de serie do certificado digital, o mesmo que gravo no ACBrCTe, para passar para o RIO em RunTime, porém o numero de série não é o mesmo que ele procura e com isso, nao encontra o certificado.

 

Deux Software Soluções e Sistemas

Ribeirão Preto - SP

Link para o comentário
Compartilhar em outros sites

Vou deixar a informação para caso alguém necessite do mesmo caso que o meu. Consegui encontrar uma solução. Como o HTTPRio faz uso dos metodos do IE, quando vc tenta acessar o WSDL por ele, ele solicita o certificado e se vc cancelar essa seleção, ele refaz o metodo de consulta, abrindo a parte onde seria o login via usuario e senha, chegando onde eu desejo. Precisei fazer uma alteração direto na unit do HTTPTrans, MAS lembro, caso utilizem o componente para outros WS, façam uma copia e altere um exclusivo para este metodo, para nao falhar com os outros.

Altere esta linha:

if (LastError = ERROR_INTERNET_INVALID_CA)  then

Para

if (LastError = ERROR_INTERNET_INVALID_CA) or (LastError =
ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED) then

 

Fazendo isto, o HTTPRio, vai efetuar a primeira tentativa, recebendo o erro de solicitação de certificado. Dentro deste If no HTTPTrans, ele faz nova tentativa de consulta, e com isso, o sucesso.
Abraços.

 

Deux Software Soluções e Sistemas

Ribeirão Preto - SP

Link para o comentário
Compartilhar em outros sites

Olá! Alisson, estou com problema sério no meu emissor CIOT do e-frete. Ele está homologado junto ao e-frete, uns clientes já o utiliza.

Ele procura o certificado do cliente que está no repositório e compara com a série que guardo numa tabela, até aí tudo bem ele vai e valida o CIOT, ou veiculo,motorista...

Agora a bronca é: Tem micro na mesma empresa que não consegue enviar o CIOT, dá erro de Ticket não pode ser nulo, enquanto outro valida normalmente. 

Como é sua rotina do certificado e assinatura no onBeforePost?

Será que você pode me ajudar. Você utiliza CAMPICOM?

Como é para fazer o login no e-frete através de logon e senha.

Te agradeço se puder me ajudar.

 

Segue minha rotina de certificado e assinatura:

 

procedure CarregaCertificado(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  Store: IStore;
  Certs: ICertificates;
  Cert: ICertificate2;
  CertContext: ICertContext;
  PCertContext: PCCERT_CONTEXT;
  I: Integer;
begin
  Store := CoStore.Create;

  Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
  Certs := Store.Certificates as ICertificates2;

  For I := 1 to Certs.Count do
    Begin
      Cert := IInterface(Certs.Item) as ICertificate2;
      if UpperCase(Cert.SerialNumber) = UpperCase(DM.qrEmpresaSERIECERTIFICADO.AsString) then
        Break;
    End;

  (* any certificates found? *)
  if (Certs.Count > 0) and (I <= Certs.Count) then
    begin

      (* get the certificate context *)
      Cert := IInterface(Certs.Item) as ICertificate2;
      CertContext := Cert as ICertContext;
      CertContext.Get_CertContext(Integer(PCertContext));

      (* set the certificate to use for the SSL connection *)
      if InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) = False
      then
        begin
 
        ShowMessage('Something went wrong');
        end;
    end;
end;

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 10 meses depois ...

 

Em 05/04/2018 at 15:10, Alisson Suart disse:

Boa tarde Amigos, conclui minha integrações com CIOT e-Frete, inclusive pretendo agora contribuir com o projeto ACBr, porém, me deparei com o seguinte problema:
Enquanto fazia os testes para integração, em minha maquina não havia certificado digital algum no repositorio, e eu queria fazer a conexao com usuario e senha para efetuar os testes de homologação. Unica forma que encontrei disto funcionar, foi marcando a propriedade do HTTPRio, em WebNodes, Invokes, soPickFirstClientCertificate como TRUE. Fazendo isto, eu nao entendi o motivo, mas o HTTPRio ignora a mensagem de obrigatoriedade do certificado e segue o login normalmente. Porém, quando o computador tem um certificado digital instalado, e essa opção marcada, o HTTPRio envia esse certificado da maquina, com isso, ocasiona erro de login, pois nao é o certificado digital da empresa homologada para emitir. Se eu colocar a propriedade como FALSE, o erro de que Requer um certificado digital é apresentado novamente. Alguem já passou por isso e conseguiu resolver, usando HTTPRio ?  Conecto em um WebService tipo SOAP. Se alguem puder me dar uma ajuda, agradeço desde já.
Outro detalhe, tentei utilizar o numero de serie do certificado digital, o mesmo que gravo no ACBrCTe, para passar para o RIO em RunTime, porém o numero de série não é o mesmo que ele procura e com isso, nao encontra o certificado.

Bom dia,

Alisson ou André, vocês podem disponibilizar o código ou o componente?

Estou batendo cabeça com o ACBrCIOT mas ele não esta acabado e esta focado no REPOM, mas é mais complicado o consumo do webservice.

O e-Frete tem área de homologação?

Obrigado!

Em 19/04/2018 at 22:38, André Franco disse:

Olá! Alisson, estou com problema sério no meu emissor CIOT do e-frete. Ele está homologado junto ao e-frete, uns clientes já o utiliza.

Ele procura o certificado do cliente que está no repositório e compara com a série que guardo numa tabela, até aí tudo bem ele vai e valida o CIOT, ou veiculo,motorista...

Agora a bronca é: Tem micro na mesma empresa que não consegue enviar o CIOT, dá erro de Ticket não pode ser nulo, enquanto outro valida normalmente. 

Como é sua rotina do certificado e assinatura no onBeforePost?

Será que você pode me ajudar. Você utiliza CAMPICOM?

Como é para fazer o login no e-frete através de logon e senha.

Te agradeço se puder me ajudar.

 

Segue minha rotina de certificado e assinatura:

 

procedure CarregaCertificado(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
  Store: IStore;
  Certs: ICertificates;
  Cert: ICertificate2;
  CertContext: ICertContext;
  PCertContext: PCCERT_CONTEXT;
  I: Integer;
begin
  Store := CoStore.Create;

  Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
  Certs := Store.Certificates as ICertificates2;

  For I := 1 to Certs.Count do
    Begin
      Cert := IInterface(Certs.Item) as ICertificate2;
      if UpperCase(Cert.SerialNumber) = UpperCase(DM.qrEmpresaSERIECERTIFICADO.AsString) then
        Break;
    End;

  (* any certificates found? *)
  if (Certs.Count > 0) and (I <= Certs.Count) then
    begin

      (* get the certificate context *)
      Cert := IInterface(Certs.Item) as ICertificate2;
      CertContext := Cert as ICertContext;
      CertContext.Get_CertContext(Integer(PCertContext));

      (* set the certificate to use for the SSL connection *)
      if InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) = False
      then
        begin
 
        ShowMessage('Something went wrong');
        end;
    end;
end;

 

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois ...
Em 02/03/2019 at 14:15, André Franco disse:

Não utilizo esse componente para CIOT do ACBr.

Tenho rotinas próprias.

Sim, eles tem homologação.

Boa tarde.

Estou precisando de ajuda com a frete.

Importei  o WSL mas estou tendo dificuldade para alimentar o array de viagens. Quando dou um Create da erro.

Tem como você me disponibilizar somente esta rotina de criação do array?

Link para o comentário
Compartilhar em outros sites

  • Administradores

Bom dia,

12 horas atrás, Cleonir disse:

Já Consegui.

Que bom que deu certo, mas seria interessante compartilhar a resolução também.

Att.

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Solution

Ops, desculpem aí...

 

SetLength(arrayViagens, 2);
  for i := 0 to 1 do
  begin
    arrayViagens := eFretePefService.Viagens3.Create;

    arrayViagens.DocumentoViagem        := 'CTe 1 / 1';
    arrayViagens.CodigoMunicipioOrigem  := 1234567;
    arrayViagens.CodigoMunicipioDestino := 1234567;
    ...

    ...

    ...
  end;

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

  • Este tópico foi criado há 1711 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.