The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by geral, 2019-07-16 21:53:56

livro_Wook_Bertrand_Amazon

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


Click to View FlipBook Version