51
Propositadamente produzimos erros no XML, agora traduzidos a
partir do código para português.
Resultado:
3.2 -Ler ficheiros no formato XML
Muitas vezes temos a necessidade de fazer a leitura a partir de
ficheiros externos do formato xml.
Para podermos usar o método simplexml_load_file() , é necessário
configurar uma directiva no nosso ficheiro de configurações
php.ini, colocando. allow_url_fopen = enable .
Vamos assumir que temos um ficheiro chamado “saft-
maio2019.xml”, cuja consulta do XML devido ao seu tamanho
pode ser consultada no aqui
Atenção que o bloco é um pedaço de XML incompleto, apenas
para fins didáticos.
52
3.3– Manipular grandes volumes de dados com PHP
Temos de ter em conta que, no processo de exportação do
SAFT(PT), muitos dos ficheiros na exportação podem chegar a ter
gigabytes (Gb) de volume de dados.
Alguns recursos a partir do código PHP , são destinados a ficheiros
com pouco volume de dados, como é o caso SimpleXML e torna-se
assim praticamente inviável usá-la para essa finalidade.
Para a leitura de ficheiros de grande porte, o PHP possui API´s
destinadas a esse fim como é o caso do XMLReader, que pode
consultar aquí.
O defeito não está na linguagem de programação ou metodologia
de classes usada. Isso só acontece porque o XML é um método
ineficiente para guardar grandes quantidades de dados.
53
3.4- Gerar XML a partir do XSD
Uma das formas rápidas de obter um exemplo XML, será converter
o seu XSD em XML. Para facilitar a tarefa pode usar a ferramenta
online XML to XSD Generator. Basta copiar o seu XSD completo e
colar o esqueça na caixa de texto da aplicação. Clique “generate
xml sample” para obter o resultado xml, na caixa de texto logo
abaixo. Este processo facilita a criação dos elementos a partir do
código,no nosso caso PHP.
Se tivessemos por exemplo o exemplo do Trecho 6) , criar uma
variável PHP que contenha todo esse bloco é tão simples como o
exemplo a seguir:
54
3.5- Gerar JSON a partir do XML (e vice-versa)
Ao longo do processo de desenvolvimento podemos também ter a
necessidade de procisar usar Json (JavaScript Object Notation),
uma formatação leve de dados, para fluxos rápidos de dados.
Também para isso temos uma série de ferramentas que nos
poupam muito tempo na execussão de tarefas e implementação.
No site Utilities Online encontra uma ferramenta para esse efeito.
55
CAPITULO 4
4 - CRIPTOGRAFIA DE CHAVES
A internet é um sistema de troca de informações totalmente
aberto e público.
Todos os dias trocamos informações, por meios de cabos e ligações
partilhadas, onde a informação circula livremente.
Isso significa que os seus dados bancários , a sua password do
facebook e um monte de informações e fotos podem ser acessadas
indevidamente por outros sem nosso consentimento.
Não precisamente.
Mas sim, na prática todas as informações a circular na internet
ficam vulneráveis
Contudo os sistemas e empresas na web adotaram métodos de
segurança para os nossos dados fiquem seguros.
Essa tecnologia , como geralmente se passa com outras
tecnologias de ponta , foi usada de forma pioneira pelo exército
americano.
No caso de cifrar mensagens , foi usada para troca de informações
em plena guerra fria.
A técnica é conhecida por criptografia.
Os dados de qualquer tipo podem ser mantidos secretos usando
aquilo a que chamamos encriptação. Esta permite mexer ou alterar
56
a mensagem, para esconder a mensagem original.
O processo reverso de reordenar a mensagem , tornando-a
compreensível, chama-se de desencriptação.
A ideia de esconder (cifrar) mensagens , é uma técnica ancestral ,
usada em plenitude em governos famosos como os egípcios e
romanos. Mas é tão ancestral , quanto a palavra grega que lhe dá
significado, em grego , cripto significa esconder e grafia refere-se a
escrever.
4.1- CIFRA DE CÉSAR
A primeira conhecida é a Cifra de César, uma homenagem ao
imperador romano Júlio César. Também é conhecida por cifra de
troca.
As mensagens na altura em que César era general romano, eram
trocadas de forma cifrada entre os exércitos que comandava, para
impedir que fossem compreendidas, no caso de serem
intercetadas pelo inimigo.
A Cifra de César é um algoritmo que substitui cada letra de uma
mensagem original por um certo número de letras depois.
Só o emissor e recetor da mensagem têm conhecimento do
número de letras a somar.
Esse conhecimento de saber qual é o número a somar e de que
forma, é chamada de chave criptográfica. É ela que permite que o
leitor aceda à mensagem secreta.
57
Se a mensagem original fosse ataque por mar , usando a Cifra de
César , com uma chave de três e alfabeto normal, então a
mensagem encriptada seria :
gFrgh Fdhvdu
Para testar e encriptar mensagens usando este algoritmo, temos
uma ferramenta online disponível aqui
https://www.dcode.fr/caesar-cipher
Se quisermos desencriptar a mensagem basta ao recetor usar a
chave e reverter o processo, neste caso decrementando três
posições (-3).
Existe no entanto um problema na Cifra de César. Qualquer um
pode facilmente craquear a mensagem encriptada , tentando usar
chaves diferentes até conseguir ter uma mensagem com sentido.
Como o nosso alfabeto só tem 26 letras , em 26 possíveis
tentativas de chaves diferentes, uma letra da mensagem
encriptada é revelada sem problema. Levaria mais ou menos, cerca
de uma hora a conseguir realizar o feito.
É a isso que se chamam falhas na segurança na encriptação.
Isso pode ser resolvido aumentado o nível de complexidade do
algoritmo responsável por cifrar os dados.
Por exemplo , ao invés de trocar as letras no mesmo intervalo,
vamos trocar cada letra num intervalo diferente.
Analisemos o exemplo A MELHOR FRANCESINHA DA REGIÃO *
Vamos dividir cada palavra da frase anterior num intervalo de
trocas possíveis.
Mostra quantas opções cada letra sucessiva vai ser mudada para
58
encriptar uma mensagem longa.
Se a nossa chave de 10 a dígitos for
No exemplo da palavra francesinha , teríamos a seguinte
mensagem encriptada , esmiuçando a chave
F+5 = K
R+1 = S
A+8 = I
N+2 = L
C+2 =
E+7 =
S+3 =
I+8 =
N+4 =
H+7 =
A+5 =
Significa que se se a nossa chave for de 10 dígitos, teremos cerca
de 10^26, situações distintas, ou seja , 100 biliões de soluções
diferentes, o que levaria vários séculos a um ser humano para
desencriptar a mensagem.
Contudo para um computador comum, essa tarefa levaria apenas
alguns segundos.
Significa isto que o nível de segurança continua a ser muito
reduzido, o que permite ter uma ideia sobre o nível profundo de
59
complexidade dos sistemas de encriptação atuais.
Atualmente a comunicação segura usa chaves de 256 bit
Para a arquitetura binária esse número é traduzido
por 2^8 = 32 bytes.
A título de exemplo , uma chave de 3 bits de comprimento,
configura para resolver o “mistério” que é 2^3– possibilidades da
representação binária elevada à quantidade de bits.
Assim teremos 8 possibilidades: 000, 001, 010, 011, 100, 101, 110,
111. A cada bit acrescentado ao expoente, dobra-se a quantidade
de combinações possíveis e, consequentemente, esforço
computacional e tempo requeridos para número de possibilidades.
Numa chave de 256 bit de comprimento como é feito na
transferência de dados na atualidade , teremos 2^256
1,1579208923731619542357098500869e+77
60
Esse número gigante, é o número de tentativas que teremos de
fazer para expor a mensagem privada.
Se tivéssemos 100 mil super computadores e cada um deles
pudesse tentar um milhão de chaves por segundo , demoraria
triliões e triliões de anos até tentar todas as opções.
Tendo em conta que os chips ficam duas vezes menores e mais
rápidos a cada ano. Se esse crescimento exponencial continuar ,
problemas que parecem insolúveis hoje , terão solução em poucos
séculos com um simples computador amanhã.
Este é o resultado da famosa Lei de Moore (Gordon E. Moore, 1965).
Crescimento do nº de transistores para processadores Intel, e linhas de previsão por Moore
(fonte:wikipédia)
61
No futuro olharemos para uma chave de 256 bits , como
atualmente olhamos para a primordial Cifra de César.
Serão chaves totalmente inseguras e fáceis de descobrir.
O tamanho das chaves padrão já é aumentado atualmente.
E em temos algorítmicos , o uso de chaves longas não torna a
criptografia mais difícil, mas aumenta o número de tentativas
necessárias para revelar uma cifra.
4.2- Encriptação simétrica
No meio técnico é também conhecida por criptografia de chave
privada.
Quando o emissor e recetor dividem a mesma chave , encriptando
uma mensagem, o processo chama-se de encriptação simétrica. A
mesma chave serve para codificar e descodificar a mensagem.
Usando a mesma metodologia da cifra de César, a chave
criptográfica é estabelecida por ambas as partes previamente.
No mundo real é fácil duas pessoas estabelecem contacto e
combinarem uma chave secreta.
62
No mundo livre da internet é impossível dois computadores se
encontrem em particular e combinarem uma chave secreta.
Muitos algoritmos conhecidos, todos eles disponíveis a partir do
PHP, permitem-nos criar mensagens encriptadas com toda a
segurança possível para as exigências da realidade actual. Em
breve serão tecnologias ultrapassadas , mas por agora , servem
para os objectivos a que se propõem.
Os algoritmos são mais rápidos que na criptografia de chave
pública. São no entanto menos seguros , pela razão que a chave
usada para encriptar a informação , tem de ser partilhada pela
várias máquinas, colocando-a em livre trânsito pela internet.
Recomendação:
No domínio da programação, não é boa ideia escrever o seu
próprio código para fazer criptografia, a não ser que tenha muita
expriência neste domínio e consiga fazer melhorias nas
implementações de outros programadores mais experientes.
63
4.2.1- ALGORITMOS DE ENCRIPTAÇÃO SIMÉTRICA MAIS USADOS
4.2.11- DES (Data Encryption Standard)
É uma tecnologia de criptografia baseada no método de chave
simétrica. Funciona usando a mesma chave para encriptar e
desencriptar a mensagem, e assim tanto o emissor e receptor da
mensagem devem saber e usar a mesma chave privada
Como é natural, caiu em desuso , porque foi ssubstiuido por uma
tecnologia mais recente e segura, o AES, que veremos em seguida.
O DES fi originalmente arquitetado por investigadores da IBM, nos
anos setenta e adotado pelo governo americano, como método
oficial para processamento de informações sensíveis, vulgarmente
conhecidas por FIPS (Federal Information Processing Standard).
64
4.3.1- AES Advanced Encryptation Standard
Tecnologia que surgiu em 1997, num concurso do governo
americano para substituir o conhecido DES (Data Encryption
Standard), que havia sido craqueado por uma ONG, (Electronic
Frontier Fondation), com um meros 250 mil dólares, face aos
milhões gastos, só em aprimorá-la.
O AES é criado a partir dum subconjunto de cifras de bloco da
familia Rinjdael, muitos usadas até ao PHP5, em conjunto as
funções mycript, que agora se encontram descontinuadas.
4.3.1.1 - Cuidados a ter com a encriptação AES
• Nunca use uma chave de encriptação de plain text (texto
legível). Cifre essa chave primeiro e use-a depois na
encriptação
• Use sempre um vector de inicialização (Random IV), e use-o
para fazer a encriptação e desencriptação. É muito
importante este procedimento de verdadeira aleatoriedade.
• Não use o modo ECB. Use antes o modo de cifra CBC, que é
um método mais complexo na organização dos dados,
permitindo gerar cifras mais robustas.
Para mais fácil entender, repare o resultado do modo ECB quando
aplicado a uma imagem (segunda imagem), e na terceira imagem o
resultado da cifra por exemplo usando CBC.
Fonte: wikipédia
65
Se o objectivo é esconder a informação, CBC é um modo de cifra;
(modus operandi), bem mais conseguido.
Se este tema lhe interessa, recomenda-se que leia este manual não
muito aprofundado do modo de operação de crifra em bloco .
66
67
CAPÍTULO 5
(ESTA É UMA VERSÃO DEMONSTRAÇÃO)
5 Webservices
5.1- Considerações sobre Webservices
5.1.1- Como funciona um webservice
5.1.2- Tipos de comunicação SOAP , REST
5.1.3- Consumir um webservice com PHP e Curl
5.2- Web Services Security ( WSS)
5.3- Criptografia no protocolo WSS
5.4- Estrutura SOAP-WSS no webservice da AT
68
CAPITULO 6
6- Comunicar o SAFT(PT) por websevice
No tópico anterior aprendemos como funciona um webservice.
O pré lançamento do webservice da AT teve até direito a
manchete.
Esta tecnologia permite a transmissão em tempo real dos
elementos nas faturas ou restantes documentos que são
solicitados.
O webservice da AT serve para comunicar (é uma obrigação dos
produtores de software que as aplicações sejam dotadas deste
automatismo), em tempo real por exemplo as guias de transporte.
Mas o mesmo processo é aplicável para o envio dao SAFT(PT),
apenas muda a estrutura XML.
O protocolo usado para estabelecer a comunição com o portal das
finanças é o mesmo.
O envio obrigatório dos documentos pode ser realizado de duas
69
formas:
• Por transmissão eletrónica de dados, mediante a submissão
do ficheiro SAF-T (PT), gerado pelo programa de faturação
recorrendo ao portal das Finanças pelo e-Fatura
• Por transmissão eletrónica de dados em tempo real
(webservice), com integração ao programa de faturação que
usa no momento
A tabela seguinte permite visualizar o número de passos para
submeter o ficheiro pela via manual . No lado direito , um passo
único é o necessário para o envio em tempo real.
Execução manual do ficheiro SAFT(PT) Por webservice
1. Gerar o SAFT do ficheiro de transporte
2. Efetuar login no portal das finanças
3. Validação do ficheiro no portal
4. Subir(upload) do ficheiro no portal
5. Baixar(download) o ficheiro de resposta
6. Integrar de volta no seu software Basta um clique
7. Caso ocorra erro, abrir o ficheiro e identificar o
erro
8. Corrigir o erro
9. Repetir o ciclo de passos entre 1 e 4
Tabela 4: Vantagens da utilização do webservice
70
No caso de transmissão em tempo real temos de executar a
configuração para que os documentos sejam comunicados
automaticamente, quando o webservice inicia o processo de
comunicação.
6.1- Criar um sub-utilizador
Para que isso seja possível , é necessário configurar no site da
Autoridade Tributária um sub-utilizador. Clique aqui para aceder.
Depois de proceder ao seu login no portal , siga os seguintes
passos:
1) Para criar o login do sub-utilizador, preencha o formulário
corretamente, para receber posteriormente na morada
indicada a senha de acesso.
Grave ou memorize os dados de login em local seguro.
71
Em Operações Autorizadas, marque em seguida a opção WDT –
Comunicação de Dados de Documentos de Transporte, para ativar
a comunicação do webservice para envio das guias.
Conclua a ação, clicando em Submeter.
A qualquer altura pode editar as informações dos sub-utilizadores
que já tem criados.
Na prática os sub-utilizadores criados nesta seção, é o vincular dos
clientes do produtor de software , à sua aplicação de faturação.
Todas as operações tributárias realizadas pelos clientes da
aplicação ficam relacionadas com o sub-utilizador que lhe foi
destinado.
Vamos a nível técnico ver como isso é possível e exemplificar com
um caso real.
Para testar o webservice de comunicação de dados à AT, vamos
priorizar algumas tarefas e criar um ambiente de testes .
72
6.2– O que são e para que servem os certificados digitais
É uma espécie de assinatura digital da sua empresa. Ao pedir o
certificado digital e usando-o para qualquer fim , está a garantir
autenticidade no processo que está a realizar.
É usado para ligar uma empresa ou instituição, a uma chave
pública.
Se uma empresa deseja que as pessoas tenham a capacidade de
lhe enviar mensagens privadas, tem de publicar a sua chave
pública (criptografia simética , como já falamos atrás).
O certificado digital impede, que outros que tenham a capacidade
de produzir chaves privadas , possam aceder às informações
destinadas à empresa que emitiu o certificado.
No domínio técnico da informática esse processo é conhecido
como CSR (Certificate Signing Request).
Numa tradução mecânica , significa Certificado de Pedido de
Assinatura. No caso da AT:
O pedido de Certificado Digital para ambiente de produção é realizado pelo
Operador Económico com NIF registado no Portal das Finanças e via Portal E-
Fatura:
https://faturas.portaldasfinancas.gov.pt
Neste Portal, deverá escolher as seguintes opções:
> Produtores de software (no canto inferior direito):
> Aderir ao envio por webservice.
Fonte: AT
73
Pelo que vimos antes , depois de recebermos o certificado digital
da AT, podemos ter acesso à chave pública e inciar o envio de
mensagens privadas para o portal e podermos consumir o
webservice.
O Operador Económico deverá então inserir os dados do
CSR (Certificate Signing Request) e submeter. Fonte: AT
6.3- Criar um CSR (Certificate Signing Request)
Existem duas formas de gerar um Certificado de Pedido de
Assinatura (CSR)
Em modo técnico, podemos gerar o CSR usando um servidor SSH.
Neste endereço temos as instruções necessárias para o gerar pela
linha de comandos. Mas a forma mais simples é usar uma das
ferramentas online para o efeito.
74
Dado que em certos manuais da AT é sugerido que o tamanho da
chave deve ser de 1024 bits , optou-se por usar gerador CSR que
tenha essa opção como é o caso do Self-signed SSL generator .
O CSR gerado a partir da informação acima terá a seguinte
apresentação;
75
-----BEGIN CERTIFICATE-----
MIIDmjCCAoICCQDrv8vj5MAmKjANBgkqhkiG9w0BAQUFADCBjjEUMBIGA1UEAwwL
b25pZGVzay5jb20xEzARBgNVBAoMCk9uaWRlc2sgVEkxCzAJBgNVBAsMAlRJMRMw
EQYDVQQHDApDYXJ2YWxob3NhMRAwDgYDVQQIDAdBbGFiYW1hMQswCQYDVQQG
EwJQ
VDEgMB4GCSqGSIb3DQEJARYRZ2VyYWxAb25pZGVzay5jb20wHhcNMTkwNjI4MDI0
NjU0WhcNMjAwNjI3MDI0NjU0WjCBjjEUMBIGA1UEAwwLb25pZGVzay5jb20xEzAR
BgNVBAoMCk9uaWRlc2sgVEkxCzAJBgNVBAsMAlRJMRMwEQYDVQQHDApDYXJ2YW
xo
b3NhMRAwDgYDVQQIDAdBbGFiYW1hMQswCQYDVQQGEwJQVDEgMB4GCSqGSIb3
DQEJ
ARYRZ2VyYWxAb25pZGVzay5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC9Yn2V3jlqrze4XooYsJad7Y9uQVL5Pk0KmSSQDAjrPnJ18hd43XMaJP7G
xAg4J0dUHqItXC7CkgpbYdTeT46KkTYGXk9TkUAO2LUiXlZOPBhWCWUZWKo+DpG6
dlRdyeXbLWiNASO7bJNIeor8rbQhNQAM2E/KWSCk5chTAqzKcSiON3HV6NQiGR7u
Y4aNBqPz7SiIVPqzxlQUJbkG7J4AHoMz39c4KEpz/QkGISoMJObPKfaTISTGSfDD
iWqFhIRq14xGo55IxBxYxO9DnxIgE/fksJR6asg6HRNY0CgBG5uJKQi1lvQOLiLO
RJlU8p1u9ygxSLe341xDPn2IEMIbAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAEMo
ZwwwJ7V71nbqopvKi+OYX6fKT/2pvmMhHyAQUp3qPvJZFnGYFDdcnkob+Rw+XSDm
SiMgOMRB4ZZ/pdRHY7h/8UPkiUa8lsddTfGcS2+ECyX1jO5kqDKNKp5X2u/26As8
9rwDpuc2YTlwXM36EBKGHwSX+mRfj0Uv2P15QqEYe+VBsksH4oA9HyMQXdU6dhcS
Vf2asVyge10JyO58z9x6PFZynZsS0fcnkWoQKtRguKjWVvltdd6HnSVRiwkRBk+c
tBfTG3yeFEIy4m9PMogAT93D9OLUNMXOezVTBF/nfj7UI3t3ceYypEiOlJr1dYMs
mpIsoAbnI7qfjOl4MQ8=
-----END CERTIFICATE-----
Para aderir ao serviço no portal das finanças, copiar e cole o CSR
na caixa de texto e clique Aderir, aceitando os termos.
76
6.3- Certificado digital para ambiente de testes e produção
A AT fará a validação do CSR e enviará a resposta para o Operador
Económico via email anexando um ficheiro .zip contendo o
certificado digital .cer e as chaves públicas da entidade
certificadora .p7b. Fonte: AT
77
Flowchart com o procedimento do pedido para certificado digital
Aceite os termos e clique em Aderir. Se o seu CSR estiver correto e
for posteriormente aceite pela AT, será enviado ao seu email o
Certificado Digital, num ficheiro .zip , que incluirá os ficheiros
seguintes:
No portal das Finanças, o seu pedido de adesão terá o aspeto
seguinte:
Após o envio resposta positiva da AT como é o caso, a atribuição
do Certificado Digital permite agora criar ligações usando o
servidor de testes da AT para o efeito.
78
Também os certificados ao webservice de teste , estão acessíveis
na secção Produtores de Software.
Clique em “Testar Webservice” . Desloque o rato até ao final da
página na secção certificados .
Ou obtenha diretamente clicando neste link.
O arquivo no formato zipado que obteve , tem o seguinte aspeto:
79
6.4- Gerar chaves ciptográficas com OpenSSL
Como já vimos atrás , podemos facilmente gerar facilmente um
CSR numa site online para o efeito.
Trando-se de dados tão sensíveis, como são as infomações fiscais,
dados pessoais de clientes e toda a envolvencia de negócio, não
podemos descurar a segurança e usar uma simples aplicação web
para gerar certificados.
Para criar aplicações, formar solicitações webservice e outras
necessidades de qualquer ordem que necessitem obedecer a
princípios em que o trânsito de dados tenha de ser efetuado de
forma segura, o PHP compreende algumas livrarias nesse âmbito.
OpenSSL (Open Secure Socket Layer Protocol)
Pode instalar o OpenSSL no seu computador e optar por executar
todo o tipo de comandos a partir do MS-DOS , ou na bash em
Linux.
Pode fazer aqui o download do OpenSSL para Windows .
Ou instalar em Linux , usando o comando
sudo apt-get install openssl
No entanto pode realizar todo o tipo de operações a partir do
código fonte.
Consulte o manual PHP, para visualizar alguns exemplos .
80
6.5- Configurar OpenSSL no PHP
Seja qual for a versão que usa ou o tipo de servidor, a
configuração é sempre semelhante.
Edite o ficheiro php.ini .
Edite com o notepad no windows ou se é utilizador do Linux ,
execute o seguinte comando :
sudo nano /etc/php5/apache2/php.ini
Procure a linha extension_dir
A partir da versão PHP7 essa linha passou a chamar-se apenas
extension = php_openssl.dll
Remova o ponto e vírgula (;) antes e reinicie o servidor.
81
Existem ainda mais dois ficheiros onde é possível realizar
configurações, mas que usualmente já vêm pré-configuradas por
defeito no wamp server.
httpd.conf e httpd-ssl.conf.
Edite e construa as configurações à medida das suas necessidades.
Sempre que fizer alterações é necessário reiniciar o servidor para
que essas assumam efeito.
Certificados auto-assinados
Agora que já temos o OpenSSL instalado podemos facilmente gerar
um certificado auto-assinado. Chama-se assim, pois somos nós
próprios a fazer essa assinatura. Este tipo de certificados devem
apenas ser utilizados para testes, para uso em ambiente local ,
onde a preocupação com a segurança não é muito importante.
Evidente que se formos usar o certificado para fins credíveis, em
82
qualquer aplicação, convém que seja à posterióri uma entidade
credenciada a fazê-lo, duma das muitas empresas existentes no
mercado para esse efeito.
O comando seguinte cria o certificado com a chave pública e chave
privada:
C:\OpenSSL>openssl req -newkey rsa:1024 -nodes -keyout PrivateKey.pem -x509
-days 365 -out certPublic.pem
Se ao tentar executar o comando obtém o erro;
Unable to load config info from /usr/local/ssl/openssl.cnf
O windows não reconhece ficheiros de configuração na convenção
Unix, então temos de executar o comando informando a
localização do ficheiro openssl.cfg
C:\OpenSSL>openssl req -config "C:\OpenSSL\openssl.cnf" -new -newkey rsa:1024
-nodes -keyout PrivateKey.pem -x509 -days 365 -out certPublic.pem
83
Repare que na linha de comandos o comando é executado no
diretório onde o OpenSSL foi instalado, ou seja C:\OpenSSL
O certificado auto-assinado contém uma chave pública
(informações e uma assinatura do proprietário) e possui ainda uma
chave privada associada.
Depois de gerar um certificado auto-assinado , na aplicação de
servidor SSL, podemos visualizar o conteúdo e a própria chave
gerada:
C:\OpenSSL>opensslopenssl x509 -text -noout -in certPublic.pem
O resultado apresentado seria algo semelhante a seguir:
84
Podemos agrupar a chave privada e o certificado no mesmo
ficheiro, e para isso na criptografia usam-se ficheiros com a
extensão (.p12 ou pfx), ou seja agrupar no formato PKCS#12 .
C:\OpenSSL>openssl pkcs12 -inkey PrivateKey.pem -in certPublic.pem -export
-out BundleCert.pfx
Nessa altura será solicitado que indique uma password para o
agregar dos dados (bundle).
Depois da exportação do bundle , podemos verificar a integridade
do ficheiro de agrupamento gerado, usando:
C:\OpenSSL>openssl pkcs12 -in BundleCert.pfx -noout -info
Será solicitada a password que indicou no ato da exportação do
bundle. Se tudo correr devidamente obterá algo idêntico:
Fonte: IBM Knowledgebase
85
6.6- Operar com OpenSSL no código fonte
A linguagem de programação PHP, depois de efectuada a
configuração anterior, para accionar a DLL OpenSSL , permite-nos
operar um conjunto de funcções disponíveis na extensão.
Para que funcione correctamente no windows , outras duas
livrarias têm de estar presentes na pasta onde está instalado o
openssl; libeay32.dll, e apartir da versão OpenSSL 1.1, a libcrypto-
*.dll
Em Linux, para usar o OpenSSL , podemos usar o comando seguinte
para instalar o pacote de desenvolvimento:
sudo apt-get install libssl-dev
No windows , execute a linha de comandos, ms-dos em modo de
administrador. Entre no directório onde o php está instalado e
execute o código seguinte, já pré-gravado na pasta www.
Apenas servirá para verificar se a DLL foi bem carregada pelo PHP .
Se a instalação do OpenSSL existir em c:\OpenSSL executa o
ficheiro de configuração openssl.cfg
86
<?php
define ('nline', "\n");
if (!extension_loaded('openssl'))
die('Problemas ao carregar o modulo OpenSLL ...');
echo "APACHE MODULE LOADING ...OK". nline . nline;
echo "DLL Date ...".
$CONFIG['version_date'] = OPENSSL_VERSION_TEXT ;
echo nline;
echo "DLL Version ...".
$CONFIG['version_series'] = OPENSSL_VERSION_NUMBER ;
echo nline;
if(is_file($dir_openssl = "C:\OpenSSL\\openssl.cnf"))
echo exec( "c:\\WINDOWS\\system32\\notepad.exe $dir_openssl");
?>
Tendo a configuração do OpenSSL assegurada , estamos prontos
para iniciar o processo de encriptação via código, usando OpenSSL.
Abordaremos exemplos PHP , que implementam os vários tipos de
tecnologias apresentadas no capitulo 4.
Nessitamos de as entender para criar corretamente o protoloco
WSS já abordado também no capítulo 5 , na secção 5.2, que é
enviado no header SOAP , de forma a o webservice funcionar
devidamente. Uma boa prática é sempre ler e estudar os
exemplos apresentados no manual de OpenSSL do PHP.
87
Vamos começar então por analisar os requisítos necessários à
implementação da criptografia do header. No portal das finanças
encontramos um manual que é uma ajuda essencial a este desafio.
Analisemos a informação disponibilizada a seguir, para seguirmos
o processo corretamente.
Metodologia de encriptação cabeçalho SOAP da AT
Parâmetro Descrição Obr. Tipo de Dados
P.1 ) Username O utilizador definido como subutilizador no site
da AT de acordo com a estrutura
<NIF do emitente>/<UserID>
Exemplos possíveis:
String
1. 555555555/1 (subutilizador n.º 1)
2. 555555555/0002 (subutilizador n.º 2) Sim (validado pelo
3. 555555555/1234 (subutilizador n.º 1234) WSDL)
Chave simétrica gerada a cada pedido e para
cifrar o conteúdo dos campos P.3 - Password e
P.4 - Created.
Cada invocação do Webservice deverá conter
esta chave gerada aleatoriamente e a qual não
pode ser repetida.
Para garantir a confidencialidade, a chave
simétrica tem de ser cifrada com a chave pública
do Sistema de Autenticação de acordo com o
algoritmo RSA e codificada em Base 64. A chave
pública do sistema de autenticação do portal das
finanças deve ser obtida por solicitação própria e
através do endereço de email asi-cd@at.gov.pt.
O campo é construído de acordo com o seguinte
procedimento
Nonce := Base (C , Kpub (K ))
64 RSA SA S
P.2) Nonce
K := array de bytes com a chave simétrica de
S
Sim String (Base64)
88
128 bits, produzida de acordo com a norma AES.
C ,Kpub := Função de cifra da chave simétrica
RSA SA
com o algoritmo RSA utilizando a chave pública
do sistema de autenticação (KpubSA).
Base64 := Codificação em Base 64 do resultado.
O campo Password deverá conter a
senha do utilizador / subutilizador, a
mesma que é utilizada para entrar no
Portal das Finanças.
Esta Password tem de ser cifrada
através da chave simétrica do pedido
(ver campo Nonce) e codificado em
Base64.
P.3) Password Sim String (Base64)
64 SenhaPF := Senha do utilizador
definido no campo P.1 - Username;
C AES,ECB,PKCS 5 Padding := Função
K S
de cifra utilizando o algoritmo AES,
Modelo ECB, PKCS5Padding e a chave
simétrica do pedido Base64 :=
(KS).
Codificação em Base 64 do resultado
O campo Created deverá conter a data
e hora de sistema da aplicação que está
a invocar o webservice. Esta data é
usada para validação temporal do
pedido, pelo que é crucial que o sistema
da aplicação cliente tenha o seu relógio
certo. Sugere-se a sincronização com o
Observatório Astronómico de Lisboa:
89
http://www.oal.ul.pt/index.php?link=acerto
A zona temporal deste campo deverá estar
definida para UTC e formatado de acordo
com a norma ISO 8601 tal como é definido
pelo W3C: http://www.w3.org/QA/Tips/iso-
date http://www.w3.org/TR/NOTE-
datetime e.g.: 2013-01-01T19:20:30.45Z
Este campo é cifrado com a chave de
pedido (KS) e codificada em Base 64. :
P.4) Created Created := Base64 (C K S AES,ECB,PKCS 5 Sim
Padding
(TimeStamp))
Timestamp := data hora do sistema (UTC);
K AES,ECB,PKCS 5 Padding
S := Função de cifra utilizando o
algoritmo AES, Modelo ECB, PKCS5Padding e a chave simétrica
do pedido (KS).
Base64 := Codificação em Base 64 do resultado
Fonte: Autoridade Tributária
Seguindo o algoritmo apresentado, o primeiro passo será então:
• Gerar uma chave simétrica
• Assegurar que a cada invocação a chave é diferente
Usando openssl no PHP podemos conseguir isso usando a função
openssl_random_pseudo_bytes.
A função gera uma string aleatória de bytes.
O algoritmo pede uma chave de 128 bits. Sendo que 1 byte são 8
bits , o tamanho indicado será de 16 bytes.
90
É também indicado que o resultado seja codificado no formato
Base64:
Eis como construir isso em PHP:
Ao executar o código na linha de comandos, cada vez que o
executamos o resultado é diferente . A questão da aleatoriedade
da chave está de acordo com o que é solicitado no manual AT.
Para o nonce , outro dos requisitos é que a chave simétrica gerada
aleatoriamente, seja cifrada junto com a chave publica , de forma a
garantir a confidencialidade dos dados enviados.
91
Vamos usar o seguinte código PHP para obter a chave
pública a partir do certificado:
Executando o código pela linha de comandos , podemos visualizar
a chave pública.
Continuando a seguir as instruções do manual, para gerar o
Nonce, usaremos as funções openssl de forma a seguir o algoritmo
indicado e o código PHP seguinte, permite-nos obter a chave
simétrica cifrada em conjunto com a chave pública:
92
continua ...
CAPITULO 7
93
7. Criando um programa de faturação com PHP-MySQLi
Neste capítulo aprenderemos como desenvolver uma simples e funcional
aplicação para faturação.
O programa será capaz de registar dados de clientes, fornecedores, tipos de
impostos , faturas. Terá a possibilidade de editar e navegar sobre os registos
pré-gravados.
É ainda possível enviar documentos diretamente para a impressora ou fazer a
exportação via pdf.
7.1- Definindo a estrutura da Base de Dados
Uma boa prática no desenvolvimento de software é fazer um esboço daquilo
que pretendemos criar. Na prática este conceito usa-se a muitos domínios da
nossa vida diárias, desde a construção , arquitetura, medicina.
O conceptual antes do real, permite poupar muito tempo e recursos.
Não que tenhamos de fazer isso no papel, embora fosse suficiente.
Mas para uma melhor conceptualização, temos por sorte , disponível uma
ferramenta excelente que nos permite simular toda a dinâmica de
formulários,menus,botões, listas …
Vamos dividir o procedimento conceptual em duas fases:
– Dinâmica da aplicação
– Estrutura da Base de Dados (SGBD)
Baixe a aplicação que nos permite desenhar a aplicação. O Balsamic Mockups
dispõe de uma versão de experimentação com 30 dias.
A aplicação é simples de usar e intuitiva . Não vamos entrar em detalhe sobre
como usar o programa. Repare que basta arrastar os objectos necessários
para a área de trabalho do programa e começar estruturar a aplicação a seu
gosto.
Abaixo mostramos aspeto da interface produtos , tendo em conta a inclusão
dos campos obrigatórios para posterior criar do ficheiro SAFT.
Se consultar a estrutura verá que os elementos xml ProductType , ProductCode ,
ProductDescription e ProductNumberCode , estão comtemplados no formulário
abaixo.
94
Interface Produtos
continua ...
95
8 . SAFT(PT) Knowledge Base
8.1- TABELAS
Qualquer software de faturação existente faz a gestão e gravação
dos dados que fluem no programa gravando-o em tabelas.
Um bom critério para a co-existência do SAFT com a aplicação ,
será reproduzir ao máximo os elementos SAFT como campos das
tabelas, de forma a facilitar o correto preenchimento dos
elementos XML no ato de exportação.
Tabelas comuns obrigatórias:
• Cabeçalho (Header)
96
• Tabela de Clientes (Customer)
• Tabela de Impostos (TaxTable)
• Tabela de recibos - quando existem (Payments )
Tabelas obrigatórias para aplicações de faturação
• Tabela de Fornecedores (Supplier)
• Tabela de Produtos/Serviços (Product)
• Documentos comerciais a clientes (SalesInvoices)
• Documentos de movimentação de mercadorias
(MovementOfGoods)
• Documentos para conferência de mercadorias/ serviços
(WorkingDocuments)
8.2- RESTRIÇÕES
Para que o ficheiro seja exportado com qualidade e sem erros,
existem elementos no XML que devem cumprir determinadas
regras quando preenchidos, ou seja, estão sujeitos a restrições.
Apresentamos as principais a seguir:
Elemento Descritivo Tipos
TaxType Tipo de Imposto IVA | IS
TaxCode Código do Imposto RED|INT|NOR|ISE|OUT
TaxCountryRegion Sigla do país Exemplo: PT | PT-MA | PT-AC
AccountID Código da conta Desconhecido
ProductType Tipo de produto ou serviço Tipo de produto:
97
P - Produtos, S - Serviços, O - Outros,
I - Impostos, taxas e encargos
parafiscais
PaymentMechanism Método de pagamento Meio de pagamento: NU -
Numerário, CH - Cheque, CC -
Cartão de Crédito, CD - Cartão
de Débito, TB - Transferência
Bancária, TR - Ticket
Restaurante
TransactionType Tipos de Movimento Contabilístico Tipificação dos movimentos
contabilísticos - N - Normal, R -
Regularizações do período de
tributação, A - Apuramento de
resultados, J - Movimentos de
Ajustamento
SelfBillingIndicator Identificador de Auto-Facturação 1 | 0
InvoiceStatus Estado do documento N para Normal, A para Anulado,
F para Facturado, S para
autofacturação
Country Sigla do País Exemplo: PT | Desconhecido
CurrencyCode Código da moeda (ISO 4217) Exemplo: EUR
TaxAccountingBasis Tipo de sistema que exportou o SAFT C para Contabilidade, F para
Facturação, I para
Contabilidade-Facturação, P
para Facturação Parcial, S para
Autofacturação
CompanyID Identificação da empresa que exportou o Obtém-se pela concatenação da
SAFT Conservatória do Registo
Comercial com o número do
registo comercial separados
pelo carácter espaço. Nos casos
em que não existe o registo
comercial, deve ser indicado o
NIF.
98
InvoiceType Tipo de documento Tipos de Documento (FT-Factura,
FS-Factura simplificada, FR-Factura-
recibo, ND-Nota de débito, NC-Nota
de Crédito,VD-Venda a dinheiro, TV-
Talão de Venda,
TD-Talão de devolução,AA-
Alienação Activos,DA-Devolução
Activos, RP-Prémio ou Recibo
Prémio, RE-Estorno ou Recibo de
Estorno, CS-Imputação a Co-
Seguradoras,
LD-Imputação a Co-Seguradora
Líder, RA-Resseguro Aceite)
FiscalYear Ano Fiscal Data no formato ano
Exemplo: 2020
Legenda:
O símbolo | designa 'ou'
8.3- Expressões regulares (restrições)
As expressões regulares são métodos de validação que devem e
podem ser usados a partir duma linguagem de programação, para
impedir que um determinado elemento seja mal preenchido.
É um dos melhores métodos para que o ficheiro seja bem
produzido , reduzindo o número de erros por mau preenchimento.
Elemento Descritivo Expressão regular
99
TaxCode Código do Imposto Predefinido ou ([0-9.])*
AccountID Código da Conta ([1-8][0-9a-zA-Z]*)
InvoiceNo Código único do documento [^ ]+ [^/ ]+\/[0-9]+
Identificação da empresa que exportou (([0-9])+|([a-zA-Z0-9\-/_ ]+ [0-9]+)
o SAFT
CompanyID
ProductID Código do produto \w+(\s\w+)*/\w+(\s\w+)*
TransactionID Código do transação [1-9][0-9]{3}-[01][0-9]-[0-3][0-9] [^
]{1,30} [^ ]{1,20}
PostalCodePT Código Postal Português ([0-9]{4}-[0-9]{3})
DocArchivalNumber [^ ]{1,20}
FiscalYear Ano Fiscal (?:(?:20)[0-9]{2})
(anos 2000 até 2099)
No PHP use a ferramenta phpliveregex, para criar e testar as suas
próprias expressões regulares.
A título de exemplo, se desejarmos processar a validação do
elemento PostalCodePT, o código abaixo encarrega-se de verificar
se está no formato correto, e alertar o utilizador no acto do
preenchimento.
100