Ir para o conteúdo
cjulio

Utilizar Webservices da AT

Mensagens Recomendadas

palmeida
3 horas atrás, bugFree disse:

Estão a conseguir comunicar os DT no ambiente de testes?

No de produção funciona, mas no de testes não consigo enviar nada.

Obrigado.

 

O certificado de testes da AT expirou em 2018-01-29.

O novo já está disponível no eFatura (https://faturas.portaldasfinancas.gov.pt/factemipf_static/java/certificados.zip).

Já testei o novo certificado de testes e consegui comunicar com sucesso.

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bugFree
11 horas atrás, palmeida disse:

O certificado de testes da AT expirou em 2018-01-29.

O novo já está disponível no eFatura (https://faturas.portaldasfinancas.gov.pt/factemipf_static/java/certificados.zip).

Já testei o novo certificado de testes e consegui comunicar com sucesso.

 

Já estou a usar esse certificado, mas continua a dar-me erro.

Estou a usar o curl em Linux e dá-me o erro "HTTP/1.1 500 Internal server error".

Durante a negociação dá também "ALPN, server did not agree to a protocol"

Estou a comunicar com TLS1.2 / RSA_AES_256_CBC_SHA256

Alguém tem tem esta situação?

 


What's better: Coding solo or as part of a team?

A team means you have to fix someone else's bugs. Coding solo means you have to write all the bugs yourself.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
americob

Comigo o envio em testes sempre funcionou bem (claro, com o certificado atualizado).

Para o caso de ajudar alguém a despistar o problema, deixo aqui o LOG do objeto Chilkat que eu uso:

<?xml version="1.0" encoding="utf-8" ?>
<ChilkatLog>
    <SynchronousRequest>
        <DllDate>May  9 2014</DllDate>
        <ChilkatVersion>9.5.0.39</ChilkatVersion>
        <UnlockPrefix>ELABORHttp</UnlockPrefix>
        <Username>DESKTOP-5TO5J7E:ameri</Username>
        <Architecture>Little Endian; 32-bit</Architecture>
        <Language>ActiveX</Language>
        <VerboseLogging>0</VerboseLogging>
        <domain>servicos.portaldasfinancas.gov.pt</domain>
        <port>701</port>
        <ssl>1</ssl>
        <httpRequest>
            <httpVersion>1.1</httpVersion>
            <verb>POST</verb>
            <path>/sgdtws/documentosTransporte</path>
            <contentType />
            <charset>windows-1252</charset>
            <sendCharset>0</sendCharset>
            <mimeHeader>SOAPAction: envioDocumentoTransporte</mimeHeader>
        </httpRequest>
        <readTimeout>20</readTimeout>
        <connectTimeout>10</connectTimeout>
        <fullRequest>
            <a_synchronousRequest>
                <generateRequest>
                    <httpRequestGenStartLine>
                        <genStartLine>
                            <startLine>POST /sgdtws/documentosTransporte HTTP/1.1</startLine>
                        </genStartLine>
                    </httpRequestGenStartLine>
                    <addCookies>
                        <info>Not auto-adding cookies.</info>
                    </addCookies>
                </generateRequest>
                <fullHttpRequest>
                    <domain>servicos.portaldasfinancas.gov.pt</domain>
                    <port>701</port>
                    <ssl>1</ssl>
                    <openHttpConnection>
                        <info>Opening connection directly to HTTP server.</info>
                        <httpHostname>servicos.portaldasfinancas.gov.pt</httpHostname>
                        <httpPort>701</httpPort>
                        <ssl>1</ssl>
                        <connect2>
                            <connectImplicitSsl>
                                <clientHandshake2>
                                    <checkServerCert>
                                        <info>Not verifying server certificate...</info>
                                        <info>Set the RequireSslCertVerify property to true to enable verification.</info>
                                    </checkServerCert>
                                    <info>Secure Channel Established.</info>
                                </clientHandshake2>
                            </connectImplicitSsl>
                            <connectElapsedMs>140</connectElapsedMs>
                            <info>HTTP connection succeeded.</info>
                        </connect2>
                        <connectTime>Elapsed time: 140 millisec</connectTime>
                        <sendRequestHeader>
                            <sendHeaderElapsedMs>0</sendHeaderElapsedMs>
                        </sendRequestHeader>
                        <sendRequestBody>
                            <sendBodyElapsedMs>0</sendBodyElapsedMs>
                        </sendRequestBody>
                        <statusCode>200</statusCode>
                        <statusText>OK</statusText>
                        <readResponseBody>
                            <info>Response has no Content-Length header.</info>
                        </readResponseBody>
                    </openHttpConnection>
                    <success>1</success>
                </fullHttpRequest>
            </a_synchronousRequest>
            <totalTime>Elapsed time: 610 millisec</totalTime>
            <info>Success.</info>
        </fullRequest>
    </SynchronousRequest>
</ChilkatLog>

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosR

Hi to everyone!

Don't know any Portuguese at all (but I can understand it) so I'll be using English, sorry.

Right now I'm in the test phase of sending invoices (factemiws.wsdl) and I'm getting always the same error:

      Codigo 20: - Chave do pedido não  preenchida

I sent this message:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext">
      <UserNameToken>
        <Username>501...16/3</Username>
        <Password>3uAx...bRxILIg==</Password>
        <Nonce>JWzbh6jNvjnp7AIOm3oWmzOUD+2CEmtS8kG7b6/8608E22TkhOJtNQUJsR/Mqsvn
eoZnHZDLV9ukyIHJf7bw12exIvn2EZVhIVIyyW8T5yQAa63FwGeLqv1nRYp1OvtG
kvIDYXmbGot...cvTkNJU+0CLvYb
4qpmMFI/VD9GDWE+URZJSycBNtbucvTLfs8Kpkny2L/RI7P6INtCZSQ60d/MVkNI
mFmP29P6mxomfmny4hSKqkVpgc7u+AMcyWIASq0lpeR+QaMWTe6GmKqs3p7SF9Es
llRN8mAcosFRbgmUuhnxkQ==
</Nonce>
        <Created>+0XPvUm//wl05ft6r...GEuQ+QNgGHbI=</Created>
      </UserNameToken>
    </Security>
  </soap:Header>
  <soap:Body>
    <RegisterInvoiceElem xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">
      <TaxRegistrationNumber xmlns="">501...16</TaxRegistrationNumber>
      <InvoiceNo>FT Q/75003</InvoiceNo>
      <InvoiceDate>2015-01-05</InvoiceDate>
      <InvoiceType>FT</InvoiceType>
      <InvoiceStatus>N</InvoiceStatus>
      <CustomerTaxID xmlns="">510...83</CustomerTaxID>
      <Line xmlns="">
        <CreditAmount xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">7245</CreditAmount>
        <Tax xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">
          <TaxType>IVA</TaxType>
          <TaxCountryRegion>PT</TaxCountryRegion>
          <TaxPercentage>23</TaxPercentage>
        </Tax>
      </Line>
      <DocumentTotals xmlns="">
        <TaxPayable xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">1666.350000</TaxPayable>
        <NetTotal xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">7245.000000</NetTotal>
        <GrossTotal xmlns="http://servicos.portaldasfinancas.gov.pt/faturas/">8911.350000</GrossTotal>
      </DocumentTotals>
    </RegisterInvoiceElem>
  </soap:Body>
</soap:Envelope>

The direcction is https://servicos.portaldasfinancas.gov.pt:700/fews/faturas

I'm using the TesteWebservices.pfx as a certificate and the ChaveCifraPublicaAT2020.cer to get the public key to encrypt the symmetric key (both given on the message you get if you ask for certificates, like a week ago)

Also, I'm using Powerbuilder (which means that internally I'm using proxy objects that interact with a .Net .dll).

I've tried to send no header at all and I get the same error. If I forget to put the TaxType it will send another error saying there's no TaxType.

Also, I've already checked the whole thread and it seems that this is an uncommon error.

Thank you all a lot in advance!

EDIT: Turns out I'm blind, UserNameToken -> UsernameToken and now the error is 8, which is way more acceptable.

Editado por CarlosR

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Just Ivo

Pergunto se alguém me pode ajudar.  No manual providenciado pela AT para comunicação dos documentos  de transporte, o ponto 5.3 diz o seguinte:

Citação

5.3 Integrar certificado SSL com a chave privada


Depois de receber o certificado SSL assinado pela chave digital da AT é necessário integrar esse certificado com a chave privada gerada no passo anterior (555555555.key).

Para tal deve ser usado o seguinte comando:
$ openssl pkcs12 -export -in 555555555.crt -inkey 555555555.key -out 555555555.pfx

Onde cada produtor de software deve substituir os parâmetros que não estão a BOLD pelosnomes dos ficheiros corretos.
Como resultado, o certificado SSL assinado pela AT é integrado com a chave privada e gravada com uma password de acesso que cada produtor de software deve definir na execução do comando.

Mas não está claro que ficheiro é aquel no meio do comando com a extensão .crt.  Nenhum dos pontos acima no manual refere este ficheiro directamente.

A parte que menciona "depois de receber o certificado SSL assinado pela chave digital da AT" talvez esteja relacionado?  Se se refere a receber algo enviado por eles, eu não recebi nada.  Nem quando fiz o pedido de adesão ao serviço; eles simplesmente marcaram como "respondido" e "válido" na listagem e assim ficou.

Eu já tenho o software a comunicar com o WS de testes sem problemas, só me falta mesmo perceber o que me está a escapar neste último passo para começar a comunicar com o WS de produção.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rasptty

Boa Tarde.

Trata-se de um procedimento bastante simples: caso ainda não conseguistes resolver podes enviar um email que passo a informação necessária:

cps

Sérgio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
João Januário

Boas,

Tenho tido vários problemas na comunicação de documentos de transporte.

Em alguns clientes, por vezes dá se consegue comunicar as GT. O mais estranho é que funciona uma vezes e outras não e neste momento só temos 2 clientes a queixarem-se.

Os erro vão sendo diferentes.

E por vezes com tentativas o problema desaparece!!!

Os erros que ocorrem por vezes:

O servidor remoto devolveu um erro: (403) Proibido.

Outro:

A ligação subjacente foi fechada: Erro inesperado ao enviar. ---> System.IO.IOException: Falha da autenticação porque a parte remota fechou a sequência de transporte. em System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) em System.Net.Security.SslState.C

Está a acontecer a alguém algo semelhante?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
oalves

Olá a todos,

Desde 5ª feira que deixei de conseguir comunicar documentos à AT via webservice.

De um momento para o outro, deixou de funcionar.

O único erro que consigo identificar na comunicação é:

Curl error: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to servicos.portaldasfinancas.gov.pt:401

Mais alguém está a ter o mesmo problema ou saiba como resolver?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
marcolopes
4 hours ago, oalves said:

Olá a todos,

Desde 5ª feira que deixei de conseguir comunicar documentos à AT via webservice.

De um momento para o outro, deixou de funcionar.

O único erro que consigo identificar na comunicação é:

Curl error: OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to servicos.portaldasfinancas.gov.pt:401

Mais alguém está a ter o mesmo problema ou saiba como resolver?

Atenção que os primeiros certificados do PRODUTOR do SOFTWARE (emitidos pela AT)  pedidos aquando da certificação / renovados há 2 anos devem estar a caducar!


The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
oalves
8 minutos atrás, marcolopes disse:

Atenção que os primeiros certificados do PRODUTOR do SOFTWARE (emitidos pela AT)  pedidos aquando da certificação / renovados há 2 anos devem estar a caducar!

Sim, entretanto verifiquei essa mesma situaçao.

No entanto, já solicitei o novo (enviei o mesmo .csr que da primeira vez), mas agora continua-me a dar o 'Cifra da chave pública inválida'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
StadaExp

Olá a todos!

Estamos a tentar usar os Webservices referentes ao STADA Exportação. Finalmente hoje enviaram-nos um certificado para o sistema de testes sem o WSDL (apesar de já o ter pedido) e foi assim que cheguei a este fórum através do nome do ficheiro do certificado. Alguém tem experiência com o STADA Exportação ou consegue arranjar o WSDL?

Para adiantar a parte da autenticação estou a tentar enviar umas faturas para o ambiente de testes e estou sempre a obter o famoso

  <?xml version='1.0' ?>
  <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
    <env:Body>
      <env:Fault>
        <faultcode>env:Client</faultcode>
        <faultstring>Internal Error</faultstring>
      </env:Fault>
    </env:Body>
   </env:Envelope>

Hoje estive na luta e consegui finalmente enviar alguma coisa para o servidor de testes. Basicamente a luz acendeu quando passei o parâmetro encoding com UTF-8 nas opções de encoding do SoapClient e devolveu um erro diferente de Internal Error. A partir daí foi dar marteladas atrás de marteladas, ler coisas neste tópico, tratar da autenticação e embrulhar :P

Para quem esteja a chegar agora e trabalhe com PHP fica aqui o código com o SoapClient e phpseclib (não usa mcrypt que foi descontinuado nas versões mais recentes e é considerado inseguro). Este exemplo é para as guias de transporte. Eu vou estar a trabalhar com outros webservices que não estão no site das finanças referentes ao STADA Exportação portanto espero que a autenticação seja igual!!

Neste caso estou a usar composer para instalar a dependência do phpseclib portanto terão de adaptar ao vosso código!

1.  Obter os certificados do Portal das Finanças.

2. Pegar no ficheiro TesteWebservices.pfx, converter para o formato PEM e copiar o resultado para uma pasta acessível pelo vosso script (no meu caso a pasta certs). A password é TESTEwebservice. O comando irá retirar a password do ficheiro portanto não será necessária no código.

openssl pkcs12 -in TesteWebservices.pfx -out TesteWebservices.pem -nodes

3. Copiar o ficheiro da chave pública da AT que está no link indicado no número 1 para a pasta do vosso script.

4. Personalizar o código em baixo com as vossas credenciais, caminhos e endpoints no array $options.

<?php
require 'vendor/autoload.php';

use phpseclib\Crypt\AES;
use phpseclib\Crypt\Random;
use phpseclib\Crypt\RSA;
use phpseclib\File\X509;

$transport = new stdClass();
$transport->TaxRegistrationNumber = '599999993';
$transport->CompanyName = 'Nome Empresa Lda';
$transport->CompanyAddress = new stdClass();
$transport->CompanyAddress->Addressdetail = 'Rua da Empresa, 123';
$transport->CompanyAddress->City = 'Maia';
$transport->CompanyAddress->PostalCode = '4470-263';
$transport->CompanyAddress->Country = 'PT';
$transport->DocumentNumber = bin2hex(openssl_random_pseudo_bytes(8));
$transport->MovementStatus = 'N';
$transport->MovementDate = date('Y-m-d');
$transport->MovementType = 'GT';

$transport->CustomerName = 'Nome Cliente Lda';
$transport->CustomerTaxID = 599999993;
$transport->CustomerAddress = new stdClass();
$transport->CustomerAddress->Addressdetail = 'Local';
$transport->CustomerAddress->City = 'Lisboa';
$transport->CustomerAddress->PostalCode = '2775-089';
$transport->CustomerAddress->Country = 'PT';

$transport->AddressFrom = new stdClass();
$transport->AddressFrom->Addressdetail = 'Local carga';
$transport->AddressFrom->City = 'Maia';
$transport->AddressFrom->PostalCode = '4470-263';
$transport->AddressFrom->Country = 'PT';

$transport->AddressTo = new stdClass();
$transport->AddressTo->Addressdetail = 'Local entrega';
$transport->AddressTo->City = 'Lisboa';
$transport->AddressTo->PostalCode = '2775-089';
$transport->AddressTo->Country = 'PT';

$transport->VehicleID = '00-00-KK';

$transport->MovementStartTime = date('Y-m-d\TH:i:s', mktime(date('H') + 1, date('i'), 0, date('m'), date('d'), date('Y')));
$transport->MovementEndTime = date('Y-m-d\TH:i:s', mktime(date('H') + 5, date('i'), 0, date('m'), date('d'), date('Y')));

$transport->Line = [];
$transport->Line[] = (function () {
    $line = new stdClass();

    $line->ProductDescription = 'prod1';
    $line->Quantity = 1;
    $line->UnitOfMeasure = 'Kg';
    $line->UnitPrice = 11;

    return $line;
})();

$transport->Line[] = (function () {
    $line = new stdClass();

    $line->ProductDescription = 'prod2';
    $line->Quantity = 1;
    $line->UnitOfMeasure = 'Kg';
    $line->UnitPrice = 12;

    return $line;
})();

$wsdl = 'wsdl/documentosTransporte.wsdl';
$options = [
    'local_cert' => 'certs/TesteWebservices.pem',
    'encoding' => 'utf-8',
    'soap_version' => SOAP_1_2,
    'at_username' => '599999993/37',
    'at_password' => 'testes1234',
    'at_public_key' => 'certs/ChavePublicaAT.cer',
    'location' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte',
    'uri' => 'https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte',
];
$client = new SoapClientAT($wsdl, $options);
var_dump($client->envioDocumentoTransporte($transport));

/**
 * Class SoapClientAT
 */
class SoapClientAT extends SoapClient
{
    /**
     * @var array|null
     */
    private $options = null;

    /**
     * SoapClientAT constructor.
     * @param string $wsdl
     * @param array $options
     */
    public function __construct($wsdl, $options)
    {
        $this->options = $options;
        parent::__construct($wsdl, $options);
    }

    /**
     * @param DOMDocument $document
     * @return DOMElement
     */
    private function createHeaderNode($document)
    {
        $publicKey = $this->options['at_public_key'];
        if (is_file($publicKey)) {
            $publicKey = file_get_contents($publicKey);
        }

        $key = Random::string(16);

        $certificate = new X509();
        $certificate->loadX509($publicKey);

        $rsa = new RSA();
        $rsa->loadKey($certificate->getPublicKey());
        $rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1);
        $nonce = $rsa->encrypt($key);

        $cipher = new AES(AES::MODE_ECB);
        $cipher->setKey($key);

        $password = $cipher->encrypt($this->options['at_password']);
        $created = $cipher->encrypt(gmdate('Y-m-d\TH:i:s\Z'));

        $usernameToken = $document->createElement('wss:UsernameToken');
        $usernameTokenData = [
            'wss:Username' => $this->options['at_username'],
            'wss:Password' => base64_encode($password),
            'wss:Nonce' => base64_encode($nonce),
            'wss:Created' => base64_encode($created),
        ];

        foreach ($usernameTokenData as $tag => $value) {
            $usernameToken->appendChild($document->createElement($tag, $value));
        }

        $security = $document->createElement('wss:Security');
        $security->appendChild($usernameToken);
        $security->setAttributeNS('http://www.w3.org/2000/xmlns/',
            'xmlns:wss',
            'http://schemas.xmlsoap.org/ws/2002/12/secext'
        );

        $header = $document->createElement('env:Header');
        $header->appendChild($security);

        return $header;
    }

    /**
     * @param $request
     * @return string
     */
    private function embedHeader($request)
    {
        $document = new DOMDocument();
        $document->preserveWhiteSpace = true;
        $document->loadXML($request);

        $body = $document->getElementsByTagName('Body')->item(0);
        $header = $this->createHeaderNode($document);

        $envelope = $document->getElementsByTagName('Envelope');
        $envelope->item(0)->insertBefore($header, $body);

        // Must change the namespace of the Envelope tag to match the one specified in the WSDL otherwise we'll get
        // an HTTP 500 Error with the text "Internal Error"
        $envelope->item(0)->setAttributeNS(
            'http://www.w3.org/2000/xmlns/',
            'xmlns:env',
            'http://schemas.xmlsoap.org/soap/envelope/'
        );

        return $document->saveXML();
    }

    /**
     * @param string $request
     * @param string $location
     * @param string $action
     * @param int $version
     * @param int $one_way
     *
     * @return string
     */
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $request = $this->embedHeader($request);
        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }
}

Cumprimentos,
Ricardo

Editado por StadaExp
  • Voto 2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fabio999

Bom dia.

Estou com um problema no uso do serviço da AT. O erro que dá é este:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n<SOAP-ENV:Header/>\n<SOAP-ENV:Body>\n<SOAP-ENV:Fault>\n<faultcode>10  </faultcode>\n<faultstring>Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2018-03-12T11:55:33Z)  |  Tentativas Restantes: -1</faultstring>\n<detail>sgdtws.gdgt</detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

O certificado só expira a 28/03/2018

Alguem pode ajudar?

 

Cumprimentos,

Fabio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
jorang
2 horas atrás, Fabio999 disse:

Bom dia.

Estou com um problema no uso do serviço da AT. O erro que dá é este:


<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">\n<SOAP-ENV:Header/>\n<SOAP-ENV:Body>\n<SOAP-ENV:Fault>\n<faultcode>10  </faultcode>\n<faultstring>Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2018-03-12T11:55:33Z)  |  Tentativas Restantes: -1</faultstring>\n<detail>sgdtws.gdgt</detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

O certificado só expira a 28/03/2018

Alguem pode ajudar?

 

Cumprimentos,

Fabio

Esse erro ocorre normalmente quando a hora da máquina que faz o pedido não está sincronizada com a do Observatório e, em consequência, com a do servidor da AT.

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fabio999
19 minutes ago, jorang said:

Esse erro ocorre normalmente quando a hora da máquina que faz o pedido não está sincronizada com a do Observatório e, em consequência, com a do servidor da AT.

You nailed IT !!

Muito Obrigado! Abraço!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosR

Hi again, sorry for using English but I can't speak Portuguese (can understant it though)

My problem is that I'm still on the test phase of sending invoices (with the factemiws.wsdl) and I have this problem: I get the error code "Codigo: 16 | Erro: Created: Chave de sessão inválida. Não foi possível decifrar o campo Created".

I imagine it has to do with:

  • The key to encode "Created" is wrong
    • openssl rand -hex 16 -out  <filename> -> example: a0b075400c118369a79b43e3fdeb15d7
  • The "Created" is wrong
    • yyyy-mm-ddThh:mm:ss.ffZ -> example: 2018-03-13T10:42:44.00Z
  • The way I encoded "Created" is wrong
    • openssl enc -base64 -aes-128-ecb -K <key> -in <filein> -out <fileout> -> example: mao9q2ndwqSZOTOIe4hrlgKEa6kPIL/CmFFRTf4oz1A=
  • The way I encoded the key with the public key is wrong
    • openssl rsautl -encrypt -inkey <publickey> -pubin -in <filein with the key> -out <fileout>
    • example: lZG7UF1WIA+RkiwOSET/XtRkZtLLS/xV+AqpbmPgBwC42c/SnQQ2dgbGT4qaC5OOoonXETBBszBrVKzUpeavGYod44VoboZwWff83YMph2PDAHH90TUZLibeIsGBmgoZxdFM9FsSrzStQGn267q/7nJS6ArnoDU+nqsySF6GTCo9GQVXrnDV4SdrJ/XEPdfkEeLttPpGOeGGdYjyrOzoYtgf0kvwwfLKK4jaAr++IxSdo56dXL/EWX/bO7Forg7lN5FRcalbHMAwDHUX6HjIRwqHlMbl5UX1b2rjstgcZbH8xR1+aybhi4lVChgWsiMhaDPjblr12y6N9FLsQlG0/Q==

These examples are related, that means that I used the key a0b075400c118369a79b43e3fdeb15d7 to turn 2018-03-13T10:42:44.00Z into mao9q2ndwqSZOTOIe4hrlgKEa6kPIL/CmFFRTf4oz1A= and turned a0b075400c118369a79b43e3fdeb15d7 into the big chunk of base64 code.

I'm using the public key that you get when you send an email to ask for the test public key, I've tried to use other public keys (generated from the .pbx certifcate and I get another error saying that the public key is wrong).

Anyone knows what can be the problem? I've already checked previous post but I can't make it work.

Thank you a lot in advance.

 

 

Editado por CarlosR

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
StadaExp

Hey Carlos,

When dealing with encryption always use raw bytes. Hex or Base64 are for printing and transport. Don't hex encode the random key: openssl rand 16 -out <filename>

I think you're almost there ;)

Editado por StadaExp
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosR

Hi StadaExp,

Thanks for answering! Because the aes-128-ecb encode needs HEX values for the Key I'm still using the hex version of the key for that, but I'm already using the raw byte version to encode it with the public key (rsautl) to get what I put inside "Nonce" and I still get the same error.

I'll move things around in case there's something I left out.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
StadaExp

Can you please post the exact sequence of commands that you are trying? I'll give it a try on my end as well.

Can you also confirm the public key of the certificate you are using to encrypt the date? Although if there was a problem with the public key you would get another error code. I don't have much experience with these webservices but as far as I know if the webservice is already trying to decode the date it means it decoded the Nonce correctly.

When you are encrypting with aes-128-ecb does the command use padding by default? Perhaps it does not and you have to specify the padding function (PKCS#5).

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBZr7ZqFlHJ8PtTJpXjT
m7uilDw2dBIbhClYUh1HXMY72N6Kt4/Es+ZV12kERfjzI4FyqRb7Rpb7nD0gHDQf
dwjs3DBZIUKM5TwH/eASUMCu/hl9RfzRvOtXEq2CfSA4dHv/MH+QJg6vbVO0+lHl
u1jzybe7fFSxkHWtrfdpsacJRP+tRz9qQ2GS8Pbr7H51NdGHUAsm1A74DYJUyc3N
4tMd4v1H2YVAsDqnmRqFFasMvyb5tzjwttAlBXeccb6PhFG6Px/NTjYUt87wQywo
Gh2hqOG5Hwyx7RSidFKvXCQQnVAVxAwBhqgggqGf3eAujtTZMe+pdJPtM8x+P+vr
FwIDAQAB
-----END PUBLIC KEY-----

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosR

Sure,

- To extract the public key from the ChaveCifraPublicaAT2020.cer into a .pem for later use:

    openssl x509 -inform pem -outform pem -in ChaveCifraPublicaAT2020.cer  -pubkey -noout > ChaveCifraPublicaAT2020_aux.pem

- To generate the 128 bit key for AES (I'm actually using -hex, then the result is transformed into the byte version):

    openssl rand 16 -out key.bin

- To encode the Created:

    openssl enc -base64 -aes-128-ecb -K <key in hex> -in fileWithCreatedInside.txt -out fileWithENCCreatedInside.txt

- To encode the key:

   openssl rsautl -encrypt -inkey ChaveCifraPublicaAT2020_aux.pem -pubin -in fileWithKey_BYTEVersion_Inside.txt -out fileWithResult.txt

- Then to get the Base64 version of the encoded key to send, I know I can put the -base64 or -a option in the rsautl but I made some changes out of pure paranoia

   openssl enc -base64 -A -in fileWithResult.txt -out fileWithBASE64Result.txt
 

The reading and writing in files code, and also the method to turn an hex value into a byte value are part of the coding language, not sure if you want those.

That's it. And yes that's exactly the public key I'm getting inside the ChaveCifraPublicaAT2020_aux.pem file. I tried to use another public key earlier and it gave me an error saying the public key wasn't righ, so I guess that part works.

The openssl enc aes-128-ecb use PKCS#5 by default according to the wiki (in fact it's  PKCS#7 because it's basically the same, it's not a 64 bit block so...), but I don't know how to check if it is really applied. I already check all the options inside the enc command and there's only a -nopad option tu use no padding at all (and it crashes if you try to use -nopad).

If you need any more information just let me know :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
StadaExp

I managed to send a valid request generating those openssl commands in PHP (using shell_exec and reading the resulting files back). I cheated a little bit in the -K parameter by using bin2hex.

You write that you are you transforming the hex result of openssl rand into the byte equivalent. How are you achieving that? That might be the answer.

        shell_exec('openssl x509 -inform pem -outform pem -in certs/ChaveCifraPublicaAT.cer  -pubkey -noout > certs/ChaveCifraPublicaAT2020_aux.pem');
        shell_exec('openssl rand 16 -out rand.txt');
        $key = file_get_contents('rand.txt');

        shell_exec('openssl rsautl -encrypt -inkey certs/ChaveCifraPublicaAT2020_aux.pem -pubin -in rand.txt -out fileWithResult.txt');
        shell_exec('openssl enc -base64 -in fileWithResult.txt -out fileWithBASE64Result.txt');
        $nonce = file_get_contents('fileWithBASE64Result.txt');

        file_put_contents('fileWithCreatedInside.txt', gmdate('Y-m-d\TH:i:s\Z'));
        shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithCreatedInside.txt -out fileWithENCCreatedInside.txt');	
        file_put_contents('fileWithPasswordInside.txt', 'mypassword');
        shell_exec('openssl enc -base64 -aes-128-ecb -K '.bin2hex($key).' -in fileWithPasswordInside.txt -out fileWithENCPasswordInside.txt');

 

  • Voto 2

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosR

Guess what, instead of turning the hex value into a byte value I did it the other way around like you did, and it worked! I own you, a lot, thanks!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
General

Olá apesar de não haver webservice disponivel, existem pessoas/entidades que consegue enviar DMR para AT. Alguém aqui sabe como é possivel enviar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cavada
Em 05/03/2018 às 14:24, marcolopes disse:

Atenção que os primeiros certificados do PRODUTOR do SOFTWARE (emitidos pela AT)  pedidos aquando da certificação / renovados há 2 anos devem estar a caducar!

Bom dia, alguem ja recebeu a renovacao do certificado ? o meu expira amanha e nao obtenho respostas, vai ser bonito ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
palmeida
7 minutos atrás, cavada disse:

Bom dia, alguem ja recebeu a renovacao do certificado ? o meu expira amanha e nao obtenho respostas, vai ser bonito ...

Bom dia,

O processo para renovação do certificado é o mesmo do pedido inicial, descrito no documento da AT sobre a comunicação de documentos de transporte.

O pedido tem que ser registado na página de produtores de software no e-fatura. Eu fiz um pedido de renovação em Janeiro deste ano e obtive resposta em pouco mais de uma hora.

 

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaquimpais
Em 21/06/2013 às 12:55, albertosilva disse:

Outra questão importante que vi hoje levantada, a emissão de documentos de transporte a partir dos Açores. A parte do CreatedBy no UsernameToken é simples, usa-se hora UTC, basta que os computadores tenham a timezone bem definida. Mas e o MovementStartTime e EndTime, no PDF não é mencionado que seja as horas UTC, mas se nos Açores fizerem uma GT às 12:30 locais, 13:30 UTC, e se submeterem que a hora início do transporte é às 12:45, dá o erro esperado, tendo que utilizar 13:45. O problema é que depois na informação retirada do site da AT, mesmo na parte reservada aos agentes fiscalizadores, aparece a hora submetida, 13:45, e poderão ter que apelar ao senso comum se forem fiscalizados por ex: as 13:00 locais.

Albertosilva, já conseguiste alguma maneira de contornar isto, sem ter de aumentar uma hora no incio e fim de transporte? Horário de Verão nos Açores tenho este problema.


JP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.