Baixar este arquivo PDF - Portal de Revistas UNIPLAC

Propaganda
UNIVERSIDADE DO PLANALTO CATARINENSE
DEPARTAMENTO DE CIÊNCIAS EXATAS E TECNOLÓGICAS
CURSO DE SISTEMAS DE INFORMAÇÃO
(BACHARELADO)
SEGURANÇA EM WEB SERVICES COM JAVA
FERNANDO LUIZ PARISOTTO
LAGES, NOVEMBRO DE 2006.
UNIVERSIDADE DO PLANALTO CATARINENSE
DEPARTAMENTO DE CIÊNCIAS EXATAS E TECNOLÓGICAS
CURSO DE SISTEMAS DE INFORMAÇÃO
(BACHARELADO)
SEGURANÇA EM WEB SERVICES COM JAVA
Relatório do Trabalho de Conclusão de
Curso submetido à Universidade do
Planalto Catarinense para obtenção dos
créditos da disciplina Trabalho de
Conclusão de Curso do curso de
Sistemas de Informação - Bacharelado.
FERNANDO LUIZ PARISOTTO
Orientador: Prof. Marcos André Pisching,
M.Sc.
LAGES, NOVEMBRO DE 2006.
SEGURANÇA EM WEB SERVICES COM JAVA
FERNANDO LUIZ PARISOTTO
ESTE RELATÓRIO, DO TRABALHO DE CONCLUSÃO DE CURSO, FOI
JULGADO ADEQUADO PARA OBTENÇÃO DOS CRÉDITOS DA
DISCIPLINA DE TRABALHO DE CONCLUSÃO DE CURSO DO VIII
SEMESTRE, OBRIGATÓRIA PARA OBTENÇÃO DO TÍTULO DE:
BACHAREL EM SISTEMAS DE INFORMAÇÃO
Prof. Marcos André Pisching, M.Sc.
Orientador
BANCA EXAMINADORA:
_________________________________ _________________________________
UNIPLAC
UNIPLAC
Prof. Angelo Augusto Frozza, Esp.
Professor de TCC
Prof. Wilson Castello Branco Neto, Dr.
Coordenador de Curso
Lages, 6 de dezembro de 2006.
Dedico este trabalho a minha noiva
Fernanda pelo amor e carinho, aos meus
pais Noelite e Ivo pelo apoio e a meu
amigo e orientador Marcos.
SUMÁRIO
LISTA DE ILUSTRAÇÕES ................................................................................... VIII
LISTA DE SIGLAS ...................................................................................................... X
RESUMO .................................................................................................................... XII
ABSTRACT ............................................................................................................. XIII
1 INTRODUÇÃO................................................................................................................ 1
1.1 Apresentação ............................................................................................................. 1
1.2 Descrição do problema .............................................................................................. 2
1.3 Justificativa ................................................................................................................ 3
1.4 Objetivo geral ............................................................................................................ 4
1.5 Objetivos específicos ................................................................................................. 4
1.6 Metodologia ............................................................................................................... 4
2 WEB SERVICES.............................................................................................................. 6
2.1 O que são Web Services? ........................................................................................... 6
2.2 Arquitetura dos Web Services, padrões e tecnologias ............................................. 10
2.3 Troca de Mensagens XML – SOAP ........................................................................ 11
2.4 Descrição dos Web Services – WSDL ..................................................................... 15
2.5 Publicação e descoberta do Web Service – UDDI ................................................... 19
2.6 Java Web Services ................................................................................................... 22
2.6.1 Java Web Services Developer Pack................................................................................. 23
2.6.2 Java API for XML Web Services ..................................................................................... 24
2.6.3 Java API for XML-Based RPC ........................................................................................ 24
2.6.4 Java API for XML Registries ........................................................................................... 25
2.6.5 Java Architecture for XML Binding ................................................................................ 25
2.6.6 SOAP with Attachments API for Java ............................................................................. 26
2.6.7 XML and Web Services Security ...................................................................................... 26
2.7 Conclusão ................................................................................................................ 26
3 SEGURANÇA EM WEB SERVICES ................................................................................ 28
3.1 Introdução ................................................................................................................ 28
3.2 Visão geral sobre segurança .................................................................................... 29
3.2.1 Identificação e autenticação ............................................................................................ 30
3.2.2 Autorização...................................................................................................................... 31
3.2.3 Integridade ...................................................................................................................... 32
3.2.4 Privacidade...................................................................................................................... 32
3.2.5 Não-repúdio ..................................................................................................................... 33
3.3 Técnicas e tecnologias de segurança ....................................................................... 33
3.3.1 Criptografia ..................................................................................................................... 34
3.3.2 Assinaturas digitais ......................................................................................................... 39
3.3.3 Certificados digitais ........................................................................................................ 41
3.4 Camadas de segurança em Web Services ................................................................ 43
3.4.1 Segurança sobre a camada de transporte ....................................................................... 44
3.4.2 Segurança sobre camada de mensagem .......................................................................... 47
3.5 Conclusão ................................................................................................................ 50
4 ANÁLISE E MODELAGEM DO SISTEMA ...................................................................... 52
4.1 Concepção ............................................................................................................... 52
4.2 Sumário executivo ................................................................................................... 52
4.3 Levantamento de requisitos ..................................................................................... 53
4.4 Lista de consultas .................................................................................................... 55
4.5 Requisitos suplementares ........................................................................................ 56
4.6 Organização de requisitos........................................................................................ 57
4.6.1 Listas de caso de uso ....................................................................................................... 57
4.6.2 Lista de conceitos e operações cadastrais ...................................................................... 57
4.7 Fase de elaboração ................................................................................................... 58
4.8 Fase do projeto......................................................................................................... 60
4.8.1 Descrição do sistema ....................................................................................................... 60
4.8.2 Arquitetura do sistema .................................................................................................... 61
4.8.3 Diagrama de classes........................................................................................................ 62
4.9 Padrões de projeto utilizados ................................................................................... 64
4.9.1 Session Fachade .............................................................................................................. 65
4.10 Conclusão .............................................................................................................. 66
5 DESENVOLVIMENTO E CONFIGURAÇÃO DO SISTEMA. ............................................. 68
5.1 Requisitos de software ............................................................................................. 68
5.2 Instalação e configuração do ambiente.................................................................... 69
5.2.1 Instalação do Java Standard Edition Developer Kit 5 e configuração das variáveis de
ambiente: ........................................................................................................................ 69
5.2.2 Instalação do PostgreSQL 8.1: ....................................................................................... 69
5.2.3 Instalação do eclipse 3.2: ................................................................................................ 69
5.2.4 Instalação do Sun Java System Application Server Platform Edition 9 ......................... 70
5.3 Codificação do sistema ............................................................................................ 71
5.3.1 Camada de domínio ......................................................................................................... 71
5.3.2 Fachada do sistema ......................................................................................................... 80
5.3.3 Camada de persistência................................................................................................... 82
5.4 Implementação da segurança ................................................................................... 91
5.4.1 Arquivo de segurança ...................................................................................................... 91
5.4.2 Codificação dos CallbackHandlers ................................................................................. 95
5.5 Arquivos de configuração do sistema.................................................................... 103
5.5.1 Arquivos do servidor ..................................................................................................... 103
5.5.2 Arquivos do cliente ........................................................................................................ 104
5.6 Desenvolvimento do cliente Web Service ............................................................. 105
5.7 Demonstração do ambiente ................................................................................... 108
5.7.1 Web Service não seguro ................................................................................................ 108
5.7.2 Web service seguro ........................................................................................................ 110
5.8 Conclusão .............................................................................................................. 113
6 CONSIDERAÇÕES FINAIS .......................................................................................... 115
REFERÊNCIAS BIBLIOGRÁFICAS .................................................................... 118
BIBLIOGRAFIA COMPLEMENTAR ................................................................... 121
APÊNDICE - ARTIGO ............................................................................................. 122
LISTA DE ILUSTRAÇÕES
FIGURA 1 FIGURA 2 FIGURA 3 FIGURA 4 FIGURA 5 FIGURA 6 FIGURA 7 FIGURA 8 FIGURA 9 FIGURA 10 FIGURA 11 FIGURA 12 FIGURA 13 -
Arquitetura dos Web Services. ............................................................ 10
Modelo de fluxo de um processo de requisição a um repositório
UDDI. .................................................................................................. 22
Criptografia simétrica. ......................................................................... 35
Criptografia assimétrica. ..................................................................... 37
Processo de Handshake. ...................................................................... 38
Processo de assinatura digital de um documento. ............................... 41
Processo de comunicação através do protocolo SSL. ......................... 44
Modelo de conceitual .......................................................................... 60
Arquitetura do sistema ........................................................................ 62
Diagrama de classe. ............................................................................. 63
Modelo lógico do banco de dados ....................................................... 64
Diagrama de classe do padrão Session Façade. .................................. 66
Imagem da janela principal do sistema. ............................................ 107
QUADRO 1 - Mensagem SOAP ................................................................................ 12
QUADRO 2 - Código de resposta a uma requisição SOAP com resultado falho. ..... 13
QUADRO 3 - Documento WSDL que apresenta um método sayHello por um Web
Service. ................................................................................................ 18
QUADRO 4 - Cadastro de Clientes ............................................................................ 54
QUADRO 5 - Cadastro de Produtos ........................................................................... 54
QUADRO 6 - Cadastro de Ordem de Compra ........................................................... 55
QUADRO 7 - Cadastro de Categoria ......................................................................... 55
QUADRO 8 - Lista de consultas ................................................................................ 56
QUADRO 9 - Requisitos suplementares .................................................................... 56
QUADRO 10 - Lista de caso de uso ............................................................................. 57
QUADRO 11 - Lista de operações cadastrais .............................................................. 58
QUADRO 12 - Expansão do caso de uso Ordem de Compra ...................................... 59
QUADRO 13 - Classe Endereço. ................................................................................. 73
QUADRO 14 - Implementação da classe Cliente. ....................................................... 75
QUADRO 15 - Implementação da classe Categoria. ................................................... 76
QUADRO 16 - Implementação da classe Produto. ...................................................... 77
QUADRO 17 - Implementação da classe OrdemCompra. ........................................... 78
QUADRO 18 - Implementação da classe ProdutoOrdemCompra. .............................. 79
QUADRO 19 - Interface que representa a Fachada do Cliente. ................................... 81
QUADRO 20 - Interface que representa a Fachada do Administrador. ....................... 81
QUADRO 21 - Arquivo de configuração da JPA, persistence.xml. ............................ 84
QUADRO 22 - Implementação do Web Service Administrador. ................................ 86
QUADRO 23 - Implementação do Web Service Cliente. ............................................ 89
QUADRO 24 - Arquivo de segurança do Web Service Administrador. ...................... 92
QUADRO 25 - Arquivo de segurança do Web Service Cliente................................... 93
QUADRO 26 - Implementação da classe SecurtyCallbackHandler. ........................... 97
QUADRO 27 - Implementação da classe DefaultSecurityHandler. ............................ 98
QUADRO 28 - Implementação da classe AdministradorSecurityHanler. ................. 100
QUADRO 29 - Implementação da classe ClienteSecurityHandler. ........................... 102
QUADRO 30 - Arquivo MANIFEST.MF do projeto Cliente. ................................... 105
QUADRO 31 - Quadro demonostrando a troca de mensagens não seguras. ............. 109
QUADRO 32 - Quadro demonstrando a troca de mensagens seguras. ...................... 110
LISTA DE SIGLAS
API
BSP
B2B
B2C
CA
CORBA
CRL
CRM
C2B
DAO
ERP
FTP
G2B
HTTP
HTTPS
IETF
ICP
IP
JAVA EE
JAXB
JAXR
JAX-RPC
JAX-WS
JAX-WSA
JWSDP
MIME
OASIS
OSI
PKI
PU
RCP
RDF
- Application Programming Interface
- Basic Security Profile
- Business to Business
- Business to Customer
- Certificate Authorities
- Common Object Request Broker Architeture
- Certificate Revocation List
- Customer Relationship Management
- Customer to Business
- Data Access Object
- Enterprise Resource Planning
- File Transfer Protocol
- Government to Business
- Hypertext Transfer Protocol
- HyperText Transfer Protocol Secure
- Internet Engineering Task Force
- Infraestrutura de Chave Pública
- Internet Protocol
- Java Enterprise Edition
- Java Architecture for XML Binding
- Java API for XML Registries
- Java API for XML-Based RPC
- Java API for XML Web Services
- Java API for XML Web Services Addressing
- Java Web Services Developer Pack
- Multipurpose Internet Mail Extensions
- Organization for the Advancement of Structured Information
Standards
- Open Systems Interconnection
- Public Key Infrastructure
- Processo Unificado
- Remote Procedure Call
- Resource Description Framework
REL
RMI
SAAJ
SAML
SMTP
SOAP
SSL
TCP
UDDI
UML
URL
WSDL
WS-I
W3C
XACML
XML
XWSS
- Rights Expression Language
- Remote Method Invocation
- SOAP with Attachments API for Java
- Security Assertion Markup Language
- Simple Mail Transfer Protocol
- Simple Object Access Protocol
- Secure Sockets Layer
- Transmission Control Protocol
- Universal Description, Discovery and Integration
- Unified Modeling Language
- Universal Resource Locator
- Web Services Description Language
- Web Services Interoperability
- World Wide Web Consortium
- eXtensible Access Control Markup Language
- eXtensible Markup Language
- XML Web Services Security
RESUMO
Web Services é a nova tendência para sistemas distribuídos que operam na Internet,
possibilitando uma arquitetura orientada a serviços, baixamente acoplada. Porém, para
a adoção desta tecnologia em ambientes corporativos, nos quais dados confidenciais
transitam em um cenário de e-commerce, é necessário garantir segurança, através de
confidencialidade nos dados trocados, autenticação das partes interessada e integridade
dos dados a serem transmitidos. De acordo com essas necessidades, este trabalho
apresenta um estudo sobre como garantir e oferecer a segurança em um sistema que
faz uso da tecnologia Web Services. O trabalho tem como objetivo principal apresentar
os principais conceitos da implementação de segurança em Web Services, e as
principais tecnologias envolvidas nesse processo, focando principalmente na
segurança sobre a camada de mensagem. Para isso, é demonstrado através de um
estudo de caso, um ambiente seguro com as tecnologias aplicadas, no qual é possível
distinguir a diferença entre uma transação com segurança em Web Services, e uma sem
segurança.
Palavras-chave: Web Services; Segurança; Java.
ABSTRACT
Web Services is the new trend for distributed systems that operate in the Internet, making
possible service oriented architecture, loosely coupled. However, for the adoption of this
technology in the corporative environment, where confidential data are transit in a scene of ecommerce, it is necessary to guarantee security, through confidentiality in exchanged data,
authentication of the interested parts and integrity of the data transmitted. In a accordance
with these needs, this work presents a study about how to guarantee and to offer the security
in a system that makes use of the Web Services technology. The work has a main objective to
present the main concepts in implementation of security in Web Services, and the main
involved technologies in this process, focus in message level security. For this, is
demonstrated, in a study of case, a secured environment with the applied technologies, where
it is possible to distinguish the difference enters a transaction with a safe Web Services to a
not safe.
Keywords: Web Services; Security; Java.
1 INTRODUÇÃO
1.1 Apresentação
Na época do surgimento da Internet, pouco se falava em negócios on-line,
pois era voltada mais para o ambiente acadêmico, pesquisas e troca de informações
entre instituições de ensino. Muitas das tecnologias conhecidas e utilizadas atualmente
não tinham sido elaboradas ou, então, eram apenas teorias.
Porém, nos últimos anos, nota-se que houve uma grande expansão no
comércio na Internet, com um movimento iniciado por empresas que decidiram
estender sua disponibilidade ao cliente para o mundo virtual, usando as vantagens que
a rede mundial de computadores oferece, como a disponibilidade de vinte e quatro
horas por dia e sete dias por semana e a comercialização global. Com isso, termos
como e-Business e e-Commerce surgiram no cotidiano das corporações comerciais.
A Internet é a maior rede de computadores do mundo, na qual vários
sistemas de várias plataformas operam conectados. Tendo em vista isso, as
corporações comerciais decidiram fazer uso dessa tecnologia para expandir suas
capacidades de negócio. Porém, para realizar este feito, estas precisam de tecnologias
que permitam que seus sistemas possam se conectar de modo transparente a este
ambiente e oferecer seus recursos para entidades interessadas.
Surge, então, à proposta da tecnologia de Web Services, que visa sanar essa
necessidade de integração de sistemas em um ambiente heterogêneo e distribuído. Web
Services são independentes de plataforma, linguagens de desenvolvimento e de
sistema operacional. Seu principal intuito é de integrar sistemas distintos, utilizando-se
dos padrões e protocolos de comunicação já existentes e operacionais na Internet.
A tecnologia de Web Services é uma ótima solução para integração de
sistemas coorporativos. Porém, quando se trata de sistemas que transportam
informações confidenciais que põem em risco as empresas se estas estiverem expostas,
cria-se a necessidade de utilizar metodologias e políticas de segurança para garantir
certo nível de confiabilidade nas transações realizadas por esses sistemas.
Este trabalho objetiva proporcionar um embasamento teórico das tecnologias
envolvidas no desenvolvimento de Web Services que utilizem metodologias de
segurança. Também visa exemplificar a implementação das tecnologias abordadas
aplicadas a um estudo de caso, tornando-o, assim, um guia prático para o
desenvolvimento de um sistema similar.
O presente trabalho está estruturado da seguinte forma: além deste capítulo
introdutório; o capítulo 2 apresenta um levantamento teórico sobre a tecnologia de
Web Services e sua integração com a plataforma Java; no capítulo 3 são apresentados
todos os conceitos e recursos relevantes para aplicação de segurança em Web Services;
no capítulo 4 é explorado o desenvolvimento do estudo de caso abordado pelo
trabalho, sua modelagem, arquitetura e implementação; no capítulo 5 é vista a
implementação do cliente do Web Service desenvolvido no capítulo anterior. Também
é abordada a sua modelagem e implementação. Após isso, são apresentados os
resultados obtidos por essa experiência. Por fim, no capítulo 6, são feitas as
considerações finais deste trabalho e recomendações para trabalhos futuros.
1.2 Descrição do problema
O uso da tecnologia de Web Services visa a integração de sistemas em um
ambiente heterogêneo de plataformas e arquiteturas. Porém, um dos principais
obstáculos para a adoção efetiva desta tecnologia é a segurança, pois Web Services
provêm uma interface do ambiente interno ao ambiente externo que possibilita às
entidades realizar operações que potencialmente podem expôr informações cruciais da
empresa e sua privacidade, tornando vulnerável à ataques a dados. Assim sendo, uma
grande preocupação no uso de Web Service é como garantir e oferecer um determinado
nível de segurança de acordo com o tipo de informação que é transmitida pela rede.
1.3 Justificativa
Atualmente, o mundo dos negócios vem confiando cada vez mais na Internet
como sendo o principal meio de transporte para comunicações e transações comerciais.
Para que estas comunicações aconteçam, é necessário construir aplicações cada vez
mais seguras e que atendam às necessidades deste tipo de ambiente distribuído.
Uma aplicação segura deve manter mecanismos que garantam a segurança
dos dados por ela manipulados. Como Web Services são sistemas que atuam na
Internet, que por sua vez é um ambiente heterogêneo e oferece altos riscos de
segurança, deve-se enfatizar o uso de técnicas que garantem a confiabilidade das
transações efetuadas por esses sistemas.
Vale ressaltar que: “Uma das grandes vantagens do SOAP é que, ao usar a
porta 80 do HTTP, você pode enviar requisições diretamente através de firewall!
Entretanto, uma das grandes desvantagens do SOAP é que ao usar a porta 80 do
HTTP, você pode enviar requisições diretamente através do firewall!” (HENDRICKS
et al., 2002).
Com esta afirmação, HENDRICKS et al. (2002) enfatiza que uma das
principais vantagens desta arquitetura de sistemas distribuídos é a total
interoperabilidade do sistema no ambiente Web. Em contra partida, isso se torna um
ponto crítico na confiabilidade do sistema devido ao nível de exposição ao meio
externo, pois não há outros mecanismos que ofereçam segurança além do firewall (o
protocolo SOAP é abordado no capítulo 3 sobre Web Services, no qual dará maior
sentido para esta afirmação).
Segundo Eve Maler (SUN MICROSYSTEMS, 2005), presidente do Security
Work Plan Working Group of WS-I (Web Services Interoperability Organization), em
uma entrevista a equipe da Sun Developer Network, ela afirma que o que mais falta
agora é um modo padrão de negociar os obstáculos de segurança que os serviços de
requisições e respostas irão aderir.
Devido a esse tipo de necessidade, justifica-se o estudo realizado por este
trabalho, pois as organizações que farão uso desse tipo de tecnologia precisam de um
sistema que atue em um ambiente seguro.
1.4 Objetivo geral
O objetivo geral deste trabalho é apresentar os principais recursos utilizados
para definir métodos e políticas de segurança em Web Services aplicados a um estudo
de caso.
1.5 Objetivos específicos
a) Apresentar os principais padrões envolvidos na especificação de Web Services;
b) Levantar os principais recursos para aplicação de segurança em Web Services;
c) Desenvolver um Web Service utilizando os recursos de segurança apresentados
pelo estudo realizado;
d) Demostrar a interação dos clientes com o serviço implementado num ambiente
seguro.
1.6 Metodologia
O estudo começa com um levantamento bibliográfico e reconhecimento do
tema a ser abordado.
Foi produzido o projeto do Trabalho de Conclusão de Curso, pelo qual foi
introduzido o conhecimento superficial sobre Web Services, Internet para negócios e
segurança. Também foi apresentado o problema que o trabalho tratou, seu objetivo e a
justificativa da realização do mesmo.
O próximo passo trata de em abordar a tecnologia de Web Service e sua
utilidade no ambiente coorporativo. É ser especificados os conceitos da tecnologia,
seus padrões e protocolos. Após a conclusão do levantamento teórico, serão
apresentados os recursos que a plataforma Java oferece para o desenvolvimento de
Web Services.
Em seguida, foram apresentadas as metodologias e políticas de segurança na
utilização de Web Services. Para tal, foi feita uma breve introdução da tecnologia e
apresentados os conceitos de segurança relevantes para aplicações que utilizem Web
Services. Depois, são abordados os recursos disponíveis para o desenvolvimento de
Web Services que implementem os requisitos de segurança anteriormente definidos.
Foi desenvolvido um estudo de caso voltado à indústria madeireira do
Planalto Catarinense, que aborda todo o conteúdo teórico levantado até o momento.
Após isso é apresentado a modelagem do sistema e sua arquitetura.
Com a conclusão da modelagem, foi iniciada a implementação do sistema,
que consiste em implementar os Web Services e seus clientes, todos aplicados em um
ambiente seguro.
Finalizada
a
implementação,
foram
apresentados
os
resultados
e
considerações finais e, também, a demonstração do sistema atuando no ambiente
seguro.
2 WEB SERVICES
Este capítulo apresenta uma introdução aos principais conceitos da
tecnologia Web Service, sua arquitetura, pilha de protocolos envolvidos. Após, são
abordadas as três principais camadas dos Web Services: mensagens, descrição e
descoberta. E, finalmente, são introduzidas as principais tecnologias Java para
construção de aplicações Web Services.
2.1 O que são Web Services?
O conceito principal de Web Services é simples, consiste em Chamadas de
Procedimento Remoto ou, como é mais comumente conhecido, RPC (Remote
Procedure Calls). Web Service não é a primeira tecnologia a implementar essa
funcionalidade (CORBA e Java/RMI (Remote Method Invocation) também provêem
RPC), porém é diferente das tecnologias já existentes.
Web Service é independente de linguagem de programação e sistema
operacional por usar padrões abertos e consolidados tais como HTTP (HyperText
Transfer Protocol) e XML (eXtensible Markup Language), com isso o desenvolvedor
não precisa saber se o serviço foi implementado em Java ou se será acessado pela
plataforma .NET da Microsoft, porém, diferente de CORBA, que necessita de portas e
protocolos especificos para operar, Web Services opera no protocolo HTTP da rede
TCP/IP o que o torna mais adaptavel para Internet.
Em 1999, a Hewlett-Packard tornou-se a primeira empresa de software a
introduzir o conceito de Web Services. A HP introduziu o produto e-Speak, uma
plataforma que possibilitava aos desenvolvedores produzir e programar os e-services,
programas similares a Web Services. Entretanto a natureza proprietária do e-Speak o
impossibilitou de ganhar espaço e simpatia da indústria de software.
Foi a Microsoft quem cunhou o termo Web Services em junho de 2000,
quando a mesma introduzia os Web Services como componentes chave de sua
plataforma .NET, com intuito de abraçar a Internet para o desenvolvimento,
engenharia e usabilidade do software. A Microsoft anunciou que estava apostando
todas as suas fixas nessa tecnologia, em seguida os Web Services tornou-se a grande
novidade (DEITEL et al. 2003).
Os principais objetivos da tecnologia Web Services são (DEITEL et al.
2003):
 Solucionar o problema da interoperabilidade através do uso de uma plataforma
neutra e remover o antagonismo existente;
 Criar uma camada de abstração entre nodos heterogêneos em uma rede;
 Ser extremamente acessível por todas as plataformas através do uso de protocolos
da Internet e XML, isto é, permitir que um sistema desenvolvido em Java rodando
em uma plataforma Solaris se comunique com um sistema .NET operando em
plataforma Windows;
 Permitir a interoperabilidade entre quaisquer tipos de sistemas, não somente entre
sistemas ERP (Enterprise Resource Planning), sistemas CRM (Customer
Relationship Management) e base de dados relacionais;
 Prover solução de sobre passo em firewalls, assim permitindo que qualquer cliente
consiga acessar o serviço;
 Tirar proveito da redução na comunicação e nos custos dos servidores que não
possuíam um bom custo/benefício anos atrás;
 Argumentar em prol do desenvolvimento de sistemas como um conjunto de
serviços distribuídos e não como um componente que é executado dentro de um
único processo.
O W3C Web Service Architecture Working Group (W3C, 2006a), que é o
grupo responsável pelo desenvolvimento de novas especificações para tecnologia Web
Services estabeleceu a seguinte definição para serviços Web:
Um Web Services é um software designado a suportar interoperabilidade e integração entre
máquina-a-máquina por uma rede. Através de uma interface descrita da máquina
(especificação WSDL). Outros sistemas interagem com o Web Services pela interface de
descrição usando mensagens SOAP, usando HTTP com serialização de XML em um
conjunto de outros padrões Web (W3C, 2006a).
Porém, uma definição mais simples pode ser útil para a compreensão da
tecnologia: um Web Service é uma aplicação acessível pela Web (ou em uma Intranet)
por um endereço (URL) e que pode ser acessado por clientes usando protocolos
baseados em XML (como SOAP), enviados através de protocolos da Internet já
consolidados (como o HTTP). Os clientes acessam este serviço através de interfaces
de mapeamento e especificação disponibilizadas pelo serviço (como o WSDL).
Web Services é um agrupamento de tecnologias padronizadas que, reunidas,
representam o seu comportamento e funcionalidade. O uso desses meios é que obtém
uma tecnologia que proporciona completa interoperabilidade entre plataformas e
sistemas distintos. Essa tecnologia foi desenvolvida com a base de conhecimento já
obtido por CORBA, Java/RMI, habilitando a comunicação e interoperabilidade entre
aplicações, provendo um meio padronizado de aplicações expor suas funcionalidades
na Web e de comunicar entre outros sistemas.
Web Services oferece uma série de vantagens como tecnologia, o que a torna
segura para o investimento, devido o amplo suporte da comunidade desenvolvedora e
certa garantia de continuidade da tecnologia. As principais vantagens dos Web
Services são (DEITEL et al. 2003):
 Interoperabilidade em um ambiente heterogêneo – permitir que os serviços
rodem em diferentes tipos de plataformas e arquiteturas, que o software seja
escrito em diferentes tipos de linguagens de programação, e que sistemas
diferentes facilmente se comuniquem e interajam uns com os outros;
 Disponibilização dos serviços para a rede (Internet ou Intranet) – a
aplicação pode fazer uso das vantagens da utilização da Web para a sua
operação, dando para a empresa uma vantagem comercial no seu negócio,
disponibilizando seus serviços para os clientes;
 Integração entre sistemas já existentes – a maioria das empresas têm dados
armazenados em seus sistemas legados e para elas não é uma opção viável
abandonar essas informações armazenadas durante a sua existência
comercial em troca de uma atualização na sua plataforma. Web Services
permitem que essas informações legadas possam ser usadas com
transparência
em
novos
sistemas
desenvolvidos.
Web
Services
disponibilizam para os desenvolvedores um meio padronizado para acessar
sistemas legados como bancos de dados e sistemas antigos e os integrá-los
com novas aplicações, com isso não há a necessidade de aprendizado de
novas tecnologias para a expansão do sistema;
 Liberdade de escolha – Web Services é de um padrão aberto e com um
grande suporte por empresas de desenvolvimento e comunidades, que
provêem ferramentas, produtos e tecnologias para o desenvolvimento. Isso
fornece uma ampla variedade de escolha, que dá a possibilidade de escolher
melhor o ambiente conforme os requisitos do sistema a ser desenvolvido;
 Suporte a mais clientes – não importa se os clientes usam Java ou a
plataforma .NET da Microsoft, todos podem fazer uso de Web Services.
Aumenta o conjunto de possíveis clientes da aplicação, criando novas
oportunidades de negócio.
 Produtividade – aplicações devem ser desenvolvidas rapidamente, devem
passar de protótipos para sistemas de produção e, mesmo após a sua entrega
devem continuar evoluindo. Web Services eliminam vários contratempos na
produção de software distribuídos e na integração entre ambientes legados.
Tornando assim mais fácil para a equipe de desenvolvimento se concentrar
na resolução do problema do cliente ao invés de aprender outras linguagens
de programação para integrar o sistema ou então migrar os sistemas já
existentes em produção para a nova plataforma imposta.
2.2 Arquitetura dos Web Services, padrões e tecnologias
Web Services é um conjunto de tecnologias integradas, esta seção visa
esclarecer o modelo desta tecnologia, suas partes e como estas funcionam juntas. Para
melhor compreensão da tecnologia, a Figura 1 mostra modelo conceitual dos Web
Services:
FIGURA 1 - Arquitetura dos Web Services.
(HENDRIKCS et al., 2002)
O modelo destaca três entidades e suas operações (HENDRICKS et al.,
2002):
 Provedor de serviços – é o servidor do serviço, é quem o disponibiliza na
Web. Tem a obrigação de descrever o serviço por ele disponibilizado de
forma padronizada, que seja compreensível por qualquer outra entidade
interessada na sua utilização. Após isso pronto o provedor precisa publicar
os detalhes de seu serviço em um registro central que está disponível para
todas as entidades que possivelmente irão o acessá-lo;
 Consumidor de serviço – é quem usa o Web Service, o cliente do serviço. O
consumidor pode obter as informações do serviço a ele interessado através
de uma pesquisa no registro onde o serviço está publicado. Neste, também é
possível obter informações de vínculo do serviço, isto é, o seu exato
endereço na Web para poder acessá-lo;
 Registro dos serviços – é o local onde os provedores de serviços publicam
informações sobre seus serviços, conseqüentemente, é também o local onde
os consumidores de serviços buscam informações sobre os serviços a eles
interessados. Tipicamente, informações como detalhes da empresa, Web
Services por ela fornecidos e detalhes sobre cada serviço Web, inclusive
detalhes técnicos, são armazenadas no registro do serviço. O registro de
serviços fornece duas funcionalidades aos seus clientes, uma para pesquisa
de serviços nele contido e outra para postagem de um novo serviço em seu
repositório.
2.3 Troca de Mensagens XML – SOAP
Segundo a recomendação W3C (2006a), SOAP 1.2, é um protocolo que visa
à troca de informações em um ambiente descentralizado e distribuído. Usa a
tecnologia XML para definir um framework de troca de mensagens extensível onde se
pode construir e trocar mensagens sobre uma variedade de protocolos. Este framework
foi desenvolvido para ser independente de qualquer modelo de programação ou
semântica (W3C, 2006a).
SOAP (Simple Object Access Protocol) fornece a objetos desconhecidos um
meio de se comunicarem através de troca de mensagens. SOAP é um protocolo
baseado em texto que usa a tecnologia XML para codificar mensagens e transmiti-las
através da Web (HTTP, FTP, SMTP e outros). SOAP é independente de linguagem de
programação e de plataforma e não requisita nenhuma tecnologia para seu
funcionamento.
Antes da existência da tecnologia Web Services aplicações comunicavam-se
através de outras tecnologias de objetos distribuídos, como CORBA. Utilizar essas
tecnologias de RPC na Internet representa um problema de segurança. Firewalls e
proxys bloqueiam este tipo de fluxo na rede, trancando as suas portas de comunicação,
tornando impossível a operação. A melhor solução para este problema era usar um
protocolo que não fosse interferido por firewalls, como o HTTP ou o SMTP (Simple
Mail Transfer Protocol), que são suportados por todas as redes.
Uma mensagem SOAP é codificada em um documento XML, a sua sintaxe é
simples e contém as seguintes partes (HENDRICKS et a., 2002):
 SOAP Envelope: é o envelope principal, define o conteúdo da mensagem e
os vários namespaces que são usados pelo resto da mensagem, incluindo
xmlns:SOAP-ENV (SOAP Evelope) visto linha 6 do Quadro 1.
 SOAP Header (opcional): é o cabeçalho da mensagem, contém informação a
respeito de autenticação, transação e contabilização, visto na linha 7 do
Quadro 1.
 SOAP Body: é o corpo da mensagem, contém informação a respeito de
métodos e parâmetros a serem chamados ou respostas enviadas. Quando
SOAP é utilizado como RPC, esta parte possui um único elemento que
contém o nome do método, parâmetros e a identificação do serviço,
representado na linha 12 do Quadro 1.
O código do Quadro 1 apresenta uma requisição SOAP a um método de um
Web Service utilizando o protocolo HTTP.
QUADRO 1 - Mensagem SOAP
1
2
3
4
5
6
7
8
9
10
11
12
POST /soap/servlet/rpcrouter HTTP/1.0
Host: localhost:8070
Content-Type: text/xml
Content-Length: 461
SOAPAction: ""
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<n:alertcontrol xmlns:n="http://example.org/alertcontrol">
<n:priority>1</n:priority>
<n:expires>2001-06-22T14:00:00-05:00</n:expires>
</n:alertcontrol>
</env:Header>
13
14
15
16
17
18
<env:Body>
<m:alert env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:m="http://example.org/alert">
<m:msg>Fazer compras para o almoço.</m:msg>
</m:alert>
</env:Body>
19
</env:Envelope>
O Quadro 1 mostra o exemplo de como uma mensagem SOAP é codificada
em XML e, também, alguns elementos e atributos fundamentais em um documento
SOAP. Todas as mensagens SOAP devem ter um elemento Envelope que deve ter
definido dois namespace, um para o envelope SOAP (xmlns:SOAP-ENV linha 6) e
outro para indicar o estilo de codificação (SOAP-ENV:encodingStyle linha 14). Uma
mensagem SOAP sem essas duas definições é considerada inválida. O atributo
encodingStyle é o que define as regras de serialização da mensagem SOAP, regras
essas que dizem como a mensagem deve ser transformada em bits e enviada para rede.
O elemento opcional Header (cabeçalho, linha 7) se for usado, deve de ser o
primeiro filho após o elemento Envelope. O elemento Header provê um meio
adicionar atributos como autenticação e transação a uma mensagem SOAP, também se
pode definir como essa mensagem deverá ser tratada.
O elemento Body (corpo, linha 13) que deve estar presente em todas as
mensagens SOAP, deve ser inserido logo após o elemento Header, se este existir. Este
elemento contém as informações da atual requisição, como a chamada dos métodos e é
também neste elemento que serão enviados os dados de resposta da requisição. O
elemento Fault (erro, na linha 3 do Quadro 2) do elemento Body (linha 2 do Quadro 2)
provê um mecanismo de tratamento de erro nas requisições do serviço.
QUADRO 2 - Código de resposta a uma requisição SOAP com resultado falho.
1
2
3
4
5
6
7
8
9
10
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns0="urn:HelloService"
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<env:Body>
<env:Fault>
<faultcode>env:Client</faultcode>
<faultstring>
JAXRPCTIE01: caught exception while handling
request: unrecognized operation: sayHello
</faultstring>
</env:Fault>
</env:Body>
</env:Envelope>
SOAP é um protocolo que troca mensagens em apenas um sentido, isto é, as
mensagens que são transmitidas não são requisições que necessitam de resposta, são
apenas mensagens que contém dados a serem enviados a um fim. Entretanto, o SOAP
possibilita a construção de padrões de interações complexos, como por exemplo,
requisição/resposta ou requisição/múltiplas-respostas.
SOAP oferece ao desenvolvedor uma série de características que facilitam a
fase de desenvolvimento de um Web Service (HENDRICKS et. al., 2002):
 Framework para troca de mensagens - Utilizando XML é possível a
construção de um framework padrão para troca de mensagens SOAP entre o
consumidor e o provedor, que facilita o desenvolvimento abstraindo a
manipulação complexa de documentos XML;
 Protocolos de transporte - SOAP é um padrão que independe do tipo de
protocolo de transporte. Ele pode ser transportado por diferentes tipos de
protocolos de mais baixo nível, como por exemplo, SMTP, FTP e o mais
utilizado HTTP;
 Múltiplos padrões de mensagens - Apesar das mensagens SOAP serem de
um único sentido é possível combiná-las de modo a criar diversos padrões
de interação. Por exemplo, é possível combinar dois tipos de mensagens de
tal forma que elas atuem como um de requisição e resposta. Além disso,
SOAP pode ser utilizado para a transmissão de documentos XML, e também
na transmissão de anexos através de mensagens SOAP com especificações
de anexos. Esse último modelo de transmissão de dados, denominado de
pacote da mensagem SOAP pela especificação, utiliza o MIME
(Multipurpose Internet Mail Extensions) para descrever como o pacote da
mensagem SOAP será construído;
 Regras para codificação de dados - SOAP utiliza XML Schemas para definir
tipos de dados simples e compostos para todos os elementos dentro da
mensagem SOAP. Através de XML Schemas podem-se converter os tipos
de uma linguagem de programação local para um tipo especificado no XML
Schema;
 Roteamento de mensagens e processamento intermediário - Essa capacidade
existe em virtude de existir dentro da mensagem SOAP partes especiais
(headers) em que se podem inserir pré-requisitos para a mensagem e
questão seja processada por um nodo. Sendo assim, caso a mensagem
chegue a um nodo SOAP que não possui os requisitos definidos na
mensagem ela não será processada. Quando uma mensagem com essa
especificação não é executada no nodo com as devidas características elas
são encaminhadas para intermediários que atendam esses requisitos, estes
são responsáveis por processar blocos especiais do cabeçalho que são
invocados antes do processamento da mensagem principal. Além disso,
podem ser ligados a outros intermediários para criar um workflow;
2.4 Descrição dos Web Services – WSDL
Segundo o grupo do Working Draft da WSDL, a linguagem de descrição de
Web Services (WSDL) provê um modelo em formato XML para descrever um Web
Service. WSDL habilita a separação da descrição da funcionalidade do serviço,
oferecendo detalhes concretos do serviço, “como acessá-lo” e “onde acessá-lo” (W3C,
2006b).
O WSDL descreve três componentes básicos dos serviços
Web
(MARQUEZAN, 2004):
 Tipos de dados – a WSDL tem a capacidade de abstrair os tipos de dados
usados pelo Web Service através de XML Schemas definidos pelo
desenvolvedor, com esta flexibilidade é possível especificar os tipos de
dados manipulados pelo Web Service conforme a necessidade e modelagem
da aplicação;
 Operações – cada operação descrita no documento WSDL oferece uma
interface ao método disponibilizado pelo Web Service. Nesta descrição são
especificados os parâmetros de entrada e saída e seus tipos de dados;
 Protocolo de ligação – no documento WSDL também é descrito os
protocolos inferiores utilizados pelo Web Service (transporte e mensagem).
WSDL não ignora os protocolos que estão abaixo dele, nem considera que
somente um tipo de tecnologia é utilizado nessas camadas inferiores. Ele
permite que esses protocolos sejam especificados. Essa flexibilidade do
WSDL permite que desenvolvedores ou outro software que esteja utilizando
as descrições WSDL possam prover diferentes protocolos de ligação
concretos para as operações definidas em WSDL;
O documento WSDL é composto de definições para descrever um serviço,
existem dois tipos de definições: as concretas e as abstratas (MARQUEZAN, 2004):
 Definições concretas – são constituídas por elementos especificam como é
feito acesso ao serviço através da rede, ou seja, definem uma URL, o tipo de
protocolo usado na camada de mensagem (por exemplo, SOAP ou XMLRPC) e o protocolo da camada de transporte (por exemplo, HTTP ou
SMTP). A definição concreta é composta pelos seguintes elementos:
 Serviços (service, linha 42 do Quadro 3) - são elementos que
constituem uma coleção de portas que especificam os terminais para
um serviço (por exemplo, um listener SOAP), existirá somente uma
definição de serviço em um serviço Web, embora seja possível a
existência de mais de uma definição em um documento WSDL;
 Portas (port, linha 43 do Quadro 3) - elemento que especifica o
endereço de um terminal e o elemento de ligação para ser usado com
o endereço. Cada porta possui um tipo de porta associada e uma
descrição abstrata dessa porta. É importante ressaltar que o conceito
de porta utilizado em WSDL não é o mesmo conceito utilizado em
TCP/IP;
 Ligação (binding, linha 30 do Quadro 3) – é o elemento específico de
um protocolo de transporte e o formato dos dados para as operações, e
mensagens abstratas definidas para um tipo de porta abstrata.
 Definições abstratas - estão relacionadas com os elementos que compreendem a
descrição lógica de um serviço, proporcionando a descrição completa dos métodos
e parâmetros associados a esse serviço. A definição abstrata é composta pelos
seguintes elementos:
 Tipos de portas (portType, linha 24 do Quadro 3) - elemento constitui
uma coleção de operações que compõem o serviço Web, atuando
como se fosse uma API para esse serviço;
 Mensagens (message, linha 18 e 21 do Quadro 3) - elemento é
responsável por agrupar os parâmetros de um método. Ele descreve
uma mensagem, mesmo que essa mensagem seja uma requisição ou
uma resposta;
 Partes (part, linha 19 e 22 do Quadro 3) - elemento provê os detalhes
da definição abstrata de mensagem. Ele define o tipo de dado de cada
"parte” da mensagem, utilizando para isso os tipos de dados
pertencentes esquemas pré-definidos (esquemas padrão do XML,
WSDL tipos, tipos de ligação SOAP, HTTP ou MIME) ou então os
definidos pelos usuários e especificados dentro do documento WSDL;
 Tipos (type, linha 4 do Quadro 3) - elemento descreve todos os tipos
de dados utilizados no documento WSDL. Se o serviço que está sendo
descrito utiliza somente esquemas XML baseados em tipos de dados
simples, como por exemplo, strings ou inteiros, o elemento type não
é necessário.
A definição operação, é a definição responsável por fazer a ligação entre os
grupos de definição abstratas e concretas. As operações fazem o mapeamento entre
essas definições. Sob a perspectiva abstrata, o elemento operation define os métodos
de um Web Service, isso representa que para cada método definido há uma operação
associada. Pelo ponto de vista da definição concreta as operações definem as camadas
de transporte e de mensagem utilizadas pelo Web Service.
As operações também definem o comportamento de cada método de um
serviço Web, abaixo são apresentados os quatro padrões de operações especificados
em WSDL (MARQUEZAN, 2004).
 One-way: o serviço recebe a mensagem. Dessa forma, a operação define um
único elemento de entrada.
 Requisição/Resposta: o serviço recebe uma mensagem e envia uma
mensagem correlacionada. Essa operação possui um elemento de entrada,
seguida de um elemento de saída.
 Solicitação/Resposta: o serviço envia uma mensagem e recebe uma
mensagem correlacionada. Essa operação possui um elemento de saída,
seguida de um elemento de entrada.
 Notificação: o serviço envia uma mensagem. A operação define um único
elemento de saída.
QUADRO 3 - Documento WSDL que apresenta um método sayHello por um Web Service.
1
<?xml version="1.0" encoding="UTF-8"?>
2
3
<definitions name="NewWebService"
targetNamespace="urn:NewWebService/wsdl"
xmlns:tns="urn:NewWebService/wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns2="urn:NewWebService/types"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
4
5
6
7
8
<types>
<schema targetNamespace="urn:NewWebService/types"
xmlns:tns="urn:NewWebService/types"
xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="sayHello">
<sequence/>
</complexType>
9
10
11
12
13
14
15
16
17
<complexType name="sayHelloResponse">
<sequence>
<element name="result" type="string" nillable="true"/>
</sequence>
</complexType>
<element name="sayHello" type="tns:sayHello"/>
<element name="sayHelloResponse" type="tns:sayHelloResponse"/>
</schema>
</types>
18
19
20
<message name="NewWebServiceSEI_sayHello">
<part name="parameters" element="ns2:sayHello"/>
</message>
21
22
23
<message name="NewWebServiceSEI_sayHelloResponse">
<part name="result" element="ns2:sayHelloResponse"/>
</message>
24
<portType name="NewWebServiceSEI">
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<operation name="sayHello">
<input message="tns:NewWebServiceSEI_sayHello"/>
<output message="tns:NewWebServiceSEI_sayHelloResponse"/>
</operation>
</portType>
<binding name="NewWebServiceSEIBinding" type="tns:NewWebServiceSEI">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="sayHello">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
44
45
46
<service name="NewWebService">
<port name="NewWebServiceSEIPort"
binding="tns:NewWebServiceSEIBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</port>
</service>
47
</definitions>
2.5 Publicação e descoberta do Web Service – UDDI
O protocolo UDDI (Universal Description, Discovery and Integration), é um
dos blocos essenciais para o sucesso dos Web Services. UDDI cria um padrão de
interoperabilidade entre as aplicações, que as habilita rapidamente a achar e usar Web
Services disponíveis na Internet. Também disponibiliza registros operacionais para
serem mantidos para diferentes propósitos e contextos. UDDI é um esforço dirigido
pelas principais indústrias de software e, também, por empresas de e-business
liderados pelo consórcio OASIS (UDDI, 2006).
O UDDI é um repositório de registros baseados na Web que fornecem
informações a respeito de uma organização ou entidade que publicou seu serviço Web.
Estes registros são executados em múltiplos servidores (operadores) e podem ser
usados por qualquer um que queira tornar disponíveis informações a respeito de
negócios ou entidades, ou ainda, por qualquer um que queira buscar estas informações.
A informação contida em um documento WSDL é complementar a
informação contida em um registro UDDI. UDDI não armazena ou suporta um
documento WSDL, ele descreve o serviço de forma diferente. Quatro tipos de dados
podem ser encontrados em um registro UDDI (BECKER, CLARO e SOBRAL, 2003):
 businessService: fornece informações sobre uma organização e pode conter
um ou mais businessService;
 businessEntity: fornece informações técnicas e descrições de serviço, que
pode conter um ou mais bindingTemplate;
 bindingTemplate: contém uma referência a um ou mais tModels;
 tModel: utilizado para definições de especificações técnicas de serviço.
A informação fornecida por um registro UDDI pode ser comparada à uma
lista telefônica. As páginas brancas (white pages), fornecem informações tais como
nome da organização, contato e identificadores. As páginas amarelas (yellow pages)
são compostas por um índice de serviços e produtos e as páginas verdes (green pages)
contém informações a respeito de transações, descrições de serviço e invocação de
aplicações (BECKER, CLARO e SOBRAL, 2003).
A UDDI é uma especificação em constante evolução e desenvolvimento, este
processo é coordenado pela UDDI.ORG que é uma organização composta por
empresas como Microsoft, IBM, Ariba, Sun, Oracle e HP. Esta especificação fornece
uma API para consulta e publicação de serviços em registros UDDI. A consulta e
publicação em registros UDDI é executada utilizando-se mensagens no formato
SOAP. Estas operações são baseadas na especificação de uma API proposta por
UDDI.ORG e possuem mensagens específicas para a busca, publicação e alteração de
registros (HENDRICKS et al., 2002).
As principais vantagens da proposta UDDI são, universabilidade, descrição,
descoberta, integração (DEITEL et al., 2003):
 Universalidade – UDDI utiliza da mesma tecnologia XML como SOAP e
WSDL, tornando-o assim universal e legível para qualquer plataforma que
entenda essa tecnologia. UDDI é um serviço que permite que provedores e
consumidores se comuniquem e troquem informações sobre serviços a
serem disponibilizados ou então utilizados. Uma requisição ao registro
UDDI é efetuada pelo seu cliente (provedor ou consumidor) e em seguida
uma resposta à requisição é enviada, essa resposta é encapsulada em um
envelope SOAP. Sendo assim, UDDI utiliza toda a infra-estrutura já
existente para garantir a universalidade;
 Descrição – UDDI descreve o serviço especificando as interfaces,
ferramentas protocolos e tipos de valores do mesmo, além disso, também
descreve as funcionalidades do Web Service. A descrição das variáveis e
seus tipos e valores não descreve o sentido da existência do Web Service,
isto é, o seu propósito. A capacidade de descrição da tecnologia UDDI se dá
pela utilização de palavras-chave e pequenas tags de descrição,
possibilitando que se informe a todos exatamente o que o serviço pode
oferecer tanto no sentido de quais são os dados disponíveis, como de quais
são os melhores dados a serem utilizados para o serviço em questão;
 Descoberta – UDDI oferece mecanismos de busca para descoberta de
serviços nele publicado. Buscas como por palavra-chave relativa ao que se
deseja encontrar, retornando assim uma lista de resultado relevante.
Também é possível que se examine a pequena descrição existente em cada
registro dos serviços listados pela busca, permitindo que se tenha certeza
que um serviço listado está realmente de acordo com os requisitos do
consumidor desse serviço. Essa tecnologia possui APIs para listagem de
serviços pertencentes a um registro, assim como para a inserção de um
serviço no mesmo;
 Integração – o repositório facilita a integração entre sistemas através de
todas as operações UDDI, sendo assim tornando possível que aplicações
obtenham maior funcionalidade utilizando Web Services registrados no
repositório.
FIGURA 2 - Modelo de fluxo de um processo de requisição a um repositório UDDI.
(FONTE: Web Service Architecture. W3C, 2006b. Documento que define a arquitetura da tecnologia
Web Service. Disponível em < http://www.w3.org/TR/2004/NOTE-ws-arch-20040211/#gengag>.
Acesso em: 15 jan. 2006).
A Figura 2 apresenta o modelo de fluxo de mensagens e comunicação entre o
repositório UDDI o provedor (Web Service) e consumidor (cliente):
(1) Passo um:
(a) Provedor disponibiliza no repositório o seu serviço;
(b) Cliente requisita ao repositório uma pesquisa de serviços (através de
SOAP);
(c) Repositório retorna a descrição do serviço (documento WSDL).
(2) Provedor e cliente concordam com a mesma semântica do serviço.
(3) Cliente ou provedor constroem uma mensagem para seu destinatário
obedecendo à semântica;
(4) Ocorre a interação e troca de mensagens entre o provedor e consumidor;
2.6 Java Web Services
A plataforma Java Enterprise Edition (Java EE) disponibiliza uma série de
recursos para o desenvolvimento de aplicações que utilizem a tecnologia Web
Services. Nesta seção é feita uma breve descrição destas tecnologias e suas
funcionalidades.
2.6.1 Java Web Services Developer Pack
O Java WSDP ou então Kit de desenvolvimento de Web Services para Java,
é um conjunto integrado de ferramentas para o desenvolvimento, teste e implantação
de aplicações para Web, aplicações baseadas em XML e Web Services, com as últimas
implementações dos padrões Web Services para a plataforma Java. A sua versão atual
é a 2.0, que inclui ferramentas que tornam o desenvolvedor capaz de (SUN
MICROSYSTEMS, 2006i):
 Desenvolver e implantar aplicações usando as últimas tecnologias XML e
Web Services, incluindo suporte para a plataforma de aplicações da SUN
Microsystems;
 Aumentar o desempenho de Web Services desenvolvidos com a versão 1.6
do Java WSDP, sem a necessidade de nenhuma alteração no código da
aplicação;
 Criar aplicações baseadas em XML e Web Services que utilizem os padrões
de segurança XML Web Services Security;
 Aproveitar do uso da plataforma Java para desenvolver aplicações Web
Services, sua interoperabilidade e toda sua infra-estrutura já existente;
 Simplificação e redução de custos na integração de aplicações legadas, na
troca de dados e na publicação de recursos e serviços na Web.
O lançamento da versão 2.0 do Java WSDP contém as novas
implementações de tecnologias já existentes em versões anteriores do Java WSDP,
como: JAX-WS 2.0 (Java API for XML Web Services), JAXB 2.0 (Java API for XML
Binding) e SAAJ 1.3 (SOAP with Attachments API for Java), este conjunto de
tecnologias é chamado de integrated stack (pilha integrada) para Web Sevices. Juntos
esses três componentes representam uma nova arquitetura para desenvolvimento que
estabelece uma maior lógica entre os relacionamentos da descrição de Web Services,
ligação dos dados do serviço e processamento de SOAP com anexos.
O resultado disso é uma plataforma de desenvolvimento ágil, fácil, mais
eficiente e mais reusavel. Entretanto para compatibilidade de aplicações desenvolvidas
com versões anteriores o JAX-RPC (Java API for XML-Based RPC) também foi
incluído no pacote. O intuito da tecnologia JAX-WS é a substituição do JAX-RPC.
Também foi incluída nessa versão uma tecnologia experimental, JAX-WSA (Java API
for Web Services Addressing) que é a implementação da especificação WS-Addressing
da W3C (SUN MICROSYSTEMS, 2006i).
2.6.2 Java API for XML Web Services
A API Java para XML e Web Services (JAX-WS) é o centro da nova
arquitetura do Java WSDP, também conhecida como pilha integrada (integrated
stack), isto inclui o JAX-WS 2.0, JAXB 2.0 e SAAJ 1.3. A pilha integrada representa a
arquitetura lógica das funcionalidades dos Web Services. O JAX-WS foi desenvolvido
para tomar o lugar da tecnologia JAX-RPC nas aplicações Web que fazem uso de Web
Services.
Em versões anteriores do Java WSDP havia um problema no mapeamento
de dados XML para a aplicação, pois o JAX-RPC provia um mapeamento fraco de
dados, comparado ao JAXB, pois o JAX-RPC incluía o mapeamento básico dos tipos,
enquanto o JAXB podia mapear XML Schemas, o que torna mais fácil separar as
definições Web Services dos componentes da aplicação. O resultado disso é uma
arquitetura de desenvolvimento fácil de entender, desenvolver e de incorporar essa
tecnologia na aplicação (SUN MICROSYSTEMS, 2006b).
2.6.3 Java API for XML-Based RPC
O JAX-RPC é útil para o desenvolvimento de aplicações Web e Web
Services, incorporando a elas funcionalidades chamadas de procedimentos remotos
baseados em XML, de acordo com a especificação SOAP 1.1.
Entretanto, com o lançamento do Java WSDP 2.0 é melhor começar um
planejamento de migração para as novas tecnologias, como JAX-WS 2.0, JAXB 2.0 e
SAAJ 1.3 que são mais modernas, fáceis de programar e completamente integradas.
Porém a implementação do JAX-RPC será continuada e disponível no Java WSDP por
motivos de compatibilidade de aplicações antigas e, também, para facilitar o processo
de migração e transição para a nova tecnologia (SUN MICROSYSTEMS, 2006c).
2.6.4 Java API for XML Registries
A API Java para Registros XML (JAXR) provê um meio uniforme e
padronizado para o acesso de diferentes tipos de registros XML. Um registro XML é
uma estrutura capas de construir, implantar e descobrir Web Services.
Atualmente, existe uma variedade de especificações para registros XML,
incluindo ebXML (desenvolvido pela OASIS e U.N./CEFACT) e a especificação
UDDI. JAXR habilita os desenvolvedores Java a usar uma única API de fácil uso para
acessar uma variedade de registros XML, através de modelos que descrevem o
conteúdo contido em um registro XML. Também provê capacidades de classificação,
associação e consulta. A atual versão do JAXR inclui suporte detalhado ao ebXML e a
especificação UDDI 2.0 (SUN MICROSYSTEMS, 2006a).
2.6.5 Java Architecture for XML Binding
Arquitetura Java para ligamento XML (JAXB) provê um modo conveniente
de ligar um XML Schema a uma representação em código Java. Isto torna mais fácil
incorporar dados XML e funções para o seu processamento em aplicações Java sem
precisar saber muito sobre o XML em si. JAXB 2.0 está disponível no Java WSDP
2.0, faz parte da pilha integrada de tecnologias para desenvolvimento de Web Services.
Esta nova versão do JAXB inclui todas as funcionalidades de ligamento de XML em
um único pacote, enquanto na versão anterior era necessário trabalhar também com
JAX-RPC. A pilha de integrada de tecnologias (JAX-WS 2.0, JAXB 2.0 e SAAJ 1.3) é
uma arquitetura mais lógica, fácil e habilita o desenvolvimento de Web Service e
aplicações Web mais facilmente (SUN MICROSYSTEMS, 2006d).
2.6.6 SOAP with Attachments API for Java
A API Java para SOAP com anexos (SAAJ) prove um meio padronizado
para enviar e processar documentos SOAP com anexos pela Internet através da
plataforma Java. A atual versão do SAAJ é a 1.3 que está contida no pacote Java
WSDP 2.0 (SUN MICROSYSTEMS, 2006f).
2.6.7 XML and Web Services Security
Segurança em XML e Web Services (XWS-Security) é um framework que
faz parte do Java WSDP. Este provê um meio a desenvolvedores de aplicar segurança
em aplicações desenvolvidas com JAX-RPC, JAX-WS ou SAAJ, através de
conFigurações de políticas de segurança de requisição e resposta no nível de serviço,
porta ou operação. Esta implementação de XWS-Security provê segurança para Web
Services no nível de mensagem. Este framework implementa os padrões de segurança
em Web Services (WSS) propostos pela OASIS (SUN MICROSYSTEMS, 2006j).
2.7 Conclusão
A tecnologia de Web Services é um agregado de outras tecnologias, padrões
e protocolos que permitem a interoperabilidade entre sistemas distintos em um
ambiente heterogêneo. A arquitetura dos Web Services é baseada na arquitetura
cliente/servidor, que opera sobre requisições e respostas, as transmissões são feitas
pela Internet, entre um ponto a outro. O processo de trocas de mensagens entre o
provedor e o consumidor é realizado por um documento XML baseado no protocolo
SOAP que normalmente é transmitido sobre o protocolo HTTP. Este documento
trafega pela rede em texto plano até chegar ao receptor, estando passivo à
interceptação e leitura de seus dados por qualquer nó da rede que faça parte do
caminho a ser percorrido para alcançar o destinatário. Para evitar essa falha de
segurança é necessário estudar meios de aplicar técnicas de segurança no processo de
comunicação, para que este garanta a procedência, integridade e sigilo das
informações.
Neste capítulo se obteve o primeiro objetivo específico do trabalho, que é
apresentar os principais padrões envolvidos na especificação de Web Services. Com
isso, foram apresentandos dois componentes dos Web Services muito importantes para
o desenvolvimento do trabalho, o protocolo SOAP que é no qual são aplicadas as
políticas de segurança para o Web Services, e o WSDL, no qual estão contidos
informações descritoras sobre o serviço. Essas informações são necessárias para a
aplicação da segurança em determinadas operações expostas pelo Web Service.
Também, neste capítulo, foi possível perceber onde que as falhas de segurança são
encontradas na arquitetura.
3 SEGURANÇA EM WEB SERVICES
Este capítulo aborda as principais técnicas e tecnologias de segurança que
podem ser aplicadas em Web Services. A princípio é feita uma introdução teoria sobre
conceitos de segurança em uma aplicação, isto é, o que a torna segura ou não. Após,
são introduzidas as principais técnicas que podem ser usadas para garantir segurança
em uma aplicação, em conjunto com as tecnologias que as implementam. E,
finalmente, são citadas as principais organizações responsáveis pelo desenvolvimento
de tecnologias de segurança para Web Services e o que está disponível para a
plataforma Java.
3.1 Introdução
Confome o que já foi apresentado no capítulo anterior, Web Services é um
conjunto de tecnologias que podem reduzir a complexidade e custo na construção de
aplicações voltadas a negócios corporativos e, também, permitir novos modelos de
aplicações distribuídas.
Empresas que se interessam em trazer os Web Services para dentro de sua
arquitetura tem como fator de desmotivação a segurança, pois a intenção da tecnologia
Web Services é expor serviços ao ambiente externo. Segurança é importante para
qualquer nível organizacional em que o sistema atua, principalmente se este sistema
realiza transações sobre a Internet. Garantir a segurança nos Web Services é crucial
para adoção dessa tecnologia em um ambiente coorporativo, por razões de privacidade
financeiras, legislativas e de confiabilidade. Por isso, os Web Services precisam de
uma camada especial que garanta a segurança às transações por eles efetuadas.
Por que a necessidade de um nível especial de segurança para Web Services?
Por que não utilizar tecnologias já existentes e consolidadas na Internet como SSL
(Secure Sockets Layer), que é o mecanismo de segurança mais utilizado para
aplicações e-commerce? A resposta a essas perguntas é que a tecnologia Web Services
requer um nível de segurança fim-a-fim, ao invés do ponto-a-ponto que é provido pelo
SSL.
Uma segurança ponto-a-ponto é definida como segurança máquina-amáquina, isto é, a segurança é obtida no processo de comunicação de duas entidades
na rede. Deduz-se, então, que a segurança é aplicada no processo de transporte da
mensagem e não na mensagem em si, que é o caso da segurança fim-a-fim, que aplica
segurança no nível da mensagem (SUN MICROSYSTEMS, 2006i).
Web Services trabalham com trocas de mensagens. Elas podem ser de destino
ponto-a-ponto, como, por exemplo, uma requisição de um cliente e a resposta de um
servidor. Porém, também podem operar sobre a troca de mensagens fim-a-fim, onde
um cliente faz requisição a um serviço e este por sua vez se torna cliente de outro
serviço, que faz requisições a outro serviço utilizando os dados do cliente. Neste
cenário é impossível definir um meio de segurança ponto-a-ponto, pois a mensagem
utiliza de vários serviços para ser concluída e devolvida ao cliente.
3.2 Visão geral sobre segurança
Segundo HENDRICKS et al, (2002), o W3C (World Wide Web Consortium)
considera três grupos de riscos de segurança relacionados a aplicações na Internet:
 Segurança no servidor: falhas ou problemas na configuração do servidor.
Que permitam aos usuários remotos não autorizados se apropriem de
documentos confidenciais. Que executem comandos ou ações no servidor
que lhes dêem liberdade de modificar o sistema do servidor. Que obtenham
informações confidenciais do servidor que lhes permitam invadir o sistema;
 Segurança no cliente: conteúdo ativo que danifica e trava o sistema do
cliente, viola sua privacidade ou apenas lhe causa aborrecimentos;
 Segurança na rede: interceptação de dados enviados na rede pelo cliente ao
servidor ou vice-versa através de escuta clandestina da rede. Tornando
possível que os invasores operem através de qualquer ponto na trajetória da
rede entre o cliente e o servidor;
Para minimizar essas falhas, devem-se tomar vários cuidados ao se
disponibilizar uma aplicação na Web. Tais como atualizações de software e de sistema
operacional, utilização de um firewall, configuração adequada, entre outros. Para que
uma aplicação Web seja considerada segura, esta deve implementar alguns (se não
todos) serviços de segurança. Através desses serviços que se define a segurança em
uma aplicação. São seis requisitos que uma aplicação segura deve oferecer: identidade
e autenticação, autorização, integridade, privacidade e não-repúdio (HENDRICKS et
al., 2002).
3.2.1 Identificação e autenticação
Segundo HENDRICKS et al. (2002), a identificação e a autenticação lançam
uma pergunta a ser respondida pelo serviço de segurança: quem é você e como se sabe
se a sua identidade é legítima?
Através de informações como nome de usuário (login) e senha (password)
que se pode definir a identidade de um usuário remoto, baseado em uma base de dados
sobre usuários, pode-se fazer uma verificação ou pesquisa onde se procura um usuário
previamente cadastrado que condiz com as informações obtidas da requisição. Esse é o
processo mais comum de autenticação de um usuário, através de senhas.
Porém há outras tecnologias em desenvolvimento que possibilitam a
autenticação e identificação de usuários utilizando-se da biometria. Segundo a
enciclopédia virtual livre Wikipédia biometria é o estudo estatístico das características
físicas ou comportamentais dos seres vivos. Recentemente este termo também foi
associado à medida de características físicas ou comportamentais das pessoas como
forma de identificá-las unicamente. (http://pt.wikipedia.org/wiki/Biometria) Métodos
como
impressão
digital,
reconhecimento
da
face,
identificação
pela
íris,
reconhecimento
pela
retina,
reconhecimento
de
voz,
geometria
da
mão,
reconhecimento da assinatura e reconhecimento da digitação, podem ser usados como
recursos para a identificação e autenticação de pessoas ou usuários em um sistema.
Este é o ponto de entrada ao sistema, onde se verifica quem pode entrar ou
não. Caso a autenticação seja bem sucedida, o usuário pode prosseguir para a próxima
etapa que seria a autorização, caso contrário, o sistema rejeitará a tentativa da entrada e
opcionalmente poderá registrar a tentativa de acesso, obtendo informações sobre quem
a realizou para futuramente, caso haja necessidade de uma auditoria ou o não-repúdio.
3.2.2 Autorização
Segundo HENDRICKS et al, (2002), um serviço de autorização deve
responder à pergunta: você tem permissão para acessar esses dados/executar essa
transação?
Depois de efetuada a identificação e autenticação do usuário, este passa pelo
processo de autorização, que permite ou não o acesso a determinado recurso ou
sistema. Cada sistema possui a sua própria política de autorização, implementada
conforme sua necessidade.
Normalmente, usuários são definidos em grupos em um sistema, e a esses
grupos que são atribuídas certas permissões de execução ou acesso. Também outros
sistemas possibilitam atribuir permissões diretamente a usuários, tornando-os distintos
de outros usuários do mesmo grupo.
Outro esquema de permissões é através de papéis. Onde não existem
usuários ou grupos, apenas papéis em um sistema. A esses papéis são definidas
permissões, tais como: conectar, executar, administrar, recursos e outros. Nesse
esquema de papéis, um papel pode ser passivo ou não de conexão, o que pode ser
similar a um usuário ou um grupo, esse papel pode ter várias permissões e restrições
atribuídas a ele. Outros papéis podem ser criados por meio de herança, baseando-se em
um papel já existente e herdando todas suas características, o que é similar a um grupo.
3.2.3 Integridade
Segundo HENDRICKS et al, (2002), o serviço de integridade responde a
pergunta: os dados que você me enviou são os mesmos que eu recebi?
O serviço de integridade tenta garantir que os dados não sejam alterados ou
corrompidos durante o processo de transporte, em relação a sua fonte original. Como é
sabido, a Internet é um ambiente inseguro, ela não oferece garantia de integridade dos
dados que nela trafegam. Por isso, é essencial um mecanismo que garanta tal
integridade dos dados.
A uma série de tecnologias que tentam resolver esse problema, muitas delas
utilizam criptografia ou assinaturas digitais. No contexto de Web Services, vários
recursos e especificações foram desenvolvidos para implementar esse serviço de
segurança nesse tipo de aplicação. Como Web Services faz uso extenso de XML para
transportar suas mensagens, a melhor técnica de aplicar segurança é nessa camada da
sua arquitetura.
O W3C especificou desenvolveu o padrão que visa aplicar assinatura digital
em um documento XML. XML Signature é definido pelo seu Working Group (grupo
de trabalho responsável pelo desenvolvimento de uma especificação no W3C) como
um conjunto de sintaxes e de regras de processamento para criação e representação de
assinaturas digitais em documentos XML (W3C, 2006c).
3.2.4 Privacidade
Ninguém leu os dados que trocamos? Essa pergunta é respondida pelo
serviço de privacidade de uma aplicação. Uma comunicação privada é uma
comunicação em que somente os interessados podem ler os dados transmitidos por ela.
É essencial que se ofereça confidencialidade em uma comunicação privada. Como, por
exemplo, em uma transação on-line em um site de compras, onde é informado o
número do cartão de crédito do cliente, esse tipo de transação requer uma privacidade
de dados pessoais, segundo HENDRICKS et al. (2002), onde informações relativas à
pessoa não podem ser lidas por outros.
Também há outro cenário, como uma conversa através de um sistema de
bate-papo on-line, onde não se é desejado que a troca de mensagem seja interceptada e
lida por outras pessoas, esse tipo de situação é definido por HENDRICKS et al, (2002)
como privacidade de comunicação pessoal.
A criptografia é usada em larga escala para suprir a necessidade de
privacidade nas comunicações. O W3C desenvolveu o padrão que visa aplicar
criptografia em um documento XML. XML Encryption, segundo os representantes
deste Working Group, tem como objetivo desenvolver um processo de criptografar e
decriptografar um documento XML ou parte dele, usando sintaxe XML para
representação de conteúdo criptografado e de informações que possibilitem a
decriptografia deste documento (W3C, 2006d).
3.2.5 Não-repúdio
Segundo HENDRICKS et al. (2002), um serviço de não-repúdio deve estar
capacitado a responder a seguinte pergunta: como provar para terceiros que você
enviou os dados para eles – e recebeu – dados idênticos?
O serviço de não-repúdio procura provar a existência de uma transação ou
troca de informações através de subsídios gerados por esse serviço. Não-repúdio é um
meio de monitorar tudo o que acontece no sistema, para que sejam geradas evidências
de todos os eventos ocorrentes.
Um exemplo claro disso é um sistema de logging em um aplicativo Web,
onde, que cada requisição externa gera um registro de ocorrência e é informado quem
está requisitando tal serviço. Porém, há uma necessidade de validar tais informações
para que estas não possam ser forjadas ou declaradas falsas por falta de autenticidade.
Um meio de resolver esse problema é fazendo uso de assinaturas digitais, certificadas
e validadas por uma autoridade certificadora.
3.3 Técnicas e tecnologias de segurança
Através da implementação dos serviços de segurança uma aplicação, sendo
ela voltada para Web ou não pode ser considerada segura. Porém, para implementar
esses serviços é necessário o uso de tecnologia que forneçam meio para atender os
requisitos impostos por esses serviços. Atualmente, várias técnicas e tecnologias foram
ou estão sendo desenvolvidas para prover meio de segurança em uma aplicação.
Vários institutos de normalização técnica como IETF (Internet Engineering Task
Force), W3C (World Wide Web Consortium) e OASIS (Organization for the
Advancement of Structured Information Standards) fornecem padrões e especificações
para aplicar segurança no ambiente da Internet de um meio interoperável.
Cada serviço de segurança necessita de uma ou mais tecnologias para ser
implementado na aplicação. Privacidade necessita de criptografia, não-repúdio
necessita de logging e assinatura digital, integridade também necessita de assinatura
digital, autorização pode usar certificados digitais associados a identificação e
autenticação.
3.3.1 Criptografia
A Criptografia é a ciência que trata da preservação dos dados privados. Na terminologia
criptográfica, esses dados são chamados de textos simples ou puros. A codificação dos
dados, de maneira que os dados tornem-se ininteligíveis para os que venham a interceptálos, é chamada de criptografia. Esses dados criptografados são chamados de texto cifrado
(ciphertext). O processo de reconversão do texto cifrado para texto puro é chamado de
descriptografia. A criptografia e a descriptografia geralmente usa uma chave, sendo que o
método de codificação exige que se conheça a chave certa, para que a descriptografia possa
ser executada (HENDRICKS et al., 2002).
Algoritmos criptográficos funcionam baseados em chaves para efetuar a
criptografia e a decriptografia. Há duas classes de algoritmos e o que difere entre eles
são as chaves que estes usam para efetuar sua tarefa (HENDRICKS et al. 2002):
 Algoritmos simétricos: a peculiaridade dos algoritmos simétricos para
criptografia é que os mesmos utilizam da mesma chave para o processo de
criptografia e descriptografia, essa chave secreta deve ser compartilhada
entre todos os interessados;
 Algoritmos assimétricos: funciona baseado no princípio de duas chaves, a
chave pública e a chave privada, uma chave para criptografia e outra para
desriptografia. Onde a privada não é compartilhada e a pública sim;
3.3.1.1 Criptografia simétrica
O processo de criptografia simétrica é simples, há um emissor que deseja
enviar uma mensagem secreta ao receptor, o emissor escreve a mensagem, criptografa
a mesma com a chave secreta que ambos (emissor e receptor) conhecem. Após isso, o
emissor envia a mensagem criptografada ao receptor, este por sua vez, após receber a
mensagem a decriptografa. Este processo é ilustrado na Figura 3.
FIGURA 3 - Criptografia simétrica.
(HENDRICKS et al., 2002)
A criptografia simétrica foi o primeiro método concebido para criptografar
dados. Segundo DEITEL et al. (2003), a primeira cultura a fazer uso da criptografia
foi a cultura egípcia. Estes trocavam mensagens escritas a mão e aplicavam algoritmos
de criptografia sobre essas mensagens. Este povo utilizava de dois tipos de algoritmos
de criptografia simétrica, o algoritmo de substituição e algoritmos de transposição.
Os algoritmos de substituição são algoritmos simples para gerar textos
cifrados por meio de substituição de silabas, por exemplo, toda letra “a” é substituída
pela letra “b” e toda letra “b” é substituída pela letra “c” e assim consecutivamente, a
palavra “security” criptografada sobre esse algoritmo ficaria “tfdvsjuz”.
Os algoritmos de transposição trabalham da seguinte forma, toda palavra a
ser criptografada gerará duas palavras cifradas. Por exemplo, com a palavra “security”
a primeira letra é “s”, esta será a primeira letra da primeira palavra, a segunda letra é
“e” e será a primeira letra da segunda palavra, a terceira letra é “c” e será a segunda
letra da primeira palavra, e assim consecutivamente. O resultado da palavra “security”
criptografada com algoritmo simétrico de transposição seria “scrt euiy”.
Estes são apenas algoritmos criptográficos similares aos primeiros a serem
utilizados, de fácil compreensão para seres humanos e que são aplicados sobre textos e
caracteres. Os meios modernos de se aplicar criptografia a documentos eletrônicos são
digitais, trabalham diretamente com bits ou blocos de bits do documento. Utilizam
algoritmos complexos de criptografia a baixo nível, e a sua chave é caracterizada pelo
seu tamanho em bits, por exemplo, 128-bits ou 256-bits de tamanho da chave.
Nestes níveis, um computador moderno de bom desempenho poderia levar
um bom tempo para descobrir o segredo da chave e decriptografar a mensagem, esse
método de decriptografia é chamado de “ataque a força bruta” (brutal force) onde um
ou mais computadores tentam através de tentativa e erro descobrir a chave de um
documento criptografado (DEITEL et al., 2003).
A criptografia simétrica é muito eficiente e difícil de ser violada, porém
possui uma falha, a chave secreta precisa ser compartilhada por ambas as partes
interessadas na troca de mensagens criptografadas, então a chave secreta deixa de ser
secreta. Através de lógica e bom censo deduz-se que um segredo só é seguro quando
ninguém sabe. Baseado nessa necessidade é que a criptografia assimétrica foi
concebida.
3.3.1.2 Criptografia assimétrica
O processo de comunicação privada pela criptografia assimétrica é simples.
A entidade possui um par de chaves geradas por ela mesma ou por um CA (Certificate
Authorities). O par é constituído de duas chaves, a chave privada e a chave pública. O
que uma chave escreve, somente a outra pode ler, isto é, se a entidade “A” utilizar a
chave pública da entidade “B” para lhe enviar uma mensagem, somente a chave
privada de “B” poderá decodificar essa mensagem. E se “B” escrever uma mensagem
com sua chave privada, somente quem tem posse da sua chave pública poderá ler, este
é o principio de assinaturas digitais, que será abordado no item sobre assinatura digital
deste capítulo. Este processo é descrito e exemplificado na Figura 4 (DEITEL et al.,
2003).
FIGURA 4 - Criptografia assimétrica.
(HENDRICKS et al., 2002)
As autoridades certificadoras (CA) são abordadas com maior detalhe no item
sobre certificados digitais deste capítulo.
A criptografia assimétrica foi criada para sanar as falhas apresentadas na
criptografia simétrica, como a necessidade de troca da chave secreta, ausência de
mecanismos de manuseio e gerenciamento de chaves, falta de autenticidade e nãorepúdio.
A necessidade de troca da chave secreta é eliminada por meio de troca de
chaves públicas, sendo que cada entidade que necessite escrever uma mensagem, usará
a chave pública do destinatário para escreve-la, desta maneira somente o destinatário
poderá ler a mensagem escrita com a sua chave privada.
A ausência de mecanismos de manuseio e gerenciamento de chaves é
resolvida através da ICP (Infraestrutura de chave pública) ou em inglês PKI (Public
Key Infrastructure). Segundo HENDRICKS et al. (2002), a PKI é a coleção dos
serviços necessários para se gerar e gerenciar pares de chave pública/privada, assim
como para emitir e gerenciar certificados digitais e gerenciamentos do ciclo de vida da
chave.
A autenticidade e não-repudio é resolvida pela criptografia assimétrica da
seguinte maneira, no momento em que a entidade escreve uma mensagem, a mesma
afirma sua autenticidade pelo processo de escrita com a sua chave privada, pois
somente com a chave pública dessa entidade que é possível de decifrar a mensagem
escrita.
Porém, a criptografia assimétrica também tem sua desvantagem, que é o
desempenho. Esta é muito onerosa para computadores, mesmo os mais modernos da
atualidade.
Segundo GOODWIN (2004), é usado um truque chamado Handshake, que é
a troca inicial de chaves públicas entre duas entidades, após a troca uma das duas
entidades gera uma chave simétrica para criptografar o conteúdo da comunicação, essa
chave é criptografada com a criptografia assimétrica das chaves públicas e é trocada
entre as duas entidades, apartir deste momento na comunicação somente é usado a
chave simétrica. É impossível determinar perante o ambiente externo que tipo de
criptografia é usado no processo de comunicação. Então com esse método de
combinação é obtido o melhor das duas categorias de criptografia, a segurança e
privacidade da criptografia assimétrica e o desempenho da criptografia simétrica. O
processo de Handshake é melhor descrito pela Figura 5.
FIGURA 5 - Processo de Handshake.
O processo de Handshake é descrito nos seguintes passos (GOODWIN,
2004):
1. É gerada aleatoriamente pela entidade emissora uma chave simétrica;
2. É feita a troca de chaves públicas para a comunicação utilizando a criptografia
assimétrica;
3. O emissor de posse da chave pública do receptor que foi obtida no passo dois,
criptografa a chave simétrica por ele gerada aleatoriamente;
4. É feito o envio da chave simétrica criptografada do emissor para o receptor;
5. É descriptogradafa a chave simétrica com a chave privada do receptor, para as
futuras comunicações será usada a chave simétrica obtida no processo.
3.3.2 Assinaturas digitais
Assinaturas digitais visam resolver dois dos serviços ou requisitos de
segurança em que um sistema deve implementar, a integridade e identidade. A
criptografia assimétrica é uma tecnologia fundamental para a execução de assinaturas
digitais.
Segundo HENDRICKS et al. (2002), as assinaturas digitais servem, na
verdade, a dois propósitos:
 Conferir a integridade dos dados;
 Garantir a identidade do remetente;
HENDRICKS et al. (2002) citam que, de acordo com o Internet Security
Glossary da IETF (Internet Engineering Task Force), uma assinatura digital é:
Um valor computado com um algoritmo criptográfico e anexado a um objeto de dados, de
maneira que qualquer receptor de dados possa usá-la para verificar a origem e a integridade
dos dados. Os dados anexados a uma unidade de dados, ou uma transformação
criptográfica sobre eles, que permita que um receptor da unidade de dados comprove a
origem e a integridade da unidade de dados e proteja-se contra falsificações, por exemplo,
pelo receptor.
De acordo com HENDRICKS et al. (2002), uma assinatura digital costuma
ser criada pela computação de uma mensagem resumida a partir de um documento, e
concatenando-a com as informações sobre o assinante, um timestamp (carimbo de data
e hora), e qualquer outra informação útil. Uma função hash unidirecional é usada para
gerar a mensagem resumida, semelhante a um checksum, uma string de comprimento
fixo de números a partir de uma mensagem de texto de tamanho variável. O termo
unidirecional significa que transformar a string com tamanho fixo de volta para a sua
mensagem de texto é extremamente difícil. A string resultante é, então, criptografada,
com a chave privada do assinante que usa o algoritmo adequado. O bloco de bits
criptografado resultante é a assinatura.
A assinatura costuma ser distribuída juntamente com informações sobre a
chave pública que foi usada para assiná-la. Para verificar a assinatura, o receptor
primeiramente determina se ele tem certeza de que a chave pertence à pessoa a quem
supostamente pertença e, em seguida, decriptografa a assinatura usando a chave
pública da pessoa. Caso a assinatura seja decriptografada adequadamente e as
informações combinem com as da mensagem (resumo adequado da mensagem etc.),
assinatura é aceita como válida.
Este processo é descrito em passos para uma melhor compreensão na Figura
6, onde é ilustrado o processo de comunicação entre a entidade A e a entidade B, onde
a entidade A deseja enviar um documento assinado digitalmente à entidade B.
FIGURA 6 - Processo de assinatura digital de um documento.
O processo de assinatura digital de um documento é descrito nos seguintes
passos (GOODWIN, 2004):
1. A entidade A usa uma função hash unidirecional para computar o resumo de
seu documento.
2. Em seguida, a entidade A criptografa o resumo, usando sua chave privada,
com isso a mesma acaba de assinar digitalmente o documento.
3. Posteriormente, a entidade A criptografa sua assinatura digital, juntamente
com a mensagem original, usando a chave publica da entidade B.
4. O pacote criptografado é transmitido pela entidade A e recebido pela
entidade B.
5. A entidade B usa sua chave privada para descriptografar o pacote
criptografado, obtendo a mensagem e a assinatura digital.
6. A entidade B usa, então, a chave publica da entidade A para descriptografar
a assinatura para o resumo criado pela entidade A.
7. Usando o mesmo algoritmo hash unidirecional, a entidade B cria um novo
resumo a partir da mensagem do texto e então, comparado ao hash original.
Este último passo tanto confirma a integridade dos dados quanto garante a
identidade do remetente.
3.3.3 Certificados digitais
Segundo HENDRICKS et al. (2002), um certificado digital é um documento
que pode ser usado para identificar uma pessoa, servidor, empresa ou outra entidade.
Certificados digitais fornecem comprovação reconhecida através de terceiros que
confirmam esse certificado. Esses terceiros são chamados de Autoridades
Certificadoras, AC. Todo certificado digital gerado por um AC deve seguir as
seguintes características (HENDRICKS et al., 2002):
 Ligar uma chave pública a uma entidade que a identifica;
 Incluir o nome da entidade, a data de expiração, o nome da AC e o número
de serie do certificado;
 Sempre incluir a assinatura digital da AC emissora, para que usuários deste
certificado possam confiar no mesmo.
A AC assina o certificado criptografando o conteúdo da chave pública ou o
valor hash do mesmo com a sua chave privada. A AC deve verificar todas as
informações a serem armazenadas em um certificado antes de gerá-lo. Os usuários
devem confiar na chave pública da AC para verificar seu conteúdo e sua autenticidade.
Cada AC faz parte de uma hierarquia de autoridades certificadoras. Uma autoridade
certificadora faz parte de uma cadeia de ACs, partindo de um nó raiz, este nó raiz é a
autoridade de política de registros da Internet, IPRA (Internet Policy Registration
Authority).
É necessário mudar periodicamente o par de chaves para manter o sistema de
certificados seguro. Quanto mais tempo um par de chaves for usado, mais tempo o
mesmo se torna vulnerável, devido a técnicas de reconhecimento de padrões e análise
criptográfica. Devido a isso, um certificado digital é criado com uma data de
expiração, um tempo de validade, forçando o usuário a atualizar seu certificado. Se um
certificado for comprometido antes de sua data de expiração o usuário poderá obter um
novo apartir de seu CA.
Cada AC possui uma lista de certificados revogados, CRL (Certificate
Revocation List). CRLs armazenam apenas os certificados gerados por seus ACs. É
essencial que o usuário reporte ao seu AC se este desconfia de que seu certificado foi
comprometido, para que estes não sejam responsabilizados pelo mal uso de seus
certificados comprometidos.
DEITEL et al. (2003) afirmam que muitas pessoas consideram o e-commerce
inseguro. Entanto, transações usando certificados digitais podem ser mais seguro do
que trocas de informações privadas pelo telefone, por e-mail e até por pagamento de
cartão de crédito.
Segundo DEITEL et al. (2003), os algoritmos de segurança usados na
maioria dos casos de transações on-line são quase impossíveis de serem
comprometidos. As estimativas afirmam que estes algoritmos são tão seguros, que
seriam necessários milhões de computadores modernos trabalhando em conjunto
durante cem anos para quebrar a segurança destes algoritmos através de tentativa e
erro ou ataques de força bruta.
No entanto, DEITEL et al. (2003), ainda, afirmam que o poder da
computação aumenta significativamente durante os anos e que algoritmos
considerados seguros hoje podem ser quebrados no futuro.
3.4 Camadas de segurança em Web Services
Segundo SINGH et al. (2004), os serviços de segurança em Web Services
podem incluir segurança em nível de transporte e segurança em nível de mensagens.
A segurança sobre a camada de transporte é aplicada na camada em que o
Web Service atua, como HTTP, assegurando o processo de comunicação de um ponto
a outro. A segurança sobre a camada de mensagem é aplicada na mensagem em si, que
o Web Service transmite, através de tecnologias de criptografia e assinatura digital de
documentos XML.
Segundo a SUN MICROSYSTEMS (2006i), as principais necessidades de
segurança em um Web Service são:
 Baixo acoplamento entre o serviço e o consumidor;
 Segurança baseada em padrões da Internet;
 Uso de mensagens formadas XML;
 Foco em prover interoperabilidade;
 Neutralidade de plataforma e linguagem de programação;
 Possibilidade de utilizar vários protocolos de transporte, como HTTP,
SMTP, etc;
 Suporte a interação de vários intermediários entre o consumidor do serviço e
o provedor do serviço.
E as suas principais vulnerabilidades são (SUN MICROSYSTEMS, 2006i):
 Interações são efetuadas através da Internet, usando protocolos que são
amigáveis a firewalls;
 Uma comunicação é iniciada freqüentemente pelos consumidores do serviço
que não têm nenhum relacionamento prévio com o fornecedor de serviço;
 A mensagem é baseada em texto plano.
3.4.1 Segurança sobre a camada de transporte
DEITEL et al. (2002) afirmam que, atualmente, a maioria das aplicações
para comércio eletrônico usam Secure Socktes Layer (SSL) para suas transações online e o mesmo foi desenvolvido pela Netscape Communications, em um formato de
padrão aberto. SSL é comumente usado para garantir segurança em comunicações
entre dois computadores na Internet ou em uma rede. SSL opera entre os protocolos de
comunicação TCP/IP como está ilustrado pela Figura 7 e é transparente para a
aplicação que o utiliza.
FIGURA 7 - Processo de comunicação através do protocolo SSL.
O SSL utiliza a criptografia assimétrica e certificados digitais para autenticar
os servidores e clientes e proteger as informações que transitam pela Internet. O
processo de comunicação é iniciado pelo cliente, envia uma mensagem para o
servidor, o servidor responde a mensagem enviando o seu certificado digital ao cliente
para autenticação.
Usando a chave pública do servidor para se comunicar seguramente, o
cliente e o servidor negociam chaves simétricas para continuar a transmissão. Essa
chave é usada somente durante o processo da transação. Uma vez trocada a chave
simétrica a comunicação procede entre o cliente e o servidor usando esta chave. Dados
criptografados passam pelo canal de comunicação TCP/IP como qualquer pacote que
viaja pela Internet.
Entretanto, antes de mandar uma mensagem por TCP/IP o protocolo SSL
quebra a informação em blocos, comprime-a e a criptografa. Conseqüentemente para o
receptor, antes de o pacote chegar a aplicação o protocolo SSL a decriptografa o
pacote, descomprime-o e o monta para ser entregue a aplicação, tornado o processo
transparente (DEITEL et al., 2003).
Esses processos extras na comunicação provêem uma camada de segurança
entre aplicações que fazem uso do TCP/IP para se comunicar. O objetivo principal do
SSL é garantir a segurança de ponto a ponto em conexões ou transmissões de dados
para um computador a outro em uma rede, seja ela local ou remota, também provendo
meio de autenticação entre as duas partes (DEITEL et al., 2003).
O protocolo SSL provê para aplicações três serviços de segurança (DEITEL,
et al. 2003):
 Autenticação: o servidor apresenta ao cliente um conjunto de credenciais e
certificados que provam que este serviço é o que diz ser.
 Confidencialidade: os dados transmitidos por SSL são criptografados,
tornando impossível a legibilidade dos mesmos por terceiros que estejam no
caminho da comunicação entre o cliente e o servidor.
 Integridade: SSL garante um meio de verificação de que os dados por ele
transmitidos não foram alterados.
Segundo HENDRICKS et al. (2002), o SSL é um protocolo sofisticado que
está sendo muito usando na Internet, e que fornece uma boa camada de segurança, mas
que juntamente com outros serviços em nível de transporte, não deixa de apresentar
problemas quando aplicado à Web Services.
Múltiplos Web Services podem ser combinados para a formação de uma
aplicação maior, orientada a serviços, devido a isso esta aplicação necessita fazer
inúmeras chamadas e conexões com outros Web Services, e os mesmo podem também
fazer uso de outros Web Services e assim consecutivamente, o que torna o SSL um
padrão inapropriado para garantir a segurança de informações nesse tipo de sistema,
pois SSL provê segurança de ponto-a-ponto, máquina a máquina e não fim-a-fim como
é preciso neste caso, SSL não chega a descer para o próximo nível da cadeia de
serviços, ele fica apenas situado entre as conexões.
O protocolo SSL possui uma série de limitações quando se trata de sua
aplicabilidade em Web Services, que podem ser resumidas em (GOODWIN, 2004):
 SSL provê segurança de ponto-a-ponto e opera entre nós da rede (não entre
aplicações). Para Web Services é necessário segurança de fim-a-fim onde
nós intermediários podem existir entre um processo de troca de mensagem;
 SSL opera no nível de transporte e não no nível de mensagem. As
mensagens estão protegidas somente enquanto são transmitidas, não são
seguras por si só, necessitam de um canal seguro de comunicação;
 SSL não suporta não-repúdio. Não é possível provar que outra entidade
efetuou tal transação ou requisitou tal serviço;
 SSL não suporta criptografia customizada ou em parte. Utilizando SSL para
transportar um documento XML grande, seria necessário criptografa-lo por
completo, e não somente as informações que seriam consideradas
confidenciais.
Segundo HENDRICKS et al. (2002), a implementação de um Web Service
que faça uso de segurança sobre a camada de transporte HTTP com SSL é
razoavelmente simples. Ele afirma que não há necessidade de grandes alterações no
código da aplicação, apenas é preciso que se configure corretamente o servidor,
registrando um domínio seguro onde o Web Service está hospedado e obtendo um
certificado digital válido de uma AC para ser associado ao servidor. Para que isso
possa ser feito é necessário que o servidor onde a aplicação esteja hospedada suporte
comunicações através do protocolo SSL.
Porém, deve levar em consideração a carga extra de trabalho que o servidor
sofrerá para atender as requisições criptografadas por SSL, afirma DEITEL et al.
(2003). Existem soluções em hardware especializadas para tratar do processamento de
requisições SSL, como por exemplo, uma placa PCI que pode ser conectada ao
servidor e que fornece um processador que implementa a baixo nível o processamento
de SSL, afirmam DEITEL et al. (2003), fornecem um ótimo desempenho para a tarefa.
Baseado nas afirmações anteriores da SUN MICROSYSTEMS (2006i),
sobre as necessidades de segurança em Web Services, deduz-se que a segurança sobre
a camada de transporte não é a melhor tecnologia de segurança a ser aplicada nesse
tipo de sistema. Devido ao fato de ser dependente de protocolo de transmissão (HTTP)
e de não suportar a existência transparente de intermediários na comunicação. Porém,
pode ser aplicada com sucesso em um sistema que não necessite destas características
para o seu funcionamento.
3.4.2 Segurança sobre camada de mensagem
Segurança no nível de mensagem é diferente do que se usa geralmente para prover
segurança em Web Services hoje em dia. O que é feito hoje é pego a mensagem que é um
pedaço de dados vulnerável que todo mundo pode olhar, todo mundo pode mudar. Para
prever isso é pego esse pedaço de dados e a empurramos em um tubo de aço para o seu
destinatário que esta conectado na outra ponta do tubo. Esse tubo é o que chamamos de
segurança a nível de transporte que protege a mensagem entre a origem e seu destino.
Segurança no nível de mensagem é diferente, segurança a nível de mensagem pega esse
conjunto de dados e a embala em uma concha de do mesmo tipo de aço e agora a
mensagem esta segura por si só. Está segura antes de ser enviada, esta segura quando é
recebida e após ser recebida também. Agora não precisamos mais do tubo de aço. Agora
podemos usar qualquer tubo que temos disponível para mandar a mensagem. Também
podemos armazenar a mensagem depois de ser recebida, o que nos da à habilidade de
recuperá-la e verificar suas informações de segurança, como em situações com assinatura
digital, em que se quer provar que alguém quem mandou essa mensagem realmente é quem
diz ser. Estas características estão disponíveis para a sua aplicação, o que significa partir do
momento que se sabe o que a aplicação esta fazendo e da estrutura da mensagem, é
possível quebra-la e abri-la e se pode ver pedaços individuais da mensagem, pode-se
embala-los e criptografa-los, pode-se assina-los, assinar pedaços de diferentes formas,
pode-se embalar toda a mensagem, criptografa-la ou assina-la. Partindo disto, essa
tecnologia pode oferecer um ótimo meio de controle para a aplicação acessar um maior
conjunto de opções de segurança (GOODWIN, 2004).
Segundo a SUN MICROSYSTEMS (2006i), a segurança sobre a camada de
mensagem faz uso de uma série de mecanismos, tais como: criptografia, autenticação e
assinaturas digitais. As principais vantagens desse esquema de segurança na camada
da mensagem são:
 A segurança fica com a mensagem através de todos os nós e depois da
mensagem chegar ao seu destinatário;
 A segurança é granular, pode ser aplicada em diferentes partes da
mensagem, incluindo seus anexos;
 Pode ser usada em conjunto com intermediários na rede;
 É independente de ambiente e de protocolo de transporte.
3.4.2.1 Organizações envolvidas no desenvolvimento de tecnologias de segurança em
nível de mensagem para Web Services
Segundo a SUN MICROSYSTEMS (2006i), as seguintes organizações
trabalham para o desenvolvimento de especificações, tecnologias e ferramentas para
segurança em Web Services:
 The World Wide Web Consortium (W3C)
 XML Encryption: esta especificação provê requerimentos para o
processamento e criptografia de documentos expressados pela sintaxe
XML;
 XML Digital Signature: esta especificação define um meio de
representar assinaturas digitais em documentos XML através de sua
sintaxe e semântica;
 XML Key Management Specification: esta especificação define
protocolos para distribuição e registro de chaves públicas em
documentos XML;
 Organization for Advancement of Structured Information Standards (OASIS)
 Web Services Security (WSS), SOAP Message Security: Esta
especificação descreve aprimoramentos para o protocolo SOAP que
prove integridade, confidencialidade e autenticação na mensagem,
esta especificação será tratada com mais detalhes adiantes neste
capítulo;
 Security Assertion Markup Language (SAML): a especificação
SAML define um mecanismo baseado em XML para segurança de
transações B2B, B2C, e-commerce. SAML define um framework para
troca de informações sobre autenticação e autorização, desta forma
SAML provê um meio de interoperabilidade de definições de
segurança entre sistemas distintos;
 eXtensible
Access
Control
Markup
Language
(XACML):
a
especificação XACML define uma linguagem para expressão de
políticas de segurança baseado em documentos XML;
 Web Services Interoperability Organization (WS-I): diferente da W3C e da
OASIS, a WS-I desenvolve perfis de o que usar, e como usar as tecnologias
existentes para promover segurança em Web Services. Alguns desses perfis são:
 Basic Security Profile (BSP) que fornece um guia de uso do
framework WSS;
 REL Token Profile que é o guia de como usar a linguagem de
expressão de direitos (Rights Expression Language);
 SAML Token Profile: guia de uso da tecnologia SAML;
 Security Challenges, Threats, and Countermeasures (Desafios,
ameaças, e contramedidas de segurança): é um documento escrito pela
Web Services Interoperability Organization (WS-I), que visa
identificar ameaças de segurança em uma aplicação que faz uso de
Web Services em sua infra-estrutura. Este documento também visa
promover uma tecnologia apropriada para tratar essa ameaça.
3.4.2.2 API de segurança em nível de mensagem para Web Services na plataforma
Java
O framework responsável pela segurança em Web Services na plataforma
Java é o XWS-Security. Como já descrito no capítulo dois, o framework XWS-Security
faz parte do Java WSDP, este provê um meio a desenvolvedores de aplicar segurança
em aplicações desenvolvidas com JAX-RPC, JAX-WS ou SAAJ, através de
configurações de políticas de segurança de requisição e resposta no nível de serviço,
porta ou operação. Esta implementação de XWS-Security provê segurança para Web
Services no nível de mensagem e implementa os padrões de Segurança em Web
Services (WSS) propostos pela OASIS.
O framework XWS-Security fornece ao desenvolvedor de aplicações Web
Services uma ampla variedade de opções de definição de segurança em seu aplicativo.
O framework faz uso de uma série de tecnologias relacionadas que possibilita uma
configuração flexível e interoperável na camada de segurança do aplicativo.
O meio de se aplicar a segurança é através de arquivos XML de
configuração, usados em conjunto com o descritor da aplicação que é um documento
requerido em toda aplicação Enterprise para plataforma Java EE.
Segundo a SUN MICROSYSTEMS (2006i), uma aplicação Web Services
pode ser segura conforme os seguintes cenários:
 Assinando e verificando partes de uma mensagem SOAP e seus anexos
(fazendo uso da tecnologia XML Digital Signature);
 Criptografando ou descriptografando partes de uma mensagem SOAP e seus
anexos (fazendo uso da tecnologia XML Encryption);
 Enviando informações de identificação e autorização de usuários junto com
a mensagem SOAP (fazendo uso da tecnologia SAML).
3.5 Conclusão
Existem várias maneiras de se aplicar segurança em uma aplicação que faça
uso de Web Services. Pode-se utilizar métodos de segurança no ambiente de rede em
que o sistema atua, também pode-se aplicar segurança através da comunicação entre o
Web Service e seu consumidor. Porém, todas essas soluções possuem suas limitações,
o que as tornam impróprias para aplicação em determinados cenários. Por isso, a
tecnologia de segurança sobre a camada de mensagem está se tornando um padrão de
fato sobre a segurança em Web Services, devido a oferecer maior flexibilidade, opções
e configurações de segurança para os Web Services. Com o estudo realizado e as
conclusões tiradas sobre as tecnologias de segurança, opta-se por usar a segurança
sobre a camada de mensagem para o desenvolvimento deste trabalho devido ao nível
maior de flexibilidade na especificação de políticas de segurança e, também, por ser a
tecnologia desenvolvida especificamente para a realização da tarefa.
Este capítulo é de grande importância para o desenvolvimento do trabalho,
devido ao fato de que foram levantadas as possíveis soluções para o problema
abordados, realizando assim o segundo
objetivo específico deste trabalho, que é
levantar os principais recursos para aplicação de segurança em Web Services. Neste
capítulo que se pode decidir quais medidas devem ser tomadas para se garantir
segurança em um Web Serivces e, também, quais tecnologias que devem ser usadas
para a realização dessa tarefa.
4 ANÁLISE E MODELAGEM DO SISTEMA
Neste capítulo está a análise e modelagem do sistema desenvolvido visando
a exemplificação de um ambiente seguro com Web Services. O sistema consiste em
uma aplicação voltada ao comércio eletrônico do setor madeireiro do Planalto
Catarinense. A estrutura deste capítulo está organizada de acordo com a fase de
concepção do Processo Unificado – PU (sugerida por WAZLAWICK, 2004).
4.1 Concepção
Na fase de concepção é possível se ter uma noção exata do esforço
necessário para desenvolver o software, ou seja, o tamanho e a complexidade do
sistema (WAZLAWICK, 2004). É nesta fase que são organizadas e registradas as
informações obtidas a partir de reuniões com profissionais do setor madeireiro, com a
finalidade de se discutir o que o sistema precisa ter e o que este poderá fazer (SOUSA,
2005).
4.2 Sumário executivo
O sistema de e-commerce para o setor madeireiro visa fornecer aos seus
clientes meios de efetuar consultas e compras de produtos oferecidos pela empresa.
Também fornece operações administrativas do sistema tais como: cadastros de
materiais, clientes e consulta de vendas.
O sistema disponibiliza suas operações através de Web Services para que seja
possível a fácil integração com outros sistemas no futuro. Porém será necessário o
desenvolvimento de técnicas de segurança para que a realização destas operações
possam ser consideradas seguras, pois estas envolvem informações confidenciais da
empresa e dos clientes da mesma.
4.3 Levantamento de requisitos
A etapa de levantamento de requisitos corresponde a buscar, junto ao usuário
do sistema, todas as informações possíveis sobre as funções que o sistema deve
executar e as restrições sob as quais o sistema deve operar (WAZLAWICK, 2004).
Nesta seção, são descritos os requisitos funcionais (tudo o que o sistema deve fazer) e
os não-funcionais (restrições sobre como o sistema deve realizar seus requisitos
funcionais) (SOUSA, 2005).
Uma possível estrutura para a tabela de requisitos, segundo WAZLAWICK
(2004), pode ter os seguintes campos:
a) Código do requisito funcional (F seguido de um número e do nome do
requisito funcional: especificação curta);
b) Descrição (especificação longa e detalhada do requisito);
c) Categoria funcional: evidente (efetuados com o conhecimento do usuário) ou
oculto (efetuados pelo sistema sem o conhecimento explícito do usuário);
d) Código do requisito não-funcional (NF seguido do número do requisito
funcional, acrescido de um ponto, do número seqüencial do requisito nãofuncional e do nome do requisito não-funcional: especificação curta);
e) Restrição: especificação (longa) do requisito não funcional;
f) Categoria: indica o tipo de restrição, que pode ser de segurança, desempenho,
compatibilidade, especificação, interface etc.;
g) Obrigatoriedade: se o requisito é desejável ou obrigatório;
h) Permanência: se o requisito é permanente ou transitório (permanente nunca
mudará com o tempo).
i) O * indica obrigatoriedade do dado.
O Quadro 5 fornece as informações de Clientes que deveram ser mantidas no
sistema. Informações pessoais e de acesso (login/senha) deverão ser mantidas no
sistema para que se possa autenticar um cliente ou então saber qual endereço que
deverá ser entregue a mercadoria comprada pelo mesmo.
QUADRO 4 - Cadastro de Clientes
F1 Manter Cadastro de Clientes
Oculto ()
Descrição: Permite incluir, excluir, alterar e consultar as informações sobre clientes.
Requisitos Não Funcionais
Nome
Restrição
Categoria
Desejável
Permanente
N.F. 2.1
As informações sobre o cliente são:
Informações do nome*; sobrenome*; endereço(rua,
cliente
numero, bairro, cidade, estado, cep, Especificação
complemento)*; cpf *; login*;
password*.
N.F. 2.2
O cliente deve ser identificado pelo
Identificação do seu cpf ou seu login.
Interface
cliente
N.F. 2.2
O cliente deve ter um login e este
Especificação
Login do cliente deve ser unico.
X
X
X
O Quadro 5 fornece os dados relevantes sobre o cadastro de Produtos. É
importante ter um conjunto de registros de Produtos, para que se possa obter um
relatório de produtos, um controle de estoque e saber o que será possível disponibilizar
para venda aos Clientes.
QUADRO 5 - Cadastro de Produtos
F2 Manter Cadastro da Produtos
Oculto ()
Descrição: Permite incluir, excluir, alterar e consultar as informações sobre produtos.
Requisitos Não Funcionais
Nome
Restrição
Categoria
Desejável
Permanente
N.F. 3.1
As informações sobre o produto
Informações do são: nome*; preço por unidade*;
Produto
quantidade em estoque*
identificador*.
N.F. 3.2
O produto deve ser identificado
Identificação do pelo seu nome ou identificador.
Produto
Especificação
X
Interface
X
O Quadro 6 apresenta a principais informações sobre a realização de uma
Ordem de Compra, esta armazena o Cliente que a realizou, sua data de realização e
uma lista de Produtos que a compõem.
QUADRO 6 - Cadastro de Ordem de Compra
F3 Manter Cadastro de Ordem de Compra
Oculto ()
Descrição: Permite incluir, excluir, alterar e consultar as informações sobre ordem de compra.
Requisitos Não Funcionais
Nome
Restrição
Categoria
Desejável
Permanente
N.F. 4.1
Informações da
Ordem de
compra
N.F. 4.2
Identificação da
Ordem de
compra
N.F. 4.3
Realização da
Ordem de
Compra
As informações sobre a ordem de
compra são: cliente*;
Especificação
produtos/quantidade*; data da
realização*;
A Ordem de compra deve ser
identificada pelo seu identificador.
Interface
A Ordem de compra deve ser
realizada somente por um cliente.
Especificação
X
X
X
O Quadro 7 apresenta as informações relativas a Categoria de um produto,
esta entidade categoriza o produto, por exemplo, um produto “Porta de cedro” pertence
a categoria “Portas” que é medido por unidade. Então, baseado nisso, uma Categoria
deve ter um nome e uma unidade que classificam os produtos.
QUADRO 7 - Cadastro de Categoria
F5 Manter Cadastro de Categoria
Oculto ()
Descrição: Permite incluir, excluir, alterar e consultar as informações sobre Categoria.
Requisitos Não Funcionais
Nome
Restrição
Categoria
Desejável
Permanente
N.F. 4.1
Informações da
Categoria
N.F. 4.2
Identificação da
Categoria
As informações sobre
administrador são: nome*;
Especificação
unidade*; identificador*;
A categoria deve ser identificada
pelo seu identificador ou seu nome. Interface
X
X
4.4 Lista de consultas
A geração de relatórios e consultas não precisa ser considerada um caso de
uso do sistema, pois não alteram a informação registrada no sistema. Basta definir o
formato em que a informação deve ser exibida e definir um modo padrão para o
usuário gerar os relatórios. Desse modo, os relatórios e consultas só são listados na
fase de concepção, visando uma construção em etapa posterior (SOUSA, 2005). A
lista de consultas referente a esse sistema é apresentada no Quadro 8.
QUADRO 8 - Lista de consultas
Nome
Referências cruzadas
Acessado por
Produto
F1, F5
Cliente
F4,
Ordem de compra F1, F2, F3, F4, F5
Categoria
Administrador, Cliente
Administrador
Administrador, Cliente
(somente as realizadas por ele).
Administrador, Cliente
F1, F4
4.5 Requisitos suplementares
De acordo com WAZLAWICK (2004), os requisitos suplementares, podem
ser definidos pelos mesmos campos usados no levantamento de requisitos, a única
diferença está na numeração, já que os requisitos suplementares não estão associados a
requisitos funcionais. A numeração, neste caso, é feita com o prefixo S seguido de um
número. A lista de requisitos suplementares é apresentada no Quadro 9.
QUADRO 9 - Requisitos suplementares
Nome
S1 Níveis
segurança
Restrição
Categoria
de O ambiente possui 2 níveis de
segurança:
Nível 1- (Administrador) Acesso a
todas as informações- permite incluir,
consultar, alterar, excluir qualquer
informação e autorizar usuário;
Nível 2 – (Cliente) permite consultar
produtos, categorias e realizar ordem de
compra.
Segurança
O sistema deverá ser desenvolvido para
plataforma Java EE.
Arquitetura
S3 Formas de O ambiente deverá ser acessado através
acesso
de Web Services.
Arquitetura
S4 Banco
Dados
Arquitetura
S2 Plataforma
de O Banco de Dados deverá
compatível com o padrão SQL92.
ser
S5 Autenticação Todas as operações a serem realizadas
devem ser autenticadas e autorizadas.
S6 Privacidade
Todos os dados transmitidos devem ser
criptografados.
Desejável Permanente
X
X
X
X
Segurança
X
Segurança
X
Nome
Restrição
Categoria
S7 Não-repúdio Toda realização de uma Ordem de
compra deve ser assinada digitalmente
pelo cliente.
Segurança
Desejável Permanente
X
4.6 Organização de requisitos
Essa etapa serve para estruturar os requisitos para que possam ser abordados
nos ciclos de desenvolvimento e é composto pelos artefatos e lista de casos de uso,
lista de conceitos com operações cadastrais, planejamento dos ciclos iterativos,
cronograma e glossário, descritos nos próximos subitens (SOUSA, 2005).
4.6.1 Listas de caso de uso
Segundo WAZLAWICK (2004), o objetivo de listar os casos de uso, é
levantar informações sobre como o sistema interage com possíveis usuários e quais
consultas e transformações da informação são necessárias, além daquelas já
identificadas na fase de levantamento de requisitos.
Para auxiliar na abordagem das informações correlacionadas com o sistema
segue o Quadro 11 de caso de uso do sistema em questão. A divisão do sistema feita
através de casos de uso resulta em uma melhor compreensão do sistema e facilita na
definição das funções de cada usuário.
QUADRO 10 - Lista de caso de uso
Nome
Atores
Realizar uma
Cliente
Ordem de Compra
Descrição
Referências Cruzadas
O cliente faz uma requisição ao
sistema informando os produtos que o
F4, F3, F2
mesmo deseja comprar, juntamente
com seu cartão de credito.
4.6.2 Lista de conceitos e operações cadastrais
Na lista de conceitos com operações cadastrais (Quadro 11), é possível fazer
a associação das diversas funcionalidades do sistema, sabendo quando uma é prérequisito para que a outra possa acontecer, bem como definir o que o usuário pode
fazer (incluir, alterar, excluir, consultar) com as informações disponibilizadas no
sistema, e sob quais condições (SOUSA, 2005).
QUADRO 11 - Lista de operações cadastrais
Conceito
I A E C Observação
Cliente
X X X X
Produto
X X X X
Ordem de
Compra
X
Categoria
X X X X
X X
Atributos: nível de segurança*, login*, senha*,
confirmar senha*.
Um cliente só pode ser inserido por um administrador.
O cliente apenas podera efetua o caso de uso de Ordem
de Compra.
O cliente poderá efetuar consultas sobre Produtos e suas
Categorias.
O cliente poderá efetuar consultas somente em Ordem
de Compra que estiverem associadas a ele.
A alteração, exclusão ou inserção de Produto poderá ser
realizada somente por um administrador.
A criação de uma nova Ordem de Compra poderá
somente ser realizada por um Cliente através do caso de
uso.
A alteração, exclusão ou inserção de Categorias poderá
ser realizada somente por um administrador.
Referências
Cruzadas
F1, F2, F3,
F4, S5, S6,
S7
F3, F1
F1, F3, F4,
S5, S6, S7
F3, F1
4.7 Fase de elaboração
Segundo WAZLAWICK (2004), a fase de elaboração se inicia com uma fase
de análise e prossegue com a face de projeto, e a fase de análise em si, comporta três
atividades distintas realizadas na seguinte ordem:
a) Expansão dos casos de uso e determinação dos eventos de sistema.
b) Construção do modelo conceitual.
c) Elaboração dos contratos das operações de sistema.
Nesta seção é apresentado somente a expansão do caso de uso e o modelo
conceitual, os contratos do sistema não são apresentados devido a baixa complexidade
do mesmo, sendo que somente com as informações obtidas na expanção de caso de
uso já é suficiente para a implementação do sistema.
No Quadro 12 s apresentado a expansão do caso de uso Ordem de Compra,
que descreve o funcionamento desta operação.
QUADRO 12 - Expansão do caso de uso Ordem de Compra
Caso de Uso: Realizar Ordem de Compra
Ator: Cliente
Interessados: Cliente.
Precondições: Cliente deve estar registrado no sistema. Os produtos que constituem a ordem de compra
devem estar registrados no sistema e também que estejam disponíveis no estoque da empresa.
Pós -condições: Depois de efetuada a compra, deve ser registrada essa negociação e é dado baixa no
estoque da empresa dos produtos que foram vendidos.
Requisitos correlacionados: F1, F3, F4, S5, S6, S7
Variações Tecnológicas: a identificação do Cliente é feita através de assinatura digital e os dados devem
ser criptografados.
Questões em aberto: não há.
Fluxo principal:
Passos
1. O cliente envia uma requisição de compra com as seguintes informações:
1. Sua identificação (login/senha);
2. Sua lista de produtos a serem comprados;
3. Seu número de cartão de credito;
4. Sua assinatura digital do documento;
2. O sistema analiza a resquisição do cliente:
1. O sistema verifica a sua identificação;
2. O sistema verifica a disponibilidade dos produtos contidos na lista da ordem de compra;
3. O sistema valida o crédito do cliente;
3. O sistema da baixa no estoque da empresa;
4. O sistema credita o crédito do cliente na conta da empresa;
5. O sistema retorna ao cliente uma mensagem de operação bem sucedida;
Fluxo alternativo:
2.1.a: Caso a identificação falhe o sistema retorna uma mensagem de erro sobre a identificação;
2.2.a: Caso não exista algum produto na lista de compra o sistema retorna um erro informando essa
condição;
2.2.b: Caso não haja disponibilidade de algum produto contido na lista de compra, o sistema retorna um
erro informando essa condição;
2.3.a: Caso o cartão de crédito do cliente seja inválido, o sistema retorna um erro informando essa
condição;
2.3.b: Caso não haja crédito na conta do cliente o sistema retorna um erro informando essa condição;
Na Figura 8 é apresentando o modelo conceitual do sistema, onde apresenta
o conjunto de entidades que o compõem.
FIGURA 8 - Modelo de conceitual.
4.8 Fase do projeto
Segundo WAZLAWICK (2004), a fase de projeto enfatiza a proposta de uma
solução que atenda aos requisitos da análise. Então, se a análise é uma investigação
para tentar descobrir o que o cliente quer, o projeto consiste em propor uma solução
com base no conhecimento adquirido na análise.
O projeto deste sistema é constituído de uma breve descrição da aplicação,
um diagrama de classes que compoem o sistema e uma descrição dos Design Patters
utilizados na implementação.
4.8.1 Descrição do sistema
O sistema foi desenvolvido na plataforma Java EE, onde é disponibilizado
em um servidor de aplicação. Este servidor de aplicação disponibiliza ao sistema um
ambiente de execução seguro e com uma série de recursos necessários para sua
execução. Como, por exemplo, controle de transações, conectividade a um banco de
dados relacional e ao ambiente externo.
O sistema é acessado somente pela tecnologia Web Services, suas operações
cadastrais, consultas e casos de uso. Devido a necessidade dessa arquitetura, a
implementação dessas funcionalidade é feita de modo a fazer uso de uma
granularidade grossa dos dados. É reduzido ao máximo a interação do cliente ao
serviço, isto é, as chamadas do métodos expostos pelo Web Service conter todos os
dados necessários para realização da operação.
Por exemplo, no caso do caso de uso Ordem de Compra, a requisição para a
operação contém informações do cliente, informações do seu crédito financeiro e todos
os produtos que este deseja comprar. Com esse conjunto de informações o sistema
pode determinar se a operação é ou não efetuada com sucesso, sem a necessidade de
novas interações com o cliente. Esse método de granularidade grossa é necessário em
sistemas que fazem uso de Web Services devido a latência entre uma requisição e
resposta entre o cliente e o servidor, ou vice-versa.
São implementados dois Web Services, um para o Cliente e outro para o
Administrador. Cada um destes fornecer operações que visam atender as necessidade
de cada um desses atores, descobertas na fase de análise.
Todas a transmissões de dados devem ser confidenciais ao meio externo,
sendo assim, os Web Services farão uso extenso de criptografia e também qualquer
acesso ao sistema deve ser autenticado e autorizado.
A realização do caso de uso Ordem de Compra deve ser assinada pelo
cliente, para que futuramente seja possível a realização de uma auditoria e, também
fornecer subsídios para o não-repúdio de uma compra efetuada.
4.8.2 Arquitetura do sistema
O sistema baseia-se em uma arquitetura Cliente/Servidor onde os Clientes da
aplicação são o Administrador e o Cliente da camada de domínio. Cada um destes
Clientes fará acesso remoto pela rede a suas operações do sistema através de Web
Services. Todos os dados transmitidos entre o Cliente e o Servidor devem ser
confidenciais ao meio externo. O sistema implementa mecanismos de autenticação e
autorização de Clientes através dos Web Services. Também há a necessidade
específica, no caso da operação Ordem de Compra, onde será necessária a validação
de identidade do Cliente que a efetuar. No caso, é utilizada assinatura digital do
documento que representa a reaquisição de uma Ordem de Compra.
A Figura 9 apresenta a arquitetura do sistema:
FIGURA 9 - Arquitetura do sistema
O ponto crítico de segurança identificado nessa arquitetura é que o sistema
disponibiliza operações de lógica de negócios ao ambiente externo. Tais operações
estão carregando dados que comprometem tanto a empresa como o cliente que está
solicitando o serviço. O sistema deve se precaver e prevenir que entidades não
autorizadas venham a executar operações indevidamente.
4.8.3 Diagrama de classes
A Figura 10 apresenta o diagrama de classes, de acordo com a UML, para o
sistema de comércio eletrônico da indústria madeireira.
FIGURA 10 - Diagrama de classe.
Este diagrama foi concebido a partir do modelo conceitual obtido na fase de
elaboração do sistema. Normalmente no diagrama de classe é específicado o
comportamento de cada classe através de seus métodos. Neste caso, esses métodos
foram omitidos presando a simplicidade do diagrama, pois, toda a lógica do sistema
não está contida nessas classes, e sim nas classes referentes a fachada do sistema, que
será abordada na seção sobre a fachada do sistema deste capítulo, cabendo a essas
classes apenas servir como uma cápsula dos dados manipulados pelo sistema.
WAZLAWICK (2004) prevê a necessidade de um modelo lógico de banco
de dados em um projeto que faça uso do processo unificado. Na Figura 11 é
apresentado o modelo lógico do banco de dados relacional.
FIGURA 11 - Modelo lógico do banco de dados
4.9 Padrões de projeto utilizados
Para a implementação deste sistema são utilizados alguns padrões de projeto
(Design Patterns) que facilitaram este processo.
Os padrões se referem à comunicação de problemas e soluções. Em outras
palavras, os padrões permitem documentar um problema conhecido recorrente e sua
solução, em um contexto específico, e comunicar esse conhecimento para outras
pessoas.
Um dos elementos-chave na declaração anterior é a palavra recorrente, visto
que a meta do padrão é promover uma reutilização conceitual ao longo do tempo
(ALUR, CRUPI e MALCKS, 2004).
O sistema é separado em duas camadas: a camada de modelo, onde será
representado todas as entidades do sistema, tais como Clientes, Produtos, Ordem de
Compra e Adminstradores e a camada de serviços disponibiliza as operações expostas
pelo sistema ao meio externo, onde, cada ator do sistema (Cliente e Administrador)
pode realizar suas devidas operações.
O sistema faz uso do design pattern listado no catálogo J2EE, Session
Fachade para camada de serviços abordado por ALUR, CRUPI e MALCKS (2004).
4.9.1 Session Fachade
Session Fachade, trata de duas questões: controle de acesso do cliente aos
objetos de negócio e limitação do tráfego de rede entre clientes remotos e serviços de
negócios de granulação fina (ALUR, CRUPI e MALCK, 2004). Session Fachade visa
eleminar uma série de problemas que podem aparecer em um aplicativo coorporativo,
tais como:
 Elimina a dependência direta entre o cliente e o serviço, o que se chama de
acoplamento fraco;
 Elimina responsabilidade de conhecimento da lógica de negócio por parte do
cliente,
questões
como
conhecimento
de
relacionamentos
entre
componentes, controle de transações e segurança;
 Possibilita a fácil integração de diferentes tipos de clientes ao aplicativo;
 Reduz o tráfego de rede, devido ao projeto de acesso a camada de negócio
por granulação grossa.
Para o sistema desenvolvido, o Session Fachade é representado pelo próprio
Web Service, pois este permite um acesso simplificado do meio externo para a lógica
da aplicação, disponibilizando operações simples para execução de tarefas de
complexidade alta, como por exemplo, uma Ordem de Compra.
Foram desenvolvidas duas fachadas para o sistema, uma para o
Administrador e outra para o Cliente, onde cada uma destas contem a lógica de
negócio necessária para realização das tarefas incubidas aos atores.
A Figura 12 apresenta o diagrama de classes que ilustra a relação das
fachadas com o modelo do sistema e também as operações expostas por este.
FIGURA 12 - Diagrama de classe do padrão Session Fachade.
4.10 Conclusão
Neste capítulo foi apresentado o projeto e modelagem do sistema de
comércio eletrônico do setor madeireiro. Este processo foi baseado no modelo
proposto por WAZLAWICK (2004) do Processo Unificado, no qual, através dessa
etapa, foi possível analisar os principais requisitos para a implementação do sistema,
pertinentes ao assunto tratado neste trabalho, que é de grande importância, pois a
definição do sistema que rege sua implementação e implantação no ambiente. Também
foi neste capítulo que se definiram as regras e políticas de segurança que o sistema
deve seguir.
Porém, não se deve esquecer que o principal objetivo do mesmo é propor
uma metodologia prática de aplicabilidade de segurança em aplicações que façam uso
de Web Services. O sistema foi projetado com o intuito de fornecer um ambiente
propício para demonstração de um ambiente seguro com Web Services, devido a isso
foram omitidas algumas informações que seriam importantes para o desenvolvimento
de um sistema real para este setor.
5 DESENVOLVIMENTO E CONFIGURAÇÃO DO SISTEMA.
Neste capítulo é explanado o desenvolvimento do sistema proposto no
capítulo anterior e, também, a configuração adequada do ambiente para que propicie a
execução correta do mesmo. Por fim, é feita uma demonstração do ambiente seguro,
comparando-se com uma aplicação sem a tecnologia de segurança.
5.1 Requisitos de software
Os requisitos de software abrangem todos os softwares necessários para a
construção e execução do sistema. A lista abrange ambientes de desenvolvimento,
sistema gerenciador de banco de dados, servidor de aplicação e APIs e frameworks.
Segue abaixo a lista necessária de softwares do sistema:
 Java Standard Edition Developer Kit 5 (ambiente necessário para execução
e compilação de aplicações Java);

XML Web Service Security 2.0: conjunto de APIs para aplicar segurança na
camada de mensagem dos Web Services;
 Sun Java System Application Server Platform Edition 9 (servidor de
aplicação que implementa a especificação Java EE 5);
 PostgreSQL 8.1 (sistema gerenciador de banco de dados compatível com o
padrão SQL92);
 eclipse 3.2 (ambiente de desenvolvimento integrado para a plataforma
Java);
5.2 Instalação e configuração do ambiente
A instalação e configuração do ambiente é uma etapa delicada a implantação
do software desenvolvido, também é sábido que para se desenvolver um sistema devese ter um ambiente de desenvolvimento previamente configurado e instalado
adequadamente, para que possibilite a realização de testes no tempo de
desenvolvimento.
Seguem abaixo os passos a serem realizados em ordem da configuração do
sistema:
5.2.1 Instalação do Java Standard Edition Developer Kit 5 e configuração das
variáveis de ambiente:
Para a instalação correta da plataforma Java Standard Edition Developer Kit
5 (JDK 5) deve-se configurar duas variáveis de ambiente no sistema operacional
hospedeiro, a variável JAVA_HOME, que deve referenciar o diretório de instalação do
JDK 5, e a variável PATH, que deve ser acrescida do valor JAVA_HOME\bin, que
indica o caminho para as ferramentas de linha de comando distribuídas em conjunto
com Java SE 5 necessárias posteriormente para o desenvolvimento.
5.2.2 Instalação do PostgreSQL 8.1:
A instalação do SGDB PostgreSQL 8.1 deve ser padrão conforme indica o
instalador da aplicação. Para se obter maiores detalhes do processo de instalação
recomenda-se visitar o site http://www.postgresql.org.br.
Após a instalação, deve ser criado um banco de dados e um usuário/senha,
ambos com o nome de segurança-ws, esse banco deve estar vazio, sem nenhuma
tabela, pois estar será geradas pelo SJSAS 9 na hora do deploy da aplicação (devido ao
fato da aplicação utilizar a tecnologia JPA (Java Persistence API, detalhes dessa
tecnologia serão explicados na seção sobre a camada de persistência).
5.2.3 Instalação do eclipse 3.2:
Para instalar o eclipse 3.2 basta extraí-lo em uma pasta do sistema
operacional, com o Java SE 5 devidamente configurado e o eclipse executará sem
problemas, após a sua primeira execução a ferramenta ira pedir o caminho do diretório
que seram armazenados os projetos. Este diretório deve ser qualquer um válido no
sistema.
Após configurado o diretório de projetos, deve-se criar dois projetos, um
para o cliente do Web Service e outro para o servidor do Web Service. Também devese configurar devidamente as bibliotecas de ambos os projetos (a lista de bibliotecas é
descrita na seção sobre arquivos de configuração do sistema).
5.2.4 Instalação do Sun Java System Application Server Platform Edition 9
A instalação do servidor de aplicação segue normalmente como o proposto
pelo seu instalador, após a conclusão dessa etapa, deve-se criar uma variável de
ambiente chamada AS_HOME que indique o diretório onde o servidor de aplicação foi
instalado.
Após
feito
isso
deve
ser
AS_HOME\domains\domain1\lib
o
copiado
arquivo
para
o
diretório
postgresql-8.1-
404.jdbc3.jar que é o drive do SGDB PostgreSQL, do qual o SJSAS 9 irá
necessitar para estabelecer uma conexão com o banco de dados, o arquivo se encontra
no diretório: <diretorio de instação do PostgreSQL 8.1>\jdbc.
Após isso é necessário reiniciar o servidor de aplicação.
Após o reinício é necessário criar uma fonte de dados (Data Source) que será
disponibilizada pelo SJSAS 9 para a aplicação conectar ao banco de dados contido no
PostgreSQL 8.1. Para fazer isso é necessário acessar a ferramenta administrativa do
servidor, o Admin Console, que é acessado através de uma página localizada no
endereço http://localhost:4848, para isso é preciso que o servidor esteja
ativo.
Após
o
login
na
página
administrativa,
deve-se
abrir
o
nó
Resources\JDBC da árvore Application Server (localizada a esquerda da
pagina).
Neste
nó,
encontram-se
dois
sub-nós,
JDBC
Resources
e
Connection Pools. Primeiro é necessário criar um novo Connection Pool,
para isso deve-se entrar no nó correspondente e clicar no botão New (localizado sobre
a tabela de lista de Pools). Depois disso apararecerá uma tela de cadastro do novo
Connection Pool, com três campos a serem preenxidos, Name (o nome do
Connection Pool), Resource Type (tipo de recurso, mais especificamente, a
classe que o mesmo representa) e Data Base Vendor (SGDB). A propriedade
Name terá o valor seguranca-ws-postgresql, o Resource Type será
javax.sql.DataSource e o Data Base Vendor será PostgreSQL.
Após criado o Connection Pool é hora de criar o JDBC Resource,
para fazer isso deve-se acessar o sub-nodo JDBC Resource, clicar no botão New e
indicar o JNDI name e o Pool Name, o Pool Name é o mesmo que foi
previamente criar no cadastro do Connection Pool, o JNDI name é o nome
dado para o recurso que está sendo criado, e através desse nome que a aplicação terá
acesso a este recurso, no caso o nome será jdbc/Seguranca-WS-DS.
5.3 Codificação do sistema
Nesta seção é demonstrado como foi codificada a parte lógica do sistema,
que envolve a camada de domínio, persistência e fachada do sistema.
5.3.1 Camada de domínio
A camada de domínio, como descrito no capítulo anterior, é a camada que
representa a inteligência do sistema, suas entidades e dados por ele manipulados, todos
em um paradigma orientado a objetos.
A camada de domínio foi projetada baseada em uma análise feita sobre uma
empresa madeireira, gerando uma série de documentações, entre elas um diagrama de
classes. Este diagrama representa graficamente a estrutura das classes do sistema, com
base nele que foram codificadas as classes da camada de domínio.
O diagrama prevê a necessidade de seis classes: Endereço, Cliente,
OrdemCompra,
Categoria,
ProdutoOrdemCompra
e
Produto. Os
relacionamentos entre elas são descritos no diagrama de classes.
Essas classes foram codificadas usando o padrão Java Beans, proposto pela
especificação da SUN MICROSYSTEMS segundo BATES e SIERRA (2006). Para
representar os relacionamentos entre elas, foi utilizado o framework Collections do
Java SE, que objetiva disponibilizar uma serie de classes para representar coleções de
objetos, tais como, listas, conjuntos, mapas, filas, pilhas e etc. segundo BATES e
SIERRA (2006).
Porém há algo a mais na codificação destas classes, que são as anotações
(annotations) da API JPA (Java Persistence API). Essas anotações referem-se ao
mapeamento entre o paradigma orientado a objeto da linguagem Java para o
paradigma relacional do padrão SQL92, essa técnica é chamada de mapeamento objeto
/ relacional, do inglês object / relational mapping (ORM), segundo BAUER e KING,
(2005). O que facilita o desenvolvimento de uma aplicação, pois abstrai o mapeamento
e persistência de objetos para um banco de dados, tarefa essa muito maçante, repetitiva
e bastante suscetível a falhas, afirmam BAUER e KING, (2005).
Toda classe que deseja ser persistida através da JPA deve:
 Ter uma anotação @Entity da JPA, que indica que esta classe é uma
entidade persistível;
 Ter uma anotação @Id da JPA sobre o campo que representará o
identificador desta classe, que pode ser um valor de significado semântico
para o objeto (por exemplo, um CPF para uma Pessoa) ou então não ter
significado algum, apenas representado o identificador do objeto (valor este
que pode ser gerado automaticamente ou não);
 Deve sobrescrever os métodos equals e hashcode da super classe
Object (não é uma necessidade de fato, porém é extremamente
aconselhável), o método equals deve verificar se uma instância de objeto
é igual a outra, e o hashcode é utilizado para gerar um código hash,
utilizando quando este objeto for usado de chave em um mapa da API
Collections, ambos os métodos deve ser sobrescritos somente quando se
utiliza a técnica correta, caso o contrário pode acarretar em falhas no
funcionamento da aplicação;
 Deve implementar a interface Serializable do pacote java.io (não é
uma necessidade de fato, porém é extremamente aconselhável).
 Deve ter um construtor sem parâmetros.
Baseado nessa série de regras e no diagrama de classe foram implementadas
as classes de domíno da aplicação. O Quadro 13 apresenta a implementação da classe
Endereço, essa classe não é uma entidade isolada, ele existe somente quando
associada a um Cliente, então ela utiliza-se da anotação @Embeddable que indica
que ela terá um relacionamento de cardinalidade um para um com a classe Cliente.
QUADRO 13 - Classe Endereço.
package net.uniplac.tcc.segurancaws.model;
import java.io.Serializable;
import javax.persistence.Embeddable;
@Embeddable
public class Endereco implements Serializable {
public Endereco() {}
private
private
private
private
private
private
String rua;
Integer numero;
String bairro;
String cidade;
String uf;
String cep;
public String getRua() {
return rua;
}
public void setRua(String rua) {
this.rua = rua;
}
public Integer getNumero() {
return numero;
}
public void setNumero(Integer numero) {
this.numero = numero;
}
public String getBairro() {
return bairro;
}
public void setBairro(String bairro) {
this.bairro = bairro;
}
public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}
public String getUf() {
return uf;
}
public void setUf(String uf) {
this.uf = uf;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
}
O quadro 14 apresenta a implementação da classe Cliente, esta classe
segue as regras antes expostas para a implementação de uma entidade persistível para
a JPA. Também apresenta três diferenciais:
A
anotação
@NamedQueries
que
representa
o
conjunto
de
@NamedQuerie, uma @NamedQuerie é uma consulta pré-processada, escrita na
linguagem JPQL (Java Persistence Query Languare, (SUN MICROSYSTEMS,
2006g), liguagem própria para consulta em ORM;
 A anotação @Column(nullable=false, unique=true) que indica
que o valor da coluna mapeada não deve ser nulo e deve ser único;
 A
anotação
@OneToMany(cascade=CascadeType.ALL,
mappedBy = "cliente") que indica um relacionamento um para
muitos com um objeto OrdemCompra no atributo cliente.
Também, outro diferencial é a anotação @XmlTransient, que indica que
na hora da codificação do objeto para um documento XML que o atributo
ordensCompra não será codificado. A classe OrdemCompra (que será vista
posteriormente) tem um relacionamento com a classe cliente, devido a isso, uma das
duas classes devem abrir mão da propriedade relacionadora na hora da codificação em
XML, caso contrário o JAXB não consegue identificar o sinal de parada no grafo de
objetos relacionados, resultado em uma repetição eterna da codificação de dois objetos
relacionados bi-direcionalmente.
Infelizmente na versão do JAXB usada no trabalho não oferece o suporte
para relacionamentos bidirecionais entre dois objetos, resultado em uma dependencia
circular.
QUADRO 14 - Implementação da classe Cliente.
package net.uniplac.tcc.segurancaws.model;
import
import
import
import
import
import
import
import
import
import
java.io.Serializable;
java.util.Collection;
javax.persistence.CascadeType;
javax.persistence.Column;
javax.persistence.Embedded;
javax.persistence.Entity;
javax.persistence.Id;
javax.persistence.NamedQueries;
javax.persistence.NamedQuery;
javax.persistence.OneToMany;
@Entity
@NamedQueries( {
@NamedQuery(name = "Cliente.findByCpf", query = "SELECT c FROM Cliente c WHERE c.cpf =
:cpf"),
@NamedQuery(name = "Cliente.findByNome", query = "SELECT c FROM Cliente c WHERE c.nome =
:nome"),
@NamedQuery(name = "Cliente.findByLogin", query = "SELECT c FROM Cliente c WHERE c.login
= :login"),
@NamedQuery(name = "Cliente.findByPassword", query = "SELECT c FROM Cliente c WHERE
c.password = :password"),
@NamedQuery(name = "Cliente.findAll", query = "SELECT c FROM Cliente c"),
@NamedQuery(name = "Cliente.findByCidade", query = "SELECT c FROM Cliente c WHERE
c.endereco.cidade = :cidade"),
@NamedQuery(name = "Cliente.findByUf", query = "SELECT c FROM Cliente c WHERE
c.endereco.uf = :uf"),
@NamedQuery(name = "Cliente.findByCep", query
= "SELECT c FROM Cliente c WHERE
c.endereco.cep = :cep"),
@NamedQuery(name = "Cliente.findByBairro", query
= "SELECT c FROM Cliente c WHERE
c.endereco.bairro = :bairro"),
@NamedQuery(name = "Cliente.findByRua", query
= "SELECT c FROM Cliente c WHERE
c.endereco.rua = :rua")
})
public class Cliente implements Serializable {
@Id
@Column(nullable = false, unique = true)
private String cpf;
private String nome;
@Column(unique = true)
private String login;
private String password;
@Embedded
private Endereco endereco;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "cliente")
private Collection<OrdemCompra> ordensCompra;
public Cliente() {}
// getters and setters
@XmlTransient
public Set<OrdemCompra> getOrdensCompra() {
return this.ordensCompra;
}
public void addOrdemCompra(OrdemCompra ordemCompra) {
ordemCompra.setCliente(this);
getOrdensCompra().add(ordemCompra);
}
public int hashCode() {
int hash = 0;
hash += (this.cpf != null ? this.cpf.hashCode() : 0);
return hash;
}
public boolean equals(Object object) {
if (object == null || !this.getClass().equals(object.getClass())) {
return false;
}
Cliente other = (Cliente)object;
if (this.cpf != other.cpf && (this.cpf == null || !this.cpf.equals(other.cpf)))
return false;
return true;
}
public String toString() {
return getNome();
}
}
O Quadro 15 apresenta a implementação da classe Categoria, esta classe
apresenta um diferencial relativo as classes vistas até agora, ela possui seu
identificador gerado automaticamente pela JPA, isso é indicado através da anotação
@GeneratedValue(strategy=GenerationType.AUTO).
QUADRO 15 - Implementação da classe Categoria.
package net.uniplac.tcc.segurancaws.model;
import
import
import
import
import
import
import
import
import
import
import
java.io.Serializable;
java.util.Collection;
javax.persistence.CascadeType;
javax.persistence.Column;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
javax.persistence.NamedQueries;
javax.persistence.NamedQuery;
javax.persistence.OneToMany;
@Entity
@NamedQueries( {
@NamedQuery(name = "Categoria.findById", query = "SELECT c FROM Categoria c WHERE
c.idCategoria = :idCategoria"),
@NamedQuery(name = "Categoria.findByNome", query = "SELECT c FROM Categoria c WHERE
c.nome = :nome"),
@NamedQuery(name = "Categoria.findByUnidade", query = "SELECT c FROM Categoria c WHERE
c.unidade = :unidade"),
@NamedQuery(name = "Categoria.findAll", query = "SELECT c FROM Categoria c")
})
public class Categoria implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(unique = true)
private String nome;
private String unidade;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "categoria")
private Collection<Produto> produtos;
public Categoria() {}
// getters and setters
@XmlTransient
public Set<Produto> getProdutos() {
return produtos;
}
public void addProduto(Produto produto) {
produto.setCategoria(this);
getProdutos().add(produto);
}
public int hashCode() {
int hash = 0;
hash += (this.id != null ? this.id.hashCode() : 0);
return hash;
}
public boolean equals(Object object) {
if (object == null || !this.getClass().equals(object.getClass())) {
return false;
}
Categoria other = (Categoria)object;
if (this.id != other.id && (this.id == null || !this.id.equals(other.id)))
return
false;
return true;
}
public String toString() {
return getNome();
}
}
O Quadro 16 apresenta a implementação da classe Produto, esta apresenta
apenas um diferencial as outras classes apresentadas anteriormente, que é a anotação
@ManyToOne que indica o relacionamento de muitos para um da classe Produto
para classe Categoria.
QUADRO 16 - Implementação da classe Produto.
package net.uniplac.tcc.segurancaws.model;
import
import
import
import
import
import
import
import
java.io.Serializable;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
javax.persistence.ManyToOne;
javax.persistence.NamedQueries;
javax.persistence.NamedQuery;
@Entity
@NamedQueries( {
@NamedQuery(name = "Produto.findByIdProduto", query = "SELECT p FROM Produto p WHERE
p.idProduto = :idProduto"),
@NamedQuery(name = "Produto.findByNome", query = "SELECT p FROM Produto p WHERE p.nome =
:nome"),
@NamedQuery(name = "Produto.findByPrecoUnitario", query = "SELECT p FROM Produto p WHERE
p.precoUnitario = :precoUnitario"),
@NamedQuery(name = "Produto.findByQdtEstoque", query = "SELECT p FROM Produto p WHERE
p.qdtEstoque = :qdtEstoque"),
@NamedQuery(name = "Produto.findByCategoria", query = "SELECT p FROM Produto p WHERE
p.categoria = :categoria"),
@NamedQuery(name = "Produto.findAll", query = "SELECT p FROM Produto p JOIN p.categoria
c")
})
public class Produto implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String nome;
private Double precoUnitario;
private int qdtEstoque;
@ManyToOne
private Categoria categoria;
public Produto() {}
// getters and setters, equals, hashcode, toString...
}
O Quadro 17 apresenta a implementação da classe OrdemCompra, esta
apresenta dois diferenciais relativos as classes apresentadas anteriormente, que é a
anotação
@Temporal(TemporalType.DATE)
que
indica
que
o
campo
dataRealizacao do tipo java.util.Date será mapeado no banco de dados
como um tipo DATE do padrão SQL92 e a anotação @XmlElement sobre o método
getPrecoTotal(), isso indica que será criado no momento da codificação do
documento XML um elemento preco-total que armazena o valor total da Ordem
de compra.
QUADRO 17 - Implementação da classe OrdemCompra.
package net.uniplac.tcc.segurancaws.model;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
java.io.Serializable;
java.text.DateFormat;
java.util.Collection;
java.util.Date;
javax.persistence.CascadeType;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
javax.persistence.ManyToOne;
javax.persistence.NamedQueries;
javax.persistence.NamedQuery;
javax.persistence.OneToMany;
javax.persistence.Temporal;
javax.persistence.TemporalType;
javax.xml.bind.annotation.XmlElement;
@Entity
@NamedQueries( {
@NamedQuery(name = "OrdemCompra.findByIdOrdemCompra", query = "SELECT o FROM OrdemCompra
o WHERE o.idOrdemCompra = :idOrdemCompra"),
@NamedQuery(name = "OrdemCompra.findByDataRealizacao", query = "SELECT o FROM OrdemCompra
o WHERE o.dataRealizacao = :dataRealizacao"),
@NamedQuery(name = "OrdemCompra.findByCliente", query = "SELECT o FROM OrdemCompra o JOIN
o.cliente c WHERE o.cliente = :cliente"),
@NamedQuery(name = "OrdemCompra.findAll", query = "SELECT o FROM OrdemCompra o JOIN
o.cliente c")
})
public class OrdemCompra implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String cartaoCredito;
@Temporal(TemporalType.DATE)
private Date dataRealizacao;
@ManyToOne
private Cliente cliente;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ordemCompra")
private Collection<ProdutoOrdemCompra> listaProdutoOrdemCompra;
public OrdemCompra() {}
// getters and setters, equals, hashcode, toString...
@XmlElement
public double getPrecoTotal() {
double soma = 0;
for (ProdutoOrdemCompra produtoOrdemCompra : getListaProdutoOrdemCompra())
soma += produtoOrdemCompra.getPrecoTotal();
return soma;
}
}
O Quadro 18 apresenta a última classe da camada de domínio, a classe
ProdutoOrdemCompra. Esta classe tem como propósito estabelecer um
relacionamento de N para N com entre as classes Produto e OrdemCompra.
QUADRO 18 - Implementação da classe ProdutoOrdemCompra.
package net.uniplac.tcc.segurancaws.model;
import
import
import
import
import
import
import
import
import
import
java.io.Serializable;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
javax.persistence.ManyToOne;
javax.persistence.NamedQueries;
javax.persistence.NamedQuery;
javax.xml.bind.annotation.XmlElement;
javax.xml.bind.annotation.XmlTransient;
@Entity
@NamedQueries( {
@NamedQuery(name = "ProdutoOrdemCompra.findByIdProdutoOrdemCompra", query = "SELECT p
FROM ProdutoOrdemCompra p WHERE p.idProdutoOrdemCompra = :idProdutoOrdemCompra"),
@NamedQuery(name = "ProdutoOrdemCompra.findByQtdVendido", query = "SELECT p FROM
ProdutoOrdemCompra p WHERE p.qtdVendido = :qtdVendido"),
@NamedQuery(name = "ProdutoOrdemCompra.findByOrdemCompra", query = "SELECT p FROM
ProdutoOrdemCompra p WHERE p.ordemCompra = :ordemCompra"),
@NamedQuery(name
=
"ProdutoOrdemCompra.findByProduto",
query
=
"SELECT
p
FROM
ProdutoOrdemCompra p WHERE p.produto = :produto"),
@NamedQuery(name
=
"ProdutoOrdemCompra.findOrdemCompraByProduto",
query
=
"SELECT
p.ordemCompra FROM ProdutoOrdemCompra p WHERE p.produto = :produto")
})
public class ProdutoOrdemCompra implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private int qtdVendido;
@ManyToOne
private OrdemCompra ordemCompra;
@ManyToOne
private Produto produto;
public ProdutoOrdemCompra() {}
// getters and setters, equals, hashcode, toString...
@XmlElement
public double getPrecoTotal() {
return getProduto().getPrecoUnitario() * qtdVendido;
}
@XmlTransient
public OrdemCompra getOrdemCompra() {
return this.ordemCompra;
}
}
5.3.2 Fachada do sistema
A fachada do sistema é a camada que será exposta ao consumidor dos
serviços, esta camada é composta de dois Web Services, um para expor os métodos
para o cliente e outro para o administrador.
Nesta seção são apresentadas duas interfaces que compõem a fachada do
sistema, a interface da fachada do cliente e a interface da fachada do administrador.
Optou-se por uma metodologia de separação da implementação da interface, que
possibilita mudar a implementação da fachada sem mudar sua interface com o cliente,
provendo maior flexibilidade na hora da implementação. O que é exposto ao Web
Service são apenas as interfaces, caso haja a necessidade de se esconder um método do
Web Service apenas retira-se da interface que a classe implementa, ou caso haja a
necessidade de mudar a implementação do codigo do Web Service, pode-se apenas
mudar as classes que implementam a interface, o que não ocasionará nenhuma
mudança para o consumidor do serviço.
Os Web Services foram desenvolvidos com a tecnologia JAX-WS 2.0
apresentada no capítulo dois, também como a camada de persistência JPA
(apresentada na próxima seção), o JAX-WS faz parte da nova especificação Java EE
5, sendo assim ambos usam anotações para descrever no código fonte atributos e
configurações necessárias para seus propósitos, JPA para persistência, JAX-WS para
Web Services.
Para se desenvolver Web Services com a tecnologia JAX-WS é necessário
seguir algunas regras propostas pela tecnologia:
 Toda classe ou interface que for exposta como um Web Service, precisa
conter a anotação de classe javax.jws.WebService;
 Cada método que a classe deseja expor como uma operação de um Web
Service deve conter a anotação javax.jws.WebMethod;
A seguir é apresentado as duas interfaces que compõem a fachada do
sistema.
O Quadro 19 apresenta a interface do Web Service Cliente, que contém todos
os operações expostas para o cliente, como foi definido no capítulo quatro. O atributo
targetNamespace da anotação @WebService indica qual o namespace utilizado
na geração do XMLSchema do Web Service.
QUADRO 19 - Interface que representa a Fachada do Cliente.
package net.uniplac.tcc.segurancaws.services;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebService;
import
import
import
import
net.uniplac.tcc.segurancaws.model.Categoria;
net.uniplac.tcc.segurancaws.model.OrdemCompra;
net.uniplac.tcc.segurancaws.model.Produto;
net.uniplac.tcc.segurancaws.model.ProdutoOrdemCompra;
@WebService(targetNamespace="http://services.segurancaws.tcc.uniplac.net")
public interface ClienteWebServiceIF {
@WebMethod(operationName = "recuperar-produtos")
public List<Produto> recuperarProdutos();
@WebMethod(operationName = "recuperar-categorias")
public List<Categoria> recuperarCategorias();
@WebMethod(operationName = "recuperar-ordens-de-compra")
public List<OrdemCompra> recuperarOrdensCompra(String username);
@WebMethod(operationName = "fazer-compra")
public void fazerCompra(List<ProdutoOrdemCompra> produtos,
Long cartaoCredito, String username) throws Exception;
}
O Quadro 20 apresenta a interface da fachada do Administrador, com todos
os seus métodos expostos no Web Service, segundo a definição da análise realizada no
capítulo quatro.
QUADRO 20 - Interface que representa a Fachada do Administrador.
package net.uniplac.tcc.segurancaws.services;
import java.util.List;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import
import
import
import
net.uniplac.tcc.segurancaws.model.Categoria;
net.uniplac.tcc.segurancaws.model.Cliente;
net.uniplac.tcc.segurancaws.model.OrdemCompra;
net.uniplac.tcc.segurancaws.model.Produto;
@WebService(targetNamespace="http://services.segurancaws.tcc.uniplac.net")
public interface AdministradorWebServiceIF {
@WebMethod(operationName = "recuperar-categorias")
public List<Categoria> recuperarCategorias();
@WebMethod(operationName = "recuperar-produtos")
public List<Produto> recuperarProdutos();
@WebMethod(operationName = "recuperar-clientes")
public List<Cliente> recuperarClientes();
@WebMethod(operationName = "recuperar-todas-ordens-de-compra")
public List<OrdemCompra> recuperarTodasOrdensCompra();
@WebMethod(operationName = "salvar-produto")
public void saveProduto(@WebParam(name = "produto") Produto produto)
throws Exception;
@WebMethod(operationName = "salvar-cliente")
public void saveCliente(@WebParam(name = "cliente") Cliente cliente)
throws Exception;
@WebMethod(operationName = "salvar-categoria")
public void saveCategoria(@WebParam(name = "categoria") Categoria categoria)
throws Exception;
@WebMethod(operationName = "excluir-produto")
public void deleteProduto(@WebParam(name = "produto") Produto produto)
throws Exception;
@WebMethod(operationName = "excluir-cliente")
public void deleteCliente(@WebParam(name = "cliente") Cliente cliente)
throws Exception;
@WebMethod(operationName = "excluir-categoria")
public void deleteCategoria(@WebParam(name = "categoria") Categoria categoria)
throws Exception;
}
O que resta as classes que irão implementar essas interfaces é indicar o
caminho
do
pacote
da
@WebService(endpointInterface=””)
interface
que
no
neste
atributo
caso
seria,
net.uniplac.tcc.segurancaws.services.ClienteWebServiceIF
para
implementação
do
Web
Service
do
cliente
e
net.uniplac.tcc.segurancaws.services.AdministradorWebServi
ceIF para o Web Service do administrador.
5.3.3 Camada de persistência
Na camada de persistência do sistema optou-se por utilizar a tecnologia JPA,
que oferece uma camada de abstração da persistência e também oferece uma
portabilidade de SGBD para a aplicação, pois quando é necessário mudar de banco de
dados, apenas muda-se a fonte de dados no servidor da aplicação, sem necessidade se
quer de reimplantar a aplicação no servidor. A persistência dos objetos é realizada nas
classes de implementação das interfaces dos Web Services, que serão vistas na seção
seguinte.
5.3.3.1 O arquivo persistence.xml
Para se construir uma aplicação que faça uso da JPA deve-se ter uma ou mais
classes devidamente configurada com anotações da JPA seguindo as regras
apresentadas na seção anterior sobre a camada de modelo, o que indicam que são
persistíveis e, também, deve-se ter um arquivo de configuração com nome de
persistence.xml dentro do diretório META-INF localizado no diretório raiz dos
binários das classes, por exemplo: temos o pacote org.model onde encontra-se
nossas classes persistíveis, dentro do diretório que contém o pacote org deve existir o
diretório META-INF com o arquivo persistence.xml.
O arquivo persistence.xml é documento XML, como pode-se ver no
Quadro 23, é constituído pelo elemento raiz persistence que contém N elementos
persistence-unit (neste caso somente um) cada elemento deste representa uma
unidade de persistência, que pode ser referenciada por um nome (atributo name) e
associada a um banco de dados diferente. Cada unidade de persistência precisa indicar
o tipo de transação que irá trabalhar, existem duas opções:

Controle de transações interna da aplicação (valor RESOURCE_LOCAL
do atributo transaction-type do elemento persistenceunit), que a própria aplicação faz controle transacional com o banco de
dados, através da API JPA;

Transações controladas pelo servidor de aplicação, que faz uso da API
de transações JTA (Java Transaction API, valor JTA do atributo
transaction-type do elemento persistence-unit). JTA é
um recurso poderoso e flexível que é disponibilizado para aplicações
hospedadas no servidor, com ele é possível controlar não só transações
com banco de dados, mas também em métodos e recursos internos e
externos, possibilitando uma combinação de todos.
Optou-se pelo uso do controle interno transacional para o desenvolvimento
deste sistema, devido a necessidade da aplicação em operar na especificação servlet
2.4 (a versão do XWSS 2.0 somente opera em servelt 2.4), o que torna impossível a
utilização da JTA que só é disponível na especificação servlet 2.5 (que traz suporte a
injeção de dependência).
JPA não um framework de persistência, é uma especificação, sendo assim
possível mudar sua implementação conforme o desejado, a implementação utlizada
pelo servidor é o framework Hibernate, devido ao fato de se enfrentar algums
problemas durante o desenvolvimento com a implementação TopLink, que já é
instalada e previamente configurada no SJSAS 9, isso é especificado no arquivo
persistence.xml através do elemento provider, como pode ser visto no
Quadro 21.
QUADRO 21 - Arquivo de configuração da JPA, persistence.xml.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp:
//java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>jdbc/Seguranca-WS-DS</non-jta-data-source>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
O elemento non-jta-data-source indica qual a fonte de dados
(previamente configurado no servidor de aplicação na seção sobre a configuração do
SJSAS 9, note que aqui o nome da propriedade deve ser o mesmo do JDBC
Resource criado anteriormente) a aplicação irá usar. É através desta fonte de dados
que a JPA irá controlar as transações com o banco de dados.
Por fim, a unidade de persistência da espaço para se configurar algumas
propriedades do provider, através do elemento properties, cada sub-elemento
property representa uma propriedade com o seu nome (atributo name) e valor
(atributo value). Para esta aplicação foram utilizadas duas propriedades:
 hibernate.dialect=org.hibernate.dialect.Postgr
eSQLDialect. Indica qual SGBD é usado pela aplicação, o que
possibilita ao provider utilizar instruções SQL proprietárias do banco
de dados, otimizando assim o desempenho da persistência dos dados.
 hibernate.hbm2ddl.auto=update. Indica que a aplicação
gera e atualiza automaticamente a estrutura do banco de dados.
5.3.3.2 A persistência dos objetos
Para se persistir objetos, deve-se têr-los devidamente configurados com
anotações e, também, ter o arquivo persistence.xml apropriado para a aplicação.
Porém, para que a persistência realmente aconteça deve-se fazer uso da API do JPA
para controlar e manipular os objetos persistidos. Esta lógica está concentrada dentro
das classes que implementam as interfaces dos Web Services. Cada método faz uso de
recursos específicos da JPA para realizar uma tarefa de manipulação de dados, como
por exemplo, consultas, deleções e armazenamento de objetos.
O Quadro 23 apresenta a implementação do Web Service Administrador,
onde pode-se observar a anotação @WebService com dois atributos, um referente a
interface do Web Service, exposta na seção anterior, e outro indicando o nome do
serviço.
Para se fazer uso da JPA dentro de uma classe, é necessário ter uma instância
de um objeto EntityManager, que é obtida através de uma fábrica de
EntityManager (EntityManagerFactory), esta fábrica é criada baseada na
configuração do arquivo persistence.xml.
Cada método implementado da interface realiza uma tarefa distinta, por
exemplo, os métodos deleteXXX excluem do banco de dados, objetos passados para
ele através de um parâmetro, e os métodos saveXXX os salvam. Toda operação de
manipulação de dados necessita de uma transação, para que em caso de falha possa-se
recuperar o estado da base de dados, então, todo método que manipula os dados
começa com uma estrutura de tratamento de exceções try / catch, onde, dentro
dentro
do
bloco
try
inicia-se
uma
transação
(em.getTransaction().begin();) e após a conclusão da tarefa realiza-se a
confirmação do sucesso da operação (em.getTransaction().commit();),
caso alguma exceção for gerada, resultando uma falha na operação, o bloco catch
será
executado
desfazendo
a
tentativa
da
realização
da
operação
(em.getTransaction().rollback();).
Para salvar um objeto na base de dados através da JPA o processo é simples,
apenas utiliza-se o método persiste de uma EntityManager, passando por
parâmetro o objeto que deseja-se salvar. Porém para excluir um objeto o processo é
um pouco mais complexo, deve-se primeiro carregar o objeto que deseja-se excluir,
através do método merge do EntityManager, que irá retorna o objeto carregado
do banco de dados, após isso realizar a invocação do método remove da
EntiryManager passando-o por parâmetro o objeto que deseja-se excluir.
Os métodos recuperarXXX retornam, da base de dados, um objeto que
representa a lista do resultado de uma consulta. Esses métodos utilizam o objeto
Query, que representa uma consulta em uma base de dados, utilizando a linguagem
JPAQL, que é a linguagem específica para manipular objetos persistidos através da
JPA. Foi utilizadas consultas específicas para cada classe, previamente configuradas,
que são referenciadas através do atributo name da anotação @NamedQuery que se
encontra em cada classe persistída.
QUADRO 22 - Implementação do Web Service Administrador.
package net.uniplac.tcc.segurancaws.services;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import
import
import
import
import
javax.jws.WebService;
javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;
import
import
import
import
net.uniplac.tcc.segurancaws.model.Categoria;
net.uniplac.tcc.segurancaws.model.Cliente;
net.uniplac.tcc.segurancaws.model.OrdemCompra;
net.uniplac.tcc.segurancaws.model.Produto;
@WebService(endpointInterface
"net.uniplac.tcc.segurancaws.services.AdministradorWebServiceIF")
public class AdministradorWebServiceImpl implements AdministradorWebServiceIF {
Logger myLogger = Logger.getLogger(this.getClass().getName());
private EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU");
private EntityManager em;
=
public void deleteCategoria(Categoria categoria) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
Categoria delete = null;
delete = em.merge(categoria);
em.remove(delete);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Categoria: " + categoria + " foi excluido com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao excluir categoria:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
public void deleteCliente(Cliente cliente) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
Cliente delete = null;
delete = em.merge(cliente);
em.remove(delete);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Cliente: " + cliente + " foi excluido com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao excluir cliente:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
public void deleteProduto(Produto produto) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
Produto delete = null;
delete = em.merge(produto);
em.remove(delete);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Produto: " + produto + " foi excluido com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao excluir produto:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
public List<Cliente> recuperarClientes() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("Cliente.findAll");
return query.getResultList();
}
public List<OrdemCompra> recuperarTodasOrdensCompra() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("OrdemCompra.findAll");
return query.getResultList();
}
public List<Categoria> recuperarCategorias() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("Categoria.findAll");
return query.getResultList();
}
public List<Produto> recuperarProdutos() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("Produto.findAll");
return query.getResultList();
}
public void saveCategoria(Categoria categoria) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(categoria);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Categoria: " + categoria + " foi salva com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao salvar categoria:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
public void saveCliente(Cliente cliente) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(cliente);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Cliente: " + cliente + " foi salvo com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao salvar cliente:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
public void saveProduto(Produto produto) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(produto);
em.getTransaction().commit();
myLogger.log(Level.INFO,
"Produto: " + produto + " foi excluido com sucesso.");
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao salvar produto:\n" + ex.getMessage());
ex.printStackTrace();
em.getTransaction().rollback();
throw ex;
} finally {
em.close();
}
}
}
O Quadro 23 apresenta a implementação do Web Service Cliente, onde o
qual se difere do Web Service Administrador (Quadro 22) por apenas dois métodos,
fazerCompra, validarCartaoCredito.
QUADRO 23 - Implementação do Web Service Cliente.
package net.uniplac.tcc.segurancaws.services;
import
import
import
import
java.util.Date;
java.util.List;
java.util.logging.Level;
java.util.logging.Logger;
import
import
import
import
import
javax.jws.WebService;
javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;
import
import
import
import
import
net.uniplac.tcc.segurancaws.model.Categoria;
net.uniplac.tcc.segurancaws.model.Cliente;
net.uniplac.tcc.segurancaws.model.OrdemCompra;
net.uniplac.tcc.segurancaws.model.Produto;
net.uniplac.tcc.segurancaws.model.ProdutoOrdemCompra;
@WebService(endpointInterface = "net.uniplac.tcc.segurancaws.services.ClienteWebServiceIF")
public class ClienteWebServiceImpl implements ClienteWebServiceIF {
Logger myLogger = Logger.getLogger(this.getClass().getName());
private EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU");
private EntityManager em;
public void fazerCompra(List<ProdutoOrdemCompra> produtos,
Long cartaoCredito, String username) throws Exception {
try {
em = emf.createEntityManager();
em.getTransaction().begin();
myLogger.log(Level.INFO,
"Cliente " + username + " inicio uma ordem de compra.");
if (produtos.size() < 1) {
myLogger.log(Level.SEVERE,
"Lista de produtos invalida.");
throw new IllegalArgumentException(
"Lista de produtos invalida.");
}
if (!(validarCartaoCredito(cartaoCredito.toString()))) {
myLogger.log(Level.SEVERE,
"Cartão de credito do cliente " +
username + " é invalido");
throw new IllegalArgumentException(
"Cartão de credito invalido.");
}
Query query = em.createNamedQuery("Cliente.findByLogin")
.setParameter("login", username);
Cliente cliente = (Cliente) query.getSingleResult();
OrdemCompra ordemCompra = new OrdemCompra();
ordemCompra.setCliente(cliente);
ordemCompra.setDataRealizacao(new Date());
cliente.getOrdensCompra().add(ordemCompra);
ordemCompra.setCartaoCredito(cartaoCredito);
for (ProdutoOrdemCompra produtoOrdemCompra : produtos) {
Produto produto = produtoOrdemCompra.getProduto();
if (produto.getQdtEstoque() <
produtoOrdemCompra.getQtdVendido()){
String mensagem = "Quantidade do produto " +
produto.getNome() + " excedida";
myLogger.log(Level.SEVERE, mensagem);
throw new IllegalArgumentException(mensagem);
}
em.persist(produtoOrdemCompra);
ordemCompra.addProdutoOrdemCompra(produtoOrdemCompra);
}
em.persist(ordemCompra);
myLogger.log(Level.INFO,
"Cliente " + username + " finalizou a ordem de compra.");
em.getTransaction().commit();
} catch (Exception ex) {
myLogger.log(Level.SEVERE,
"Erro ao realizar ordem compra:\n" +
ex.getMessage());
em.getTransaction().rollback();
throw new Exception("Erro ao realizar ordem compra.", ex);
} finally {
em.close();
}
}
public List<Produto> recuperarProdutos() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("Produto.findAll");
return query.getResultList();
}
public List<Categoria> recuperarCategorias() {
em = emf.createEntityManager();
Query query = em.createNamedQuery("Categoria.findAll");
return query.getResultList();
}
public List<OrdemCompra> recuperarOrdensCompra(String login) {
em = emf.createEntityManager();
Query query = em.createNamedQuery("OrdemCompra.findByCliente");
query.setParameter("login", login);
return query.getResultList();
}
private boolean validarCartaoCredito(String cartaoCredito) {
char[] charArray = cartaoCredito.toCharArray();
int[] numero = new int[charArray.length];
int total = 0;
for (int i = 0; i < charArray.length; i++) {
numero[i] = Character.getNumericValue(charArray[i]);
}
for (int i = numero.length - 2; i > -1; i -= 2) {
numero[i] *= 2;
if (numero[i] > 9)
numero[i] -= 9;
}
for (int i = 0; i < numero.length; i++)
total += numero[i];
if (total % 10 != 0)
return false;
return true;
}
}
O método fazerCompra recebe como parâmetro uma lista de
ProdutoOrdemCompra e um número de cartão de crédito. O número de cartão de
crédito é validado através do método validarCartaoCredito (este método não é
exposto no Web Service, pois não faz parte da interface que essa classe implementa).
Ambas as classes de implementação dos Web Services utilizam o recurso de
Logging disponibilizado pela API de Logging do Java SE, cada classe cria um objeto
Logger para realizar as operações de logging. Esse tipo de recurso facilita a tarefa de
desenvolvimento, teste e depuração de uma aplicação, pois pode se monitorar o
comportamento da aplicação através da mensagem de logging, descobrindo assim
possíveis bugs.
5.4 Implementação da segurança
Para se aplicar a segurança na camada de mensagem foi utilizado o
framework XWSS 2.0 que é descrito no segundo capítulo. A camada de segurança é
totalmente independente da lógica do sistema, sendo assim possível ser acoplada com
facilidade na aplicação. Para isso ser possível o servidor de aplicação deve estar
devidamente configurado como foi descrito na seção Instalação e configuração do
ambiente deste capítulo.
O framework XWSS 2.0 necessita de alguns artefatos para seu
funcionamento, que são os arquivos de segurança e as classes tratadoras de segurança
(CallbackHandlers).
5.4.1 Arquivo de segurança
O arquivo de segurança é um documento XML que especifica como é
implementada a segurança na troca de mensagens entre o Web Service e seu cliente.
Deve-se ter um cuidado especial na hora da nomeação deste arquivo, pois o mesmo é
carregado pelo servidor através de seu nome, fazendo assim a ligação do arquivo com
o Web Service especifico. No caso de somente um Web Service na aplicação, o arquivo
pode ser nomeado como server_security_config.xml que o servidor ira
reconhecer que se trata do arquivo de segurança do XWSS 2.0.
Porém, se há mais de um Web Service, os arquivos relativos a cada Web
Service devem ser nomeado conforme a propriedade service, que se encontra no
arquivo sun-jaxws.xml (descrito na seção de arquivos de configuração do
sistema) ou então no atributo serviceName da anotação @WebService da classe
que implementa o serviço.
O
Quadro
24
apresenta
a
codificação
administrador_sercurity_config.xml
referente
do
ws-
arquivo
ao
Web
Service
Administrador que descreve como deve ser aplicada a segurança neste serviço.
QUADRO 24 - Arquivo de segurança do Web Service Administrador.
<?xml version="1.0" encoding="UTF-8"?>
<xwss:JAXRPCSecurity xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/xwss/config xwss.xsd ">
<xwss:Service conformance="bsp">
<xwss:SecurityConFiguration dumpMessages="true">
<xwss:RequireEncryption />
<xwss:RequireUsernameToken passwordDigestRequired="false" />
<xwss:Sign>
<xwss:X509Token certificateAlias="provedor" />
</xwss:Sign>
<xwss:Encrypt>
<xwss:X509Token certificateAlias="consumidor" />
</xwss:Encrypt>
</xwss:SecurityConFiguration>
</xwss:Service>
<xwss:SecurityEnvironmentHandler>
net.uniplac.tcc.segurancaws.services.handlers.AdministradorSecurityHandler
</xwss:SecurityEnvironmentHandler>
</xwss:JAXRPCSecurity>
Pode-se observar que o documento é composto por seu elemento raiz
JAXRPCSecurity que é composto por dois nós, o nó Service e o nó
SecurityEnvironmentHandler.
O nó SecurityEnvironmentHandler contém o nome da classe que
implementa o tratamento da segurança referente aquele Web Service (a classe
CallbackHandler, que será abordada na seção seguinte).
O nó Service é o nó que descreve como que será aplicada as diretrizes de
segurança no Web Service. Neste caso, observando o documento, pode-se dizer que a
mensagem seguirá o seguinte esquema de segurança: toda mensagem recebida deve
ser criptografada (indicado pelo elemento RequireEncryption), seguida de um
username e password (indicado pelo elemento RequireUsernameToken) e toda
mensagem enviada deve ser assinada digitalmente (indicada pelo elemento Sign) e
após deve ser criptografada (indicado pelo elemento Encrypt).
Percebe-se que a ordem dos elementos de Service faz toda a diferença no
esquema de segurança. Por exemplo, para indicar que a mensagem enviada vai ser
assinada digitalmente e depois criptografada, deve-se inserir primeiro o elemento
Sign e depois o elemento Encrypt, e a ordem inversa deve ser obedecida no
consumidor deste serviço, onde o elemento RequireEncryption deve vir
primeiro, e o RequireSignature logo após, isso por que a mensagem foi primeiro
assinada digitalmente e depois criptografada, então, para se obter o conteúdo, primeiro
deve descriptografar a mensagem e depois verificar a assinatura, similar a uma
estrutura de dados pilha.
Para se assinar digitalmente ou criptografar uma mensagem deve-se indicar
qual chave que será usada no processo. As chaves são obtidas através da classe
CallbackHandler, onde é lá que contem a lógica para a realização da tarefa.
Então
cabe
ao
arquivo
descritor
de
segurança
(ws-
administrador_security_config.xml) indicar qual chave deve ser usada e
em qual processo. No caso do Web Service Administrador, é usado a chave pública do
consumidor (cliente do Web Service) para criptografar a mensagem e a chave privada
do provedor (servidor que prove o serviço) para assiná-la digitalmente.
Também é possível, especificar esquema de segurança diferente para cada
método do Web Service, como é visto no Quadro 25 que apresenta o arquivo wscliente_security_config.xml que é o arquivo de configuração de segurança
referente ao Web Service Cliente.
QUADRO 25 - Arquivo de segurança do Web Service Cliente.
<?xml version="1.0" encoding="UTF-8"?>
<xwss:JAXRPCSecurity
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"
xsi:schemaLocation="http://java.sun.com/xml/ns/xwss/config xwss.xsd ">
<xwss:Service conformance="bsp">
<xwss:Port name=
"{http://services.segurancaws.tcc.uniplac.net}ClienteWebServiceImplPort">
<xwss:SecurityConFiguration dumpMessages="true">
<xwss:RequireEncryption />
<xwss:RequireUsernameToken passwordDigestRequired="false" />
<xwss:Sign>
<xwss:X509Token certificateAlias="provedor" />
</xwss:Sign>
<xwss:Encrypt>
<xwss:X509Token certificateAlias="consumidor" />
</xwss:Encrypt>
</xwss:SecurityConFiguration>
<xwss:Operation name=
"{http://services.segurancaws.tcc.uniplac.net}fazer-compra">
<xwss:SecurityConFiguration dumpMessages="true">
<xwss:RequireEncryption />
<xwss:RequireSignature />
<xwss:RequireUsernameToken
passwordDigestRequired="false" />
<xwss:Sign>
<xwss:X509Token certificateAlias="provedor" />
</xwss:Sign>
<xwss:Encrypt>
<xwss:X509Token certificateAlias="consumidor" />
</xwss:Encrypt>
</xwss:SecurityConFiguration>
</xwss:Operation>
</xwss:Port>
<xwss:SecurityEnvironmentHandler>
net.uniplac.tcc.segurancaws.services.handlers.ClienteSecurityHandler
</xwss:SecurityEnvironmentHandler>
</xwss:Service>
<xwss:SecurityEnvironmentHandler>
net.uniplac.tcc.segurancaws.services.handlers.ClienteSecurityHandler
</xwss:SecurityEnvironmentHandler>
</xwss:JAXRPCSecurity>
O elemento Port refere-se a um elemento Port do WSDL do Web Service
(apresentado no capítulo dois). Cada Port possui vários elementos Operation, que
são mapeados pelo JAX-WS a cada método correspondente na classe que implementa
o Web Service, e para cada Operation, ou então para o Port por completo, é
possível especificar um tipo diferente de esquema de segurança. Como pode-se
observar no Quadro 25, o esquema de segurança do Web Service Cliente é similar ao
do Web Service Administrador, exceto pelo método fazerCompra que recebe um
esquema diferente de segurança. Este esquema foi especificado no capítulo quatro no
levantamento de requisitos do sistema, onde, toda ordem de compra realizada por um
cliente deve ser assinada digitalmente por ele para oferecer subsídios futuros para
provar o não-repúdio da operação. Então baseado nessas necessidades especificou-se o
esquema deste método da seguinte forma: a mensagem recebida dese ser uma
mensagem que primeiro foi acrescida de um Username/Password, depois assinada
digitalmente e, por fim, criptografada; e a resposta é primeiramente assinada
digitalmente e após isso criptografada.
Também é possível especificar, através de consultas XPath, o elemento da
mensagem que se deseja aplicar a segurança. Este recurso não foi aplicado ao sistema
desenvolvido devido a falta de necessidade, porém é um recurso válido e que fornece
uma flexibilidade ainda maior na especificação de segurança. Por exemplo, no caso do
método fazerCompra poderia se aplicar a segurança da criptografia somente no
número de cartão de crédito do cliente, tornando-o ilegível para terceiros.
5.4.2 Codificação dos CallbackHandlers
Como descrito na seção anterior, as classes CallbackHandler servem
para tratar elementos de segurança contidos nas mensagens SOAP e são setados nos
arquivos de configuração de segurança dos Web Services e dos clientes do serviço.
A classe que trata esses elementos deve implementar a interface
ClallbackHandler do pacote javax.security.auth.callback, essa
interface especificar um método, que é o handle, o qual deve ser implementado e
que recebe por parâmentro um array de Callback. Um objeto Callback
representa um elemento especifico de segurança:
 PasswordValidationCallback, que trata da validação de
Callbacks Username/Password;
 TimestampValidationCallback, que representa a estampa do
tempo em que a mensagem foi gerada e transmitida;
 SignatureVerificationKeyCallback, que trata da verificação
de uma assinatura digital conforme a base de chaves confiaveis;
 SignatureKeyCallback, que trata da aplicação de uma assinatura
digital;
 DecryptionKeyCallback, que trata da descriptografia de um
elemento criptografado;
 EncryptionKeyCallback, que trata da criptografia de um elemento;
 CertificateValidationCallback, que trata da validação de um
certificado digital;
 PasswordCallback, que trata da configuração do password contido
na mensagem a ser enviada;
 UsernameCallback, que trata da configuração do username da
mensagem a ser enviada.
Todos esses Callbacks são tratados pelas classes CallbackHandler,
ambos do servidor e do cliente (as classes CallbackHandler do servidor tratam
todos os Callbacks exeto o PasswordCallback e o UsernameCallback, em
contra partida, a classe CallbackHandler do cliente trata todos os Callbacks exeto
o PasswordValidationCallback).
Para cada Callback foi criado um método especializado para tratá-lo, cada
método contem uma lógica específica para o seu Callback, fazendo uso de API e
framework de criptografia, certificação e assinatura digital para documentos XML.
Esses trechos de código foram copiados das classes exemplos distribuidas em conjunto
com JWSDP 2.0, essa prática é recomendada pela SUN MICROSYSTEMS (2005h)
devido ao fato de se ter uma implementação testada e com garantia de eficiência e
desempenho.
A implementação do CallbackHandler do cliente do Web Service,
apresentado no Quadro 26, é feita pela classe SecurityCallbackHandler do
pacote net.uniplac.tcc.segurancaws.client.handler do projeto do
cliente. Esta classe segue o o padrão da implementação proposta pela SUN
MICROSYSTEMS (2005h). Porém, com várias modificações na legibilidade do
código e também acrescenta o tratamento dos Callbacks PasswordCallback e
UsernameCallback. Os dados referentes ao Username e Password da aplicação
são extraídos do arquivo de propriedades da aplicação (esse arquivo é apresentado na
seção sobre arquivos de configuração do sistema).
QUADRO 26 - Implementação da classe SecurtyCallbackHandler.
package net.uniplac.tcc.segurancaws.client.handler;
// importações das classes utilizadas...
public
class SecurityCallbackHandler implements CallbackHandler {
private String keyStoreURL;
private String keyStorePassword;
private String keyStoreType;
private String myUsername;
private String myPassword;
private KeyStore keyStore;
private static final String FILE_SEPARATOR = System.getProperty("file.separator");
private static final String FILE_PROPERTIES = "conf" + FILE_SEPARATOR +
"client-security-env.properties";
public SecurityCallbackHandler() throws Exception {
Properties properties = new Properties();
FileInputStream in = new FileInputStream(FILE_PROPERTIES);
properties.load(in);
this.keyStoreURL = properties.getProperty("keystore.url");
this.keyStoreType = properties.getProperty("keystore.type");
this.keyStorePassword = properties.getProperty("keystore.password");
this.myUsername = properties.getProperty("my.username");
this.myPassword = properties.getProperty("my.password");
in.close();
initKeyStore();
}
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i=0; i < callbacks.length; i++) {
if (callbacks[i] instanceof PasswordCallback) {
passwordCallback(callbacks[i]);
} else if (callbacks[i] instanceof UsernameCallback) {
usernameCallback(callbacks[i]);
} else if (callbacks[i] instanceof TimestampValidationCallback) {
timestampValidationCallback(callbacks[i]);
} else if (callbacks[i] instanceof SignatureVerificationKeyCallback) {
signatureVerificationKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof SignatureKeyCallback) {
signatureKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof DecryptionKeyCallback) {
decryptionKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof EncryptionKeyCallback) {
encryptionKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof CertificateValidationCallback) {
certificateValidationCallback(callbacks[i]);
} else {
throw new UnsupportedCallbackException(null,
"Unsupported Callback Type Encountered");
}
}
}
// implementação dos métodos tratadores dos CallBacks...
}
As implementações dos CallbackHandler dos Web Services são um
pouco mais complexas, comparando-se com a do cliente. A princípio foram
desenvolvidas três classes. Uma classe com a implementação padrão para o tratamento
dos Callbacks de estampa de tempo, criptografia, assinatura digital e certificado
digital. Esta implementação não mudar conforme o Web Service, ela é padronizada
pela SUN MICROSYSTEMS (2005h). Tanto é que a implementação do
CallbackHandler do cliente é muito similar (difere-se apenas pelo trantamento
dos Callbacks Username e Password) em relação ao do servidor. Esta classe então foi
nomeada como DefaultSecurityHandler, descrita no Quadro 27.
QUADRO 27 - Implementação da classe DefaultSecurityHandler.
package net.uniplac.tcc.segurancaws.services.handlers;
// importações das classes utilizadas...
public abstract class DefaultSecurityHandler implements CallbackHandler {
Logger myLogger = Logger.getLogger(this.getClass().getName());
private String keyStoreURL;
private String keyStorePassword;
private String keyStoreType;
private KeyStore keyStore;
public static final String FILE_PROPERTIES = "../server-security-env.properties";
public DefaultSecurityHandler() throws Exception {
myLogger.log(Level.WARNING, "Iniciando properties.");
Properties properties = new Properties();
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream(FILE_PROPERTIES);
properties.load(in);
myLogger.log(Level.WARNING, "Recuperando as propriedades.");
String keyStoreFilePath = properties.getProperty("keystore.file");
this.keyStoreURL = this.getClass().getClassLoader()
.getResource(keyStoreFilePath).getPath();
this.keyStoreType = properties.getProperty("keystore.type");
this.keyStorePassword = properties.getProperty("keystore.password");
in.close();
myLogger.log(Level.WARNING, "Iniciando o keystore.");
initKeyStore();
myLogger.log(Level.WARNING,
"Construtor AdministradorSecurityHandler concluido.");
}
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof PasswordValidationCallback) {
myLogger.log(Level.WARNING, "passwordValidationCallback");
passwordValidationCallback(callbacks[i]);
} else if (callbacks[i] instanceof TimestampValidationCallback) {
myLogger.log(Level.WARNING, "timestampValidationCallback");
timestampValidationCallback(callbacks[i]);
} else if (callbacks[i] instanceof SignatureVerificationKeyCallback) {
myLogger.log(Level.WARNING, "signatureVerificationKeyCallback");
signatureVerificationKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof SignatureKeyCallback) {
myLogger.log(Level.WARNING, "signatureKeyCallback");
signatureKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof DecryptionKeyCallback) {
myLogger.log(Level.WARNING, "decryptionKeyCallback");
decryptionKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof EncryptionKeyCallback) {
myLogger.log(Level.WARNING, "encryptionKeyCallback");
encryptionKeyCallback(callbacks[i]);
} else if (callbacks[i] instanceof CertificateValidationCallback) {
myLogger.log(Level.WARNING, "certificateValidationCallback");
certificateValidationCallback(callbacks[i]);
} else {
myLogger.log(Level.WARNING, "Unsupported");
throw new UnsupportedCallbackException(null,
"Unsupported Callback Type Encountered");
}
}
}
// restante da implementação dos metodos Callback
// definição do método abstrato
public abstract void passwordValidationCallback(Callback callback)
throws UnsupportedCallbackException;
// restante da implementação dos metodos Callback
}
O fator que difere a implementação do CallBackHandler do Web
Service Administrador do Web Service Cliente é a validação do CallBack
Password / Username. Cada Web Service deve realizar uma validação diferente
em sua base de dados, uma para o administrador do sistema, e outra para o cliente.
Baseado nessa necessidade é que a classe DefaultSecurityHandler ganho o
modificador abstract na sua definição. O modificador abstract define que é
impossível para classe que o possua criar instâncias de objetos, somente através de
uma sub-classe (herança) é possível instanciar objetos filhos de uma super-classe
abstrata. Porém, é possível especificar que os filhos de uma classe abstrata devão
implementar um ou mais métodos especificados pelo seu pai.
No caso do DefaultSecurityHandler, foi definito o método
passwordValidationCallback como abstrato. Sendo assim, toda classe que
herdar de DefaultSecurityHandler deve implementar esse método que é
específico para validação de usuários através dos Callbacks
Username e
Password.
Então, com base na classe DefaultSecurityHandler, foram criadas
duas
classes
especificas
para
cada
Web
Service,
AdministradorSecurityHandler para o Web Service Administrador e
ClienteSecurityHandler para o Web Service Cliente. Esta abordagem foi
escolhida devido ao fato da enorme repetição de código em ambas as classes caso não
existisse uma classe pai, sendo assim, a classe pai realiza o trabalho em comum entre
as duas classes, deixando espaço para a especialização da validação de usuários de
cada classe filho.
Como descrito acima, cada classe filho de DefaultCallbackHandler
necessita implementar o método passwordValidationCallback. No Quadro
28 é apresentando a classe AdministradorSecurityHanler que especializa a
classe DefaultCallbackHandler para a validação do usuário administrador.
QUADRO 28 - Implementação da classe AdministradorSecurityHanler.
package net.uniplac.tcc.segurancaws.services.handlers;
import
import
import
import
java.io.InputStream;
java.util.Properties;
java.util.logging.Level;
java.util.logging.Logger;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;
import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
public class AdministradorSecurityHandler extends DefaultSecurityHandler {
private String admLogin;
private String admPassword;
private Logger myLogger = Logger.getLogger(this.getClass().getName());
public AdministradorSecurityHandler() throws Exception {
super();
Properties properties = new Properties();
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream(FILE_PROPERTIES);
properties.load(in);
this.admLogin = properties.getProperty("adm.login");
this.admPassword = properties.getProperty("adm.password");
myLogger.log(Level.INFO, "Dados do administrador caregados com sucesso.");
in.close();
}
public void passwordValidationCallback(Callback callback)
throws UnsupportedCallbackException {
PasswordValidationCallback cb = (PasswordValidationCallback) callback;
if (cb.getRequest() instanceof
PasswordValidationCallback.PlainTextPasswordRequest) {
cb.setValidator(new PlainTextPasswordValidator());
myLogger.log(Level.INFO, "Administrador logado com sucesso.");
} else {
myLogger.log(Level.WARNING,
"Falha na autentificação do administrador.");
throw new UnsupportedCallbackException(null,
"Unsupported Password Validation Callback Type Encountered");
}
}
private class PlainTextPasswordValidator
implements PasswordValidationCallback.PasswordValidator {
public boolean validate(PasswordValidationCallback.Request request)
throws PasswordValidationCallback.PasswordValidationException {
String username = null;
String password = null;
if (request instanceof
PasswordValidationCallback.PlainTextPasswordRequest) {
PasswordValidationCallback.PlainTextPasswordRequest
plainTextCallback =
(PasswordValidationCallback.PlainTextPasswordRequest) request;
username = plainTextCallback.getUsername();
password = plainTextCallback.getPassword();
if (admLogin.equals(username) && admPassword.equals(password))
return true;
}
return false;
}
}
}
No construtor da classe AdministradorSecurityHanler é obtido o
username e o password do administrador do sistema, logo após é implementado o
método abstrato da classe pai. Para se validar um username / password o framework
XWSS 2.0 exige que o desenvolvedor crie uma classe que implemente a interface
interna
PasswordValidator
contida
dentro
da
classe
PasswordValidationCallback. Esta interface define um método validate
que tem como contrato retornar um valor boleano, verdadeiro se o usuário é valido,
falso caso não seja.
Com base nisso é comparado o username / password da requisição com o
valor contido no arquivo de propriedade, e definido assim se o administrador passou
ou não os argumentos corretos. Caso verdadeiro a sua operação é autorizada, caso
contrário é retornado uma mensagem contendo um <SOAP-FAULT> indicando que o
usuário não é válido para realizar tal operação.
O que difere a classe AdministradorSecurityHanler da classe
ClienteSecurityHandler, apresentada no Quadro 29, é a lógica de validação
do usuário. Na classe ClienteSecurityHandler o usuário é validade conforme
a base de dados da aplicação. Através do login e pela JPA é obtido o cliente, e assim é
feita a validação comparando com os argumentos passados pela requisição
(Callback Username / Password).
QUADRO 29 - Implementação da classe ClienteSecurityHandler.
package net.uniplac.tcc.segurancaws.services.handlers;
import java.util.logging.Level;
import java.util.logging.Logger;
import
import
import
import
import
javax.persistence.EntityManager;
javax.persistence.PersistenceContext;
javax.persistence.Query;
javax.security.auth.callback.Callback;
javax.security.auth.callback.UnsupportedCallbackException;
import net.uniplac.tcc.segurancaws.model.Cliente;
import com.sun.xml.wss.impl.callback.PasswordValidationCallback;
public class ClienteSecurityHandler extends DefaultSecurityHandler {
@PersistenceContext(name = "PU")
private EntityManager em;
private Logger myLogger = Logger.getLogger(this.getClass().getName());
public ClienteSecurityHandler() throws Exception {
super();
}
public void passwordValidationCallback(Callback callback)
throws UnsupportedCallbackException {
PasswordValidationCallback cb = (PasswordValidationCallback) callback;
if (cb.getRequest() instanceof PasswordValidationCallback.PlainTextPasswordRequest) {
PasswordValidationCallback.PlainTextPasswordRequest
request = (PasswordValidationCallback.PlainTextPasswordRequest)
cb.getRequest();
cb.setValidator(new PlainTextPasswordValidator());
myLogger.log(Level.INFO, "Cliente " + request.getUsername() +
" autenticado com sucesso.");
} else {
myLogger.log(Level.WARNING, "Falha na autentificação do cliente.");
throw new UnsupportedCallbackException(null,
"Unsupported Password Validation Callback Type Encountered");
}
}
private class PlainTextPasswordValidator
implements PasswordValidationCallback.PasswordValidator {
public boolean validate(PasswordValidationCallback.Request request)
throws PasswordValidationCallback.PasswordValidationException {
String username = null;
String password = null;
Cliente cliente = null;
if (request instanceof
PasswordValidationCallback.PlainTextPasswordRequest) {
PasswordValidationCallback.PlainTextPasswordRequest
plainTextCallback =
(PasswordValidationCallback.PlainTextPasswordRequest) request;
username = plainTextCallback.getUsername();
password = plainTextCallback.getPassword();
try {
Query query = em.createNamedQuery("Cliente.findByLogin")
.setParameter("login", username);
cliente = (Cliente) query.getSingleResult();
if (cliente != null &&
cliente.getPassword().equals(password)) {
return true;
} else {
return false;
}
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
return false;
}
}
}
5.5 Arquivos de configuração do sistema
Os sistemas, tanto servidor como cliente, são compostos, além do código
fonte, por uma série de arquivos de configurações e bibliotecas necessárias para a sua
execução. Nesta seção será explanado cada um destes arquivos, sua codificação e
funcionalidade.
O que ambos os sistemas tem em comum é somente as bibliotecas (arquivos
de extensão .jar), que contém as APIs necessárias para codificação e execução do
sistema, até então citadas anteriormente no trabalho. Esses arquivos são: appservrt.jar, appserv-ws.jar, activation.jar e javaee.jar. Todos
esses arquivos podem ser encontrados dentro do diretório lib da instalação do
servidor SJSAS 9.
5.5.1 Arquivos do servidor
 provedor.jks: o arquivo provedor.jks é onde está armazenado as
chaves e certificados digitais do servidor do Web Services. Este arquivo foi
construído pela ferramenta keytool que acompanha a ditribuição do JDK
5. Estes arquivos contem, o par de chave pública e privada do servidor, com
o nome de provedor e, também, contém o certificado digital do cliente, com
nome de consumidor. Este trabalho de importar e exportar certificados
digitais através dos arquivos de armazenamento de chaves assimétricas foi
realizado pela ferramenta keytool.
 sun-jaxws.xml: o arquivo sun-jaxws.xml é o descritor do conjunto
de Web Services contidos dentro da aplicação, é nele que se específica o
nome do Web Service, interface do Web Service e a classe que implementa,
o name space do Web Service e a URL de acesso ao serviço.
 web.xml: web.xml é o arquivo descritor de todas as aplicações Web para
plataforma Java EE, no caso desta aplicação, é neste arquivo que se indica a
classe servelt da API do JAX-WS que fará o tratamento das requisições
HTTP aos serviços.
 server-security-env.properties: este arquivo foi criado devido
a necessidade de externalizar alguns parâmetro de configuração da
aplicação, ele não faz parte de nenhuma API ou framework, é carregado
manualmente pela aplicação. Este arquivo de propriedades contém, o
endereço relativo do arquivo de chaves assimétricas e certificados digitais,
também contém a senha necessária para o acesso dos dados do arquivo de
chaves, e também contem o login e password do administrador do sistema,
eliminando a necessidade do armazenamento do mesmo em uma base de
dados.
 build.xml: o arquivo build.xml é o arquivo usando pela Ant, que
tem como propósito automação de tarefas para construção de aplicações,
tarefas como, empacotar, criar diretórios base, fazer limpeza de artefatos
desnecessários, compilar código fonte e também, no caso de uma aplicação
que faça uso do JAX-WS, gerar classes e artefatos necessários para a
construção do Web Service.
5.5.2 Arquivos do cliente
 client-security-env.properties: este arquivo é similar ao
arquivo de propriedades que se encontra no projeto do servidor, porém a
diferença é que este armazena o login / password do cliente no sistema,
esses dados serão enviados por cada requisição para serem autenticados no
servidor do Web Service;
 consumidor.jks: este arquivo é similar ao arquivo de chaves de
criptografia assimétrica encontrado no projeto do servidor, porém aqui é que
se armazena o par de chaves do cliente (consumidor);
 MANIFEST.MF: esse arquivo é o descritor do arquivo de distribuição da
aplicação cliente, nele é necessário indicar qual é classe principal (que
possui o método main) e as bibliotecas necessárias para a execução da
aplicação, como pode ser visto no Quadro 30:
QUADRO 30 - Arquivo MANIFEST.MF do projeto Cliente.
Manifest-Version: 1.0
Main-Class: net.uniplac.tcc.segurancaws.client.main.Main
Created-By: Fernando Luiz Parisotto
Class-Path: lib\appserv-rt.jar lib\appserv-ws.jar lib\j2ee.jar
lib\javaee.jar lib\tinylaf.jar
 ws-administrador_security_config.xml
e
ws-
cliente_security_config.xml: estes arquivos já foram discutidos
na seção sobre arquivos de segurança deste capítulo.
 bindings-administrador.xml
e
bindings-cliente.xml:
ambos arquivos são usados na geração dos artefatos dos clientes do Web
Services, nesses arquivos é possível customizar estes artefatos gerados. Foi
utilizado pelo trabalho o recurso de clientes assíncronos do JAX-WS, que é
descrito
através
do
<enableAsyncMapping>true</enableAsyncMapping>
elemento
nos
arquivos bindings.
5.6 Desenvolvimento do cliente Web Service
Com intuito de demonstração do ambiente proposto pelo trabalho, foi
desenvolvido um cliente para os Web Services expostos nas seções anteriores. O
cliente foi desenvolvido utilizando a plataforma Java SE, e a sua interface gráfica foi
desenvolvida com Toolkit Swing, em conjunto com as demais APIs de Web Services
do Java EE e de segurança do XWSS 2.0.
O software cliente segue o contrato dos Web Services, que foram abordados
no capítulo de modelagem. O sistema cliente é constituído basicamente pelos artefatos
gerados pela ferramenta de importação de Web Services do JAX-WS (wsimport), pelas
classes responsáveis pela GUI (Graphical user interface), pela classe responsável pelo
tratamento da segurança (semelhante as classes CallbackHandler abordadas nas
seções de segurança do servidor) e pelos arquivos de configuração (abordados na
seção anterior).
O cliente apresenta a interface inicial (Figura 13) que faz a distinção entre o
usuário Administrador e o usuário Cliente, através de um diálogo de login do sistema.
A interface é subdividida em abas, cada uma com seu devido assunto: produtos,
clientes, ordens de compra e carrinho de compra. Cada aba apresenta as operações
possíveis para o usuário, referente ao assunto da aba, e também, logo abaixo se tem
uma tabela com os dados do sistema para o assunto.
FIGURA 13 - Imagem da janela principal do sistema.
Na aba produto, o Cliente apenas poderá adicionar o produto no seu carrinho
de compras ou então recuperar os produtos do sistema. Já o Administrador poderá
efetuar operações cadastrais sobre as Categorias e os Produtos, também podendo
recuperá-los do estoque. Como o Administrador é encapas de efetuar uma Ordem de
Compra, o mesmo não poderá adicionar um produto ao carrinho de compras.
Na aba de Clientes (acessível somente para o Administrador) é possível
efetuar operações cadastrais sobre os Clientes, também como ver os dados contidos no
sistema referentes a essa entidade.
Na aba Ordem Compra, da qual tanto o Administrador e o Cliente têm
acessos, ambos podem recuperar Ordens de Compra (o cliente somente as suas) e ver
seus detalhes (listas de produtos).
Finalmente é através da aba Carrinho de Compra que os Clientes realizam
suas Ordens de Compra. Como o próprio nome da aba já diz, a aba carrinho de compra
representa uma espécie de cesta de compra, onde o cliente armazena os Produtos
selecionados no catálogo em conjunto com a quantidade que este deseja comprar e
através do botão Fazer Compra que será realizada a Ordem de Compra, porém
antes é perguntado (através de um dialogo de entrada de dados) para o Cliente o seu
número de cartão de credito.
5.7 Demonstração do ambiente
Para se verificar os resultados esperados é necessário ter acesso as
mensagens trocadas entre o cliente e o servidor, esses dados são obtidos através do
recurso de log disponibilizado pelo XWSS 2.0, este recurso é habilitado no arquivo de
configuração de segurança do Web Service, tanto no cliente como no servidor, pelo
atributo dumpMessages do elemento SecurityConFiguration. No cliente
será mostrado as mensagens no console default do sistema, no servidor será escrito nos
arquivos de log.
Para demonstração da segurança foi escolhida a operação fazer compra do
Web Service cliente, devido a sua maior complexidade relativa aos outras operações e
também por envolver dados supostamente críticos, como o número de cartão de
credito do cliente.
5.7.1 Web Service não seguro
O Quadro 31 demonstra uma troca de mensagem entre o cliente e o servidor
sem nenhum esquema de segurança, neste momento, foi desabilitado as políticas de
segurança do servidor e do cliente, para que isso fosse possível foi apenas comentado
o conteúdo do elemento SecurityConFiguration nos arquivos referentes a
segurança do servidor e do cliente.
QUADRO 31 - Quadro demonstrando a troca de mensagens não seguras.
<!—Inicio da mensagem de requisição-->
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:fazer-compra
xmlns:ns2="http://services.segurancaws.tcc.uniplac.net">
<produtos>
<precoTotal>0.0</precoTotal>
<produto>
<categoria>
<id>1</id>
<nome>Tábua</nome>
<unidade>Métros quadrados</unidade>
</categoria>
<id>1</id>
<nome>Pínus</nome>
<precoUnitario>100.0</precoUnitario>
<qdtEstoque>500</qdtEstoque>
</produto>
<qtdVendido>5</qtdVendido>
</produtos>
<cartaoCredito>5215220180348249</cartaoCredito>
<username>fernando</username>
</ns2:fazer-compra>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!—Fim da mensagem de requisição -->
<!—Inicio da mensagem de resposta -->
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header />
<SOAP-ENV:Body>
<ns2:fazer-compraResponse
xmlns:ns2="http://services.segurancaws.tcc.uniplac.net" />
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!—Fim da mensagem de resposta -->
Como se pôde observar no Quadro 31, a mensagem não está criptografada ou
assinada digitalmente, pois os dados estão legíveis e nenhum elemento XML espefíco
de segurança foi adicionado ao documento. Se um intermediário da rede entre o cliente
e o servidor estivesse executando um software de captura de pacotes TCP/IP seria
capaz de recuperar todos os pacotes da mensagem trocada, montá-los e obter de forma
indevida as informações trocadas, sem o conhecimento e autorização das partes
interessadas (cliente e servidor).
Também à outro fator agravante, neste cenário não há como se autenticar o
usuario através da mensagem do cliente que requesita o serviço, devido a ausência dos
Tokens de Username e Password, porém, pode-se utilizar mecanismos de autenticação
do protocolo HTTP, também como criptografia sobre o mesmo através de uma
conexão SSL, sendo assim a mensagem estaria segura através da camada de transporte.
5.7.2 Web service seguro
O Quadro 32 apresenta um cenário oposto ao Quadro 31, no qual também há
a troca de mensagens entre o cliente e o servidor. Porém, neste caso a mensagem está
segura, pois foram aplicadas as políticas de segurança especificadas nos arquivos de
segurança (apenas foi descomentado o que havia sido comentado no documento de
segurança). Foi realizada uma chamada a operação fazer compra com os mesmos
dados contidos no Quadro 31.
QUADRO 32 - Quadro demonstrando a troca de mensagens seguras.
1
2
3
4
5
6
7
8
9
0
11
12
13
14
15
16
17
18
19
10
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="UTF-8"?>
<!-14/11/2006 15:21:20 com.sun.xml.wss.impl.filter.DumpFilter process
INFO: ==== Sending Message Start ====
-->
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:Security
xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
SOAP-ENV:mustUnderstand="1">
<wsse:BinarySecurityToken
xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
EncodingType=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security1.0#Base64Binary"
ValueType=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
wsu:Id="XWSSGID-11635284804211099240129">
MIICzjCCAjegAwIBAgIBAjANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzEMMAoGA1
UECBMDU0NBMQwwCgYDVQQKEwNTVU4xHjAcBgNVBAMTFWNlcnRpZmljYXRlLWF1dGhvcml0
eTAeFw0wNjAzMTkxMzU0NDJaFw0xNjAzMTYxMzU0NDJaMDgxCzAJBgNVBAYTAlVTMQwwCg
YDVQQIEwNTQ0ExDDAKBgNVBAoTA1NVTjENMAsGA1UEAxMEczFhczCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEArDBq4mMrOm4FFVQLvITQu9ryluc0gQdrxYgCI3dvKk5Uo2Jq8l
Vh5iz331o7RvJlHORS1YYfNHTthWwSCD3goYa6/Xlt7rprHRNzUPpotAdBcXq0shiWpNSm
Hxqkx28kPCnjuF3sz/Pq8GQNKwWJKXnl1ZzT387Csjmngf/FuzECAwEAAaOB1jCB0zAJBg
NVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0
ZTAdBgNVHQ4EFgQUeN9famBBWzHNUIwWRhMPktcM+VQweQYDVR0jBHIwcIAUdry1wGRZ2f
yJSKisVSxpMEmIiaahTaRLMEkxCzAJBgNVBAYTAlVTMQwwCgYDVQQIEwNTQ0ExDDAKBgNV
BAoTA1NVTjEeMBwGA1UEAxMVY2VydGlmaWNhdGUtYXV0aG9yaXR5ggkA4HaEvd6hq8YwDQ
YJKoZIhvcNAQEEBQADgYEAmUnJqyL43x6Rh4zWE7bi16fMcy71YGmvAIi4E3CRVdeiCFpO
ABco220RDxo46rqQJrM3q9ntZZZUcAugWUD//67n++liII2DFK4+poJP+L19+7m4R1OmHp
kpkRO6G8zXUvpSAoai45rzQSRSu0TN8s11IIJQQxiIkVcyJaMoU0w=
</wsse:BinarySecurityToken>
<xenc:EncryptedKey
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<ds:KeyInfo
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<wsse:SecurityTokenReference>
<wsse:Reference
URI="#XWSSGID-11635284804211099240129"
ValueType=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
UqbuRuPfNzcR9FV1EjpzfXFf1S4+8bO+5natxSj9mASaFCGblsm6Zq4A5nU02Uz3vWgLx6
MCJbp+qJJ3ji54H8baoul7donSwnw86hGEsLQ48WELr7EdSg91Mh6rvuJedg10eQTYBvg/
i9kssjydBaKcMXpUn0khp9wLVS77oPU=
</xenc:CipherValue>
</xenc:CipherData>
<xenc:ReferenceList>
<xenc:DataReference
URI="#XWSSGID-1163528480500-1719840684" />
</xenc:ReferenceList>
</xenc:EncryptedKey>
<wsse:BinarySecurityToken
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd"
EncodingType=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security1.0#Base64Binary"
ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile1.0#X509v3"
wsu:Id="XWSSGID-1163528480421-714906389">
MIIC3TCCAkagAwIBAgIBATANBgkqhkiG9w0BAQQFADBJMQswCQYDVQQGEwJVUzEMMAoGA1
UECBMDU0NBMQwwCgYDVQQKEwNTVU4xHjAcBgNVBAMTFWNlcnRpZmljYXRlLWF1dGhvcml0
eTAeFw0wNjAzMTkxMzQ5MDJaFw0xNjAzMTYxMzQ5MDJaMEcxCzAJBgNVBAYTAlVTMQwwCg
YDVQQIEwNTQ0ExDDAKBgNVBAoTA1NVTjEcMBoGA1UEAxMTeHdzLXNlY3VyaXR5LWNsaWVu
dDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzNDPKUz1MhUH1LsrLqXKxciOKSWeTr
doe/SVwe/4uy5eobAWSsSTposaOYFyuxf3cGCCIs7u0jMAXLQ9jzobDbt9XQ4tXPoBzKKz
S+yU6hDk2TcOCkioeT9A9db5LF8yevhwXKB4AJ1Eh//Dp/djoonXCCxsxupQZp3ueRJrR9
8CAwEAAaOB1jCB0zAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUECH05VC3/WGWH4AGD6tnH0h+kFUweQYDVR
0jBHIwcIAUdry1wGRZ2fyJSKisVSxpMEmIiaahTaRLMEkxCzAJBgNVBAYTAlVTMQwwCgYD
VQQIEwNTQ0ExDDAKBgNVBAoTA1NVTjEeMBwGA1UEAxMVY2VydGlmaWNhdGUtYXV0aG9yaX
R5ggkA4HaEvd6hq8YwDQYJKoZIhvcNAQEEBQADgYEA0RhOk67pCrO6MgZZGqrmAMW676fZ
owBxTKlFq88nrf8v1MUxV8H9wgbTDrwR0HtxY3TGpDFw2tNAww2pyDX/pQ2Wt46ichluGx
jfaEV53loKTOM7syAmlicWqViGzBfgzriIl918TzFaX9BD/Y55bKZQk057maBCSkUuFfF4
53s=
</wsse:BinarySecurityToken>
<ds:Signature
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces
xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"
PrefixList="wsse SOAP-ENV" />
</ds:CanonicalizationMethod>
<ds:SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference
URI="#XWSSGID-11635284804531616368774">
<ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>
44fPX8/ouOEEJFgIDwwfU2AUn4g=
</ds:DigestValue>
</ds:Reference>
<ds:Reference
URI="#XWSSGID-1163528480453-1107127414">
<ds:DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>
c7MEy8QfyxFudz6ORrAweSTTSqg=
</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
vowC5KZx6Sa6+cDT6XvnN9DjDwxvNTv7w2jDIkei6qcTeCZ+KCXtYxDZeF867JY+KLA9NA
b3cAbniQm3UH8BFKCueVwu9iIJm7lqP4wgQgB0ubCNwUKVw86zeB4brH5dgO0ZvY1HURdW
Lmyu624P6zsJP5K7jtlAWaCuEIlcSH8=
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd"
wsu:Id="XWSSGID-1163528480437750240271">
<wsse:Reference
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
URI="#XWSSGID-1163528480421-714906389"
ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile1.0#X509v3" />
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
<wsu:Timestamp
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd"
wsu:Id="XWSSGID-1163528480453-1107127414">
<wsu:Created>2006-11-14T18:21:20Z</wsu:Created>
<wsu:Expires>2006-11-14T18:21:25Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd"
wsu:Id="XWSSGID-1163528480421-1351393566">
<wsse:Username>fernando</wsse:Username>
<wsse:Password Type=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile1.0#PasswordText">
****
</wsse:Password>
<wsse:Nonce EncodingType=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security1.0#Base64Binary">
INvSjLxkOXPDLyGRCw0lblyv
</wsse:Nonce>
<wsu:Created>2006-11-14T18:21:20Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility1.0.xsd"
wsu:Id="XWSSGID-11635284804531616368774">
<xenc:EncryptedData
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
Id="XWSSGID-1163528480500-1719840684"
Type="http://www.w3.org/2001/04/xmlenc#Content">
<xenc:EncryptionMethod
Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<xenc:CipherData>
<xenc:CipherValue>
/xbypE9YC5ZnoDGYIzHIu8z0qQuwF6vvYKAq4rEIiaRzraBd+WEoCTNiD6tInxyqQvJGTs
GINrgdxx2dSTBtETAUxfBnTFwqHf4gyHyiA+cdK4FrEBRHZ49N+dQ4GwyPTATHu7IeuCzm
Yng3pS2J8gpUdsHCp0kmnidBnlwrEZ+9LYHV0XUdysd4kZfigKyVUEJ0Xn+5zzpcwU9OtW
D5Q1Huujh12bissg5EY7U1FbBb6iLE7ARjU9odR5wC7aKzd4YZFZjd+6HI2TXrh14TpeE8
ea/KyyYuqbd6HZIKbKcr93A6kzDKLPqZEfg7zlmxcZMZco/jJ387bouIyILvqG9f3zM5a0
6wTV3U3BRDtJOpv+j/ClBJWgRKW8i9ic7SuoPuh0ah+W/91wh2vIpAHNx7bhgoMTmvKgpL
yUigEWgjZZ9oaLjM76j7dlvJPNgfUFLM7fey4fhCuKtf+55v6hBKOOfgA4i++DK7+3F5c0
CPJA+sReb+oK9jAyhn7DOtVejNhQKIYCmRMpkH0YQJVLC3ZvXkMj8ZrUXrHhpPRySfymth
JI4nZHaWcFfkCtTJUZ2A8YJYNTUVaLvI/fqiDNjrDfavYpuZSns7xw5AoCU9+i1IQzaGgT
4ALuP3rkUhxZiFiSRfnmM+ZchD5VkcTypgFYc0fNhP1KuuKtFhDTKW64ECrgcGoNnGTPpa
WpgdBv3BzJFgO7pHHcIA7X1XfTli8UHu19HTTIpYnSNayvewvbEgSfoeSEW3trsl+jjK
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<!-- Sending Message End -->
Devido a extensão do documento gerado foi apenas apresentada a mensagem
de requisição ao Web Service. Pode-se perceber que a mensagem segura faz uso do
SOAP-HEADER para armazenar os Tokens de segurança. Como foi especificado no
arquivo de segurança do servidor, a mensagem de requisição a operação fazer compra
deve conter o Username / Password (linha 141 até 150 do Quadro 32), a assinatura
digital do Cliente que está requisitando o serviço (linha 89 até 133 do Quadro 32) e o
conteúdo da mensagem (SOAP-BODY) deve estar criptografado, como pode ser
observado na linha 164 até 185 do Quadro 32.
5.8 Conclusão
Neste capítulo foram apresentados os softwares que compõem o ambiente do
sistema proposto no capítulo anterior. Também foram apresentadas as suas devidas
configurações. Em seguida foi apresentada a implementação do sistema e logo a
aplicação e configuração da segurança nos Web Services. Com o serviço
implementado, foi desenvolvido um cliente para o mesmo e, assim, demonstrada a
diferenciação do ambiente seguro e o não seguro.
Neste capítulo que se alcançaram os objetivos propostos pelo trabalho, que
eram os de desenvolver um Web Service utilizando os recursos de segurança
apresentados pelo estudo realizado e de demonstrar a integração dos clientes com o
serviço implementado em um ambiente seguro.
No decorrer do desenvolvimento foram enfrentadas diversas dificuldades, de
origem de configuração do ambiente e de origem de codificação do sistema.
Os problemas enfrentados na configuração do ambiente referiam-se na
configuração correta do servidor de aplicação, pelo qual o mesmo deveria conter em
seu diretório lib os arquivos de biblioteca do XWSS 2.0. A configuração correta foi
obtida através da lista de discussão do projeto XWSS 2.0 hospedo pelo portal java.net.
Já os problemas na codificação foram mais amplos, primeiramente, se
descobriu, através de teste, que a especificação servlet 2.5 (atual especificação do Java
EE 5) não é compatível com XWSS 2.0. Essa informação também foi obtida através da
lista de discução do XWSS 2.0. Devido ao fato de não se poder utilizar um projeto
com a especificação mais recente, também não se poderia utilizar os recursos mais
recentes, tais como, injeção de dependências, utilizadas para fornecer à aplicação as
EntityManager e, também, o recurso transacional do Java EE 5, o JTA. Sendo assim,
ficou a cabo da aplicação fazer o controle transacional e obter os objetos
EntityMananger para a persistência dos objetos.
Outro problema enfrentado foi a definição dos nomes dos arquivos de
segurança do XWSS 2.0, que devem condizer exatamente com o nome do elemento
service-name do WSDL do Web Serivce, ou com o atributo de mesmo nome da
anotação @WebService.
Também se enfrentou dificuldade com a implementação JPA padrão do
servidor de aplicação SJSAS 9.0, o TopLink. Por isso, foi utilizado uma
implementação externa do servidor, o Hibernate.
Finalmente, o último problema enfrentado foi o dos arquivos serversecurity-env.properties e provedor.jks. Ambos arquivos precisavam
ser referenciados dentro da aplicação, pois a classe DefaultSecurityHandler
precisava das informações contidas nesses arquivos. O método utilizado para se obter
uma referência desses arquivos foi obtido através de usuarios do forum do Grupo de
Ususarios Java (www.guj.com.br). A solução proposta se encontra descrita no
capítulo.
6 CONSIDERAÇÕES FINAIS
O trabalho teve como objetivo principal apresentar métodos e tecnologias de
segurança aplicáveis em Web Services. Este objetivo foi dividido em uma série de
objetivos específicos.
O primeiro objetivo específico do trabalho era apresentar os principais
padrões e especificações envolvidas na tecnologia Web Services, que foi atingido no
decorrer do desenvolvimento do capítulo 2. Este referencial teórico é de essencial
importância para o trabalho, devido ao fato que se deve ter conhecimento de SOAP e
WSDL para se aplicar segurança em um Web Service. Nesta etapa do trabalho não
foram enfrentadas dificuldades, pelo fato de se existirem boas referencias
bibliográficas sobre o assunto, como está especificado na seção de referências
bibliográficas.
O segundo objetivo específico deste trabalho trata de levantar os principais
recursos para aplicação de segurança em Web Services, que foi alcançado no decorer
do desenvolvimento do terceiro capítulo. Com a realização deste estudo se apresentou
os dois conceitos de segurança em Web Services, a segurança sobre a mensagem e a
segurança sobre a camada de transporte, cada uma com suas vantagens e desvantagens.
Por ser um assunto relativamente recente, se teve dificuldade de obter referencial
bibliográfico em Língua Portuguesa neste capítulo.
Um dos principais problemas encontrados no trabalho era de escolher qual
método de segurança que deveria ser utilizado. Através da análise dos resultados da
pesquisa se optou pela utilização da segurança sobre a mensagem, pois essa tecnologia
foi desenvolvida especialmente para Web Services, diferente da técnica de segurança
sobre a camada de transporte, que é mais genérica e serve também para aplicações
Web que não fazem uso de Web Services. A segurança na camada da mensagem
apresenta uma maior flexibilidade de regras de segurança, garantindo a segurança de
fim-a-fim e por ser uma tecnologia recente e com pouco referencial teórico
(principalmente em Língua Portuguesa) optou-se por desenvolver o trabalho com essa
tecnologia.
O terceiro e quarto objetivos foram atingindos no capítulo cinco, que
visavam desenvolver um Web Service seguro e apresenta-lo em um ambiente que
permitisse monitora-lo. Porém, anteriormente no capítulo quatro, foi apresentado um
estudo de caso referente ao sistema a ser desenvolvido, servindo de base para se
aplicar a tecnologia em um sistema que simulasse um ambiente real com as suas
necessidade de segurança.
Seguindo a especificação do quarto capítulo, o sistema foi desenvolvido e o
ambiente a que ele reside foi configurado. Nestas etapas foram enfrentadas
dificuldades técnicas, tanto de configuração do ambiente como também de
desenvolvimento, e essas dificuldade foram superadas através de pesquisa e ajuda de
listas de discussões e fóruns especializados na tecnologia.
A realização deste trabalho foi gratificante devido ao fato de se ter alcançado
com sucesso todos os objetivos propostos e também de se ter apresentado um
referencial teórico e prático para a aplicação de segurança em Web Services.
Após o termino da pesquisa e desenvolvimento, concluiu-se que, realmente é
necessária uma tecnológica especial que trate de segurança em Web Services. Devido
ao fato de os Web Services servirem de base para uma serie de novas tecnologias e
paradigmas de sistemas distribuídos (SOA, ESB – Enterprise Service Bus), onde todos
esses necessitam de uma especificação de segurança, que na maioria dos casos,
tecnologias existentes não suprem a necessidade.
Também se analisou o custo - beneficio oferecido pela tecnologia, onde a
tecnologia apresentou um fator positivo neste quesito, e também ficou claro que pra se
aplicar uma camada de segurança em aplicações que façam uso de Web Services é
necessário optar por tecnologias que não prejudiquem os benefícios oferecidos pela
arquitetura, como por exemplo, interoperabilidade. Se observou também que há uma
demanda maior por recursos de processamento, devido ao fato de que toda a
mensagem deve passar por uma verificação de segurança, e isso acaba consumindo
recursos custosos de processamento. Mas, em contra partida, tem-se a garantia de se
utilizar uma segurança que se integra a tecnologia, não prejudicando a
interoperabilidade que a arquitetura Web Services prezam em conservar.
A tecnologia de Web Services está se tornando base para um novo paradigma
de desenvolvimento de sistemas orientados a serviços (SOA, Service-Oriented
Architecture), do qual a segurança sobre a mensagem é de extrema relevância. Nesta
nova classe de sistemas a mensagem trafega entre uma série de intermediários, cada
um desses agregando ou transformando informações até chegar ao ponto final
totalmente processada. Por isso, que a mensagem segura é necessária, pois nesse novo
paradigma não se tem total conhecimento de quais serviços processaram a mensagem e
nem por qual caminho que a mesagem percorrerá para ser processada.
Para sugestão a trabalhos futuros seria de desenvolver um ambiente usando a
arquitetura SOA em conjunto com a nova especificação de segurança WSIT (Web
Services Interoperability Technologies) que abrange otimização no transporte da
mensagem, melhor gestão de erros, transações atômicas, melhor gestão de segurança e
total garantia de interoperabilidade com a plataforma .Net da Microsoft. A tecnologia
WSIT é a nova geração de tecnologias de segurança e interoperabilidade para os Web
Services. Uma das propostas principais dessa nova versão de tecnologias de segurança
é a garantia de integração entre as novas especificações de Web Services, o que
eliminaria os problemas de integração do XWSS 2.0 com JAX-WS enfrentados
durante o desenvolvimento deste trabalho.
Outra sugestão para trabalhos futuros é desenvolver um ambiente escalável
de Web Services através de cluster em servidores de aplicação. E, também, explorando
melhor os recursos de processamento de documentos XML com JAX-WS, ao invês de
somente invocação de métodos remotos. Essa proposta de cluster visa sanar o
problema de necessidade desempenho maior para o tratamento da segurança na
aplicação que foi observado durante o desenvolviemento e testes do sistema.
REFERÊNCIAS BIBLIOGRÁFICAS
ALUR, D.; CRUPI, J.; MALKS, D. Core J2EE Patterns: As Melhores Práticas e
Estratégias de Design. São Paulo: Campus, 2004.
BAUER, C.; KING, G. Hibernate em Ação. Rio de Janeiro: Ciência Moderna, 2005.
BATES, B.; SIERRA, K. SCJP: Certificação Sun para Programador Java 5. Rio
de Janeiro: AltaBooks, 2006.
BECKER, A. K.; CLARO, D. B.; SOBRAL, J. B. Web Services e XML Um Novo
Paradigma da Computação Distribuída. 2003. 16 f. Monografia (Bacharelado em
Ciências da Computação) – Departamento de Informática e Estatística, Universidade
Federal de Santa Catarina, Florianópolis.
BODOFF, S. et al. Tutorial do J2EE Enterprise Edition 1.4. Rio de Janeiro: Ciência
Moderna, 2005.
DEITEL, H. M. et al. JAVA Web Services for Experienced Programmers. New
Jersey: Prentice Hall, 2003.
GOODWIN, P. Web Services Security in Java™ Web Services Developer Pack
(Java™ WSDP). In: JAVAONE CONFERENCE – San Francisco /US. Texto que
trata sobre a segurança em Web Services. SUN MICROSYSTEMS, 2004. Disponível
em: <http://developers.sun.com/learning/javaoneonline/2004/javatechweb/TS1614.html>. Acessado em: 15 jan. 2006.
HENDRICKS, M. et al. Profissional Java Web Services. Rio de Janeiro: Alta Books,
2002.
MARQUEZAN, C. C. Estudo das características de serviços Web e de seus
cenários de aplicação. 2004. 61 f. Dissertação, Programa de Pós-Graduação em
Computação, Instituto de Informática, Universidade Federal do Rio Grande do Sul,
Porto Alegre.
SINGH, I. et al. Designing Web Services with the J2EE 1.4 Platform JAX-RPC,
SOAP, and XML Technologies. Santa Clara, Califórnia, Estados Unidos: Sun
Microsystems, 2004.
SOUSA, E. C. Sistema de Informação para uma clínica de acupuntura médica.
2005. 88 f. Trabalho de Conclusão de Curso (Bacharelado de Informática) Departamento de Ciências Exatas e da Terra, Universidade do Planalto Catarinense -
UNIPLAC, Lages.
SUN MICROSYSTEMS. JAVA API for XML Registries (JAXR). Sun Developer
Network (SDN), 2006a. Apresenta o framework para acesso de aplicações Java a
registros de Web Services. Disponível em:
<http://java.sun.com/webservices/jaxr/index.jsp>. Acesso em: 15 jan. 2006.
SUN MICROSYSTEMS. JAVA API for XML Web Services (JAX-WS). Sun
Developer Network (SDN), 2006b. Apresenta o framework para desenvolvimento de
Web Services para plataforma Java. Disponível em:
<http://java.sun.com/webservices/jaxws/index.jsp>. Acesso em: 15 jan. 2006.
SUN MICROSYSTEMS. JAVA API for XML-Based RPC (JAX-RPC). Sun
Developer Network (SDN), 2006c. Apresenta o framework para desenvolvimento de
Web Services utilizando a tecnologia RPC sobre XML para plataforma Java.
Disponível em: < http://java.sun.com/webservices/jaxrpc/index.jsp>. Acesso em: 15
jan. 2006.
SUN MICROSYSTEMS. JAVA Architecture for XML Binding (JAXB). Sun
Developer Network (SDN), 2006d. Apresenta o framework para ligamento de
esquemas XML a classes Java. Disponível em:
<http://java.sun.com/webservices/jaxb/index.jsp >. Acesso em: 15 jan. 2006.
SUN MICROSYSTEMS. JAVA Web Services Developer Pack (Java WSDP)
Version 2.0. Sun Developer Network (SDN), 2006e. Apresenta a introdução ao toolkit
de desenvolvimento de Web Services para plataforma Java. Disponível em
<http://java.sun.com/webservices/jwsdp/index.jsp>. Acesso em: 15 jan. 2006.
SUN MICROSYSTEMS. SOAP with Attachments API for Java (SAAJ). Sun
Developer Network (SDN), 2006f. Apresenta o framework para envio de mensagens
SOAP com anexos para aplicações Java. Disponível em:
<http://java.sun.com/webservices/saaj/index.jsp>. Acesso em: 15 jan. 2006.
SUN MICROSYSTEMS. The Future of Web Services Security: A Conversation
with Eve Maler. Sun Developer Network, Santa Clara - US. Texto que aborda a
entrevista com a presidente Security Work Plan Working Group of WS-I sobre o
futuro da segurança em Web Services. Disponível em:
<http://Java.sun.com/features/2003/03/Webservices-qa.html>. Acesso em: 24 nov.
2005.
SUN MICROSYSTEMS. The Java™ EE 5 Tutorial. Santa Clara, Califórnia,
Estados Unidos: Sun Microsystems, 2006g.
SUN MICROSYSTEMS. The Java™ Web Services Tutorial For Java Web
Services Developer’s Pack, v1.6. Santa Clara, Califórnia, Estados Unidos: Sun
Microsystems, 2005h.
SUN MICROSYSTEMS. The Java™ Web Services Tutorial For Java Web
Services Developer’s Pack, v2.0. Santa Clara, Califórnia, Estados Unidos: Sun
Microsystems, 2006i.
SUN MICROSYSTEMS. XML and Web Services Security (XWSS). Sun Developer
Network (SDN), 2006. Apresenta o framework de segurança para Web Services em
aplicações Java. Disponível em: <http://java.sun.com/webservices/xwss/index.jsp>.
Acesso em: 15 jan. 2006j.
UDDI. About UDDI. UDDI.org, 2006. Página que explica a funcionalidade do padrão
UDDI. Disponível em: < http://www.uddi.org/about.html>. Acesso em: 17 mar. 2006.
W3C. SOAP Version 1.2 Part 1: Messaging Framework. W3C Recommendation,
2006a. Apresenta o framework SOAP e suas especificações. Disponível em:
<http://www.w3.org/TR/2003/REC-soap12-part1-20030624/>. Acesso em: 17 mar.
2006.
W3C. Web Services Description Language (WSDL) Version 2.0 Part 1: Core
Language. W3C Working Draft, 2006b. Documento que descreve a especificação
WSDL. Disponível em: <http://www.w3.org/TR/2003/WD-wsdl20-20031110/#intro>.
Acesso em: 17 mar. 2006.
W3C. XML-Signature Syntax and Processing. W3C Recommendation, 2006c.
Documento que descreve a especificação de assinaturas digitais em documentos XML.
Disponível em: < http://www.w3.org/TR/xmldsig-core/>. Acesso em: 17 mar. 2006.
W3C. XML Encryption Syntax and Processing. W3C Recommendation, 2006d.
Documento que descreve a especificação de criptografia em documentos XML.
Disponível em: < http://www.w3.org/TR/xmlenc-core/>. Acesso em: 17 mar. 2006.
WAZLAWICK, R. S. Análise e projeto de sistemas de informação orientados a
objetos. Rio de Janeiro: Elsevier: Campus, 2004.
BIBLIOGRAFIA COMPLEMENTAR
CHAPPELL, D.; IEWELL, T. Java Web Services. Estados Unidos: O´Reilly, 2002.
DEITEL, H. M. et al. XML: como programar. Porto Alegre: Bookman, 2003.
HADLEY, R. C. M. Next Generation Web Services in the Java™ Platform. In:
JAVAONE CONFERENCE – San Francisco /US. Sun Microsystems. 2005.
SUN MICROSYSTEMS. Securing Web Services — Concepts, Standards, and
Requirements. Santa Clara, Califórnia, Estados Unidos: SUN MICROSYSTEMS
2003.
APÊNDICE - ARTIGO
SEGURANÇA EM WEB SERVICES COM JAVA .................................................. 1
Segurança em Web Services com Java
Fernando Luiz Parisotto¹, Marcos André Pisching²
Departamento de Ciências Exatas e Tecnológicas – Universidade do Planalto
Catarinense (UNIPLAC)
Caixa Postal 525 – Lages – SC – Brasil
¹[email protected], ²[email protected]
Abstract. Web Services is the new trend for distributed systems, services
oriented and loosely coupled. However, for the adoption of this technology in
a corporative environment, where confidential data are transit in an ecommerce scene, it is necessary to guarantee confidencialidade of business
data, authentication of the interested parts and also integrity of the data
transmitted. This article has as objective to also present the main concepts of
the implementation of security in Web Services and the main involved
technologies in this process.
Palavras chave: Web Services; Segurança; Java.
Resumo. Web Services é a nova tendência para sistemas distribuídos,
orientados a serviços e baixamente acoplados. Porém, para a adoção desta
tecnologia em um ambiente corporativo, onde dados confidenciais transitam
em um cenário de e-commerce, é necessário se garantir confidencialidade dos
dados transacionados, autenticação das partes interessada e também
integridade dos dados a serem transmitidos. Este artigo tem como objetivo
apresentar os principais conceitos da implementação de segurança em Web
Services e também as principais tecnologias envolvidas nesse processo.
Keywords: Web Services; Security; Java.
1. Introdução
Os Web services são componentes de software baixamente acoplados que podem
reduzir a complexidade de aplicações corporativas, reduzindo custos, e permitem novos
modelos de negócio. São a nova tendência, abastecendo o e-commerce, a integração de
aplicações e também dando base a sistemas em um ambiente business-to-business
(B2B).
Uma característica importante dos Web Services é que a interação é instantânea
entre aplicação a aplicação, melhor de que entre seres humanos. Assim, quando as
empresas estiverem interessadas em trazer Web Services em sua arquitetura principal, a
segurança pôde ser a força contraria que influencia muitas empresas a não utilizar a
tecnologia. A segurança é importante para todo sistema que utiliza Web Services.
Garantir a segurança em Web services é crucial para ampla adoção da tecnologia.
Porém os padrões existentes da segurança, tais como (SSL), que é o mecanismo o mais
geralmente usado para garantir segurança em transações de e-commerce, não foram
concebidos para sua utilização em conjunto com Web Services. O fato é que os Web
Services requerem a segurança fim-a-fim ao invés da segurança ponto-a-ponto que o
SSL prove.
Este artigo apresenta uma visão geral da segurança da informação, seguida por
uma visão geral dos conceitos básicos para garantir segurança em Web services. Cobre
alguns dos padrões proeminentes da indústria desenvolvidos para fornecer soluções
detalhadas da segurança, como também a estrutura da XWS-Security que é a
implementação responsável pela segurança em Web services baseada na especificação
WSS do OASIS.
2. Conceitos sobre segurança
É importante ter uma compreensão geral da segurança da informação antes de dirigir-se
a elementos da segurança de Web Services.
Há cinco serviços de segurança gerais que abrangem as várias funções requeridas
para segurança. Estes podem também ser considerados como as exigências que definem
a segurança da informação:

Autenticação: assegura-se de que o remetente e o receptor sejam quem
reivindica ser. Os mecanismos tais como o Username/Password, Smart Cards, e
a infra-estrutura de chave pública (ICP) podem ser usadas assegurar a
autenticação.

Autorização, ou controle de acesso: Assegura-se de que uma entidade
autenticada possa alcançar somente aqueles serviços que são permitidos
alcançar. As listas do controle de acesso são usadas executar esta.

Confidencialidade: Isto assegura que a informação no armazenamento e
transportada são acessíveis somente para partes autorizadas. A criptografia é
usada assegurar o confidencialidade da mensagem.

Integridade: Assegura-se de que a informação armazenada ou transmitida não
possa ser modificada intencionalmente ou involuntariamente. As assinaturas de
Digital são usadas assegurar a integridade da mensagem.

Não repudio: Requer que nem o remetente nem o receptor de uma mensagem os
reivindicam que não emitiram/recebem a mensagem.
3. Camadas de segurança em Web Services
Segundo SINGH et al. (2004), os serviços de segurança em Web Services podem incluir
segurança em nível de transporte e segurança em nível de mensagens.
A segurança sobre a camada de transporte é aplicada na camada em que o Web
Service atua, como protocolo HTTP, assegurando o processo de comunicação de um
ponto a outro. A segurança sobre a camada de mensagem é aplicada na mensagem em
si, que o Web Service transmite, através de tecnologias de criptografia e assinatura
digital de documentos XML.
Segundo a SUN MICROSYSTEMS (2006), as principais necessidades de segurança
em um Web Service são:

Baixo acoplamento entre o serviço e o consumidor;

Segurança baseada em padrões da Internet;

Foco em prover interoperabilidade;

Neutralidade de plataforma e linguagem de programação;

Possibilidade de utilizar vários protocolos de transporte, como HTTP, SMTP,
etc.;

Suporte a interação de vários intermediários entre o consumidor do serviço e o
provedor do serviço.
E as suas principais vulnerabilidades são (SUN MICROSYSTEMS, 2006):

Interações são efetuadas através da Internet, usando protocolos que são
amigáveis a firewalls;

Uma comunicação é iniciada freqüentemente pelos consumidores do serviço que
não têm nenhum relacionamento prévio com o fornecedor de serviço;

A mensagem é baseada em texto plano.
4. Segurança sobre a camada de transporte
DEITEL et al. (2002), afirmam que atualmente a maioria das aplicações para comercio
eletrônico usam Secure Socktes Layer (SSL) para suas transações on-line. SSL é
comumente usado para garantir segurança em comunicações entre dois computadores na
Internet ou em uma rede. Opera entre os protocolos de comunicação TCP/IP como está
ilustrado pela Figura 1 e é transparente para a aplicação que o utiliza.
Figura 1. Processo de comunicação através do protocolo SSL.
O SSL utiliza a criptografia assimétrica em conjunto com a simétrica e
certificados digitais para autenticar os servidores e clientes e proteger as informações
que transitam pela Internet. O processo de comunicação é iniciado pelo cliente, envia
uma mensagem para o servidor, o servidor responde a mensagem enviando o seu
certificado digital ao cliente para autenticação. Usando a chave pública do servidor para
se comunicar seguramente, o cliente e o servidor negociam chaves simétricas para
continuar a transmissão. Essa chave é usada somente durante o processo da transação.
Uma vez trocada a chave simétrica a comunicação procede entre o cliente e o
servidor usando esta chave. Dados criptografados passam pelo canal de comunicação
TCP/IP como qualquer pacote que viaja pela Internet. Entretanto, antes de mandar uma
mensagem por TCP/IP o protocolo SSL quebra a informação em blocos, comprime-os e
os criptografa. Conseqüentemente para o receptor antes de o pacote chegar a aplicação o
protocolo SSL a descriptografa o pacote, os extrai e os monta para ser entregue a
aplicação, tornado o processo transparente (DEITEL, 2003).
Esses processos extras na comunicação provêem uma camada de segurança entre
aplicações que fazem uso do TCP/IP para se comunicar. O objetivo principal do SSL é
garantir a segurança de ponto a ponto em conexões ou transmissões de dados para um
computador a outro em uma rede, seja ela local ou remota, também provendo meio de
autenticação entre as duas partes (DEITEL, 2003).
O protocolo SSL provê para aplicações três serviços de segurança (DEITEL, 2003):

Autenticação: o servidor apresenta ao cliente um conjunto de credenciais e
certificados que provam que este serviço é o que diz ser.

Confidencialidade: os dados transmitidos por SSL são criptografados, tornando
impossível a legibilidade dos mesmos por terceiros que estejam no caminho da
comunicação entre o cliente e o servidor.

Integridade: SSL garante um meio de verificação de que os dados por ele
transmitidos não foram alterados.
Segundo HENDRICKS et al. (2002), o SSL é um protocolo sofisticado que está
sendo muito usando na Internet, e que fornece uma boa camada de segurança, mas que
juntamente com outros serviços em nível de transporte, não deixa de apresentar
problemas quando aplicado a Web Services.
Múltiplos Web Services podem ser combinados para a formação de uma aplicação
maior, orientada a serviços. Devido a isso esta aplicação necessita fazer inúmeras
chamadas e conexões com outros Web Services, e os mesmo podem também fazer uso
de outros Web Services e assim consecutivamente. O que torna o SSL um padrão
inapropriado para garantir a segurança de informações nesse tipo de sistema, pois SSL
prove segurança de ponto-a-ponto, maquina a maquina e não fim-a-fim como é preciso
neste caso, SSL não chega a descer para o próximo nível da cadeia de serviços, ele fica
apenas situado entre as conexões.
O protocolo SSL possui uma série de limitações quando se trata de sua
aplicabilidade em Web Services, que podem ser resumidas em (GOODWIN, 2004):

SSL prove segurança de ponto-a-ponto e opera entre nós da rede (não entre
aplicações). Para Web Services é necessário segurança de fim-a-fim onde nós
intermediários podem existir entre um processo de troca de mensagem;

SSL opera no nível de transporte e não no nível de mensagem. As mensagens
estão protegidas somente enquanto são transmitidas, não são seguras por si só,
necessitam de um canal seguro de comunicação;

SSL não suporta não-repúdio. Não é possível provar que outra entidade efetuou
tal transação ou requisitou tal serviço;

SSL não suporta criptografia customizada ou em parte. Utilizando SSL para
transportar um documento XML grande, seria necessário criptografa-lo por
completo, e não somente as informações que seriam consideradas confidenciais.
Segundo HENDRICKS et al. (2002), a implementação de um Web Service que faça
uso de segurança sobre a camada de transporte HTTP com SSL é razoavelmente
simples. Ele afirma que não há necessidade de grandes alterações no código da
aplicação, apenas é preciso que se configure corretamente o servidor, registrando um
domínio seguro onde o Web Service está hospedado e obtendo um certificado digital
válido de uma autoridade certificadora para ser associado ao servidor. Para que isso
possa ser feito é necessário que o servidor onde a aplicação esteja hospedada suporte
comunicações através do protocolo SSL.
Porém, deve levar em consideração a carga extra de trabalho que o servidor sofrerá
para atender as requisições criptografadas por SSL, afirma DEITEL et al. (2003).
Existem soluções em hardware especializadas para tratar do processamento de
requisições SSL, como por exemplo, uma placa PCI que pode ser conectada ao servidor
e que fornece um processador que implementa a baixo nível o processamento de SSL,
afirmam DEITEL et al. (2003), fornecem um ótimo desempenho para a tarefa.
Baseado nas afirmações anteriores da SUN MICROSYSTEMS (2006), sobre as
necessidades de segurança em Web Services, deduz-se que a segurança sobre a camada
de transporte não é a melhor tecnologia de segurança a ser aplicada nesse tipo de
sistema. Devido ao fato de ser dependente de protocolo de transmissão (HTTP) e de não
suportar a existência transparente de intermediários na comunicação. Porém, pode ser
aplicada com sucesso em um sistema que não necessite destas características para o seu
funcionamento.
5. Segurança sobre camada de mensagem
“Segurança no nível de mensagem é diferente do que se usa geralmente para prover
segurança em Web Services hoje em dia. O que é feito hoje é pego a mensagem que é
um pedaço de dados vulnerável que todo mundo pode olhar, todo mundo pode mudar.
Para prever isso é pego esse pedaço de dados e a empurramos em um tubo de aço para o
seu destinatário que esta conectado na outra ponta do tubo. Esse tubo é o que chamamos
de segurança a nível de transporte que protege a mensagem entre a origem e seu destino.
Segurança no nível de mensagem é diferente, segurança a nível de mensagem pega esse
conjunto de dados e a embala em uma concha do mesmo tipo de aço e agora a
mensagem esta segura por si só. Está segura antes de ser enviada, esta segura quando é
recebida e após ser recebida também. Agora não precisamos mais do tubo de aço. Agora
podemos usar qualquer tubo que temos disponível para mandar a mensagem. Também
podemos armazenar a mensagem depois de ser recebida, o que nos da à habilidade de
recuperá-la e verificar suas informações de segurança, como em situações com
assinatura digital, em que se quer provar que alguém quem mandou essa mensagem
realmente é quem diz ser. Estas características estão disponíveis para a sua aplicação, o
que significa partir do momento que se sabe o que a aplicação esta fazendo e da
estrutura da mensagem, é possível quebra-la e abri-la e se pode ver pedaços individuais
da mensagem, pode-se embala-los e criptografa-los, pode-se assina-los, assinar pedaços
de diferentes formas, pode-se embalar toda a mensagem, criptografa-la ou assina-la.
Partindo disto, essa tecnologia pode oferecer um ótimo meio de controle para a
aplicação acessar um maior conjunto de opções de segurança.” (GOODWIN, 2004).
Segundo a SUN MICROSYSTEMS (2006), a segurança sobre a camada de
mensagem faz uso de uma serie de mecanismos, tais como: criptografia, autenticação e
assinaturas digitais. As principais vantagens desse esquema de segurança na camada da
mensagem são:

A segurança fica com a mensagem através de todos os nós e depois da
mensagem chegar ao seu destinatário;

A segurança é granular, pode ser aplicada em diferentes partes da mensagem,
incluindo seus anexos;

Pode ser usada em conjunto com intermediários na rede;

É independente de ambiente e de protocolo de transporte.
6. Organizações envolvidas no desenvolvimento de tecnologias de segurança
em nível de mensagem para Web Services
Segundo a SUN MICROSYSTEMS (2006), as seguintes organizações trabalham para o
desenvolvimento de especificações, tecnologias e ferramentas para segurança em Web
Services:

The World Wide Web Consortium (W3C)
o XML Encryption: esta especificação prove requerimentos para o
processamento e criptografia de documentos expressados pela sintaxe
XML;
o XML Digital Signature: esta especificação define um meio de representar
assinaturas digitais em documentos XML através de sua sintaxe e
semântica;
o XML Key Management Specification: esta especificação define
protocolos para distribuição e registro de chaves publicas em
documentos XML;

Organization for Advancement of Structured Information Standards (OASIS)
o Web Services Security (WSS), SOAP Message Security: Esta
especificação descreve aprimoramentos para o protocolo SOAP que
prove integridade, confidencialidade e autenticação na mensagem, esta
especificação será tratada com mais detalhes adiantes neste artigo;
o Security Assertion Markup Language (SAML): a especificação SAML
define um mecanismo baseado em XML para segurança de transações
B2B, B2C e e-commerce. SAML define um framework para troca de
informações sobre autenticação e autorização, desta forma SAML prove
um meio de interoperabilidade de definições de segurança entre sistemas
distintos;
o eXtensible Access Control Markup Language (XACML): a especificação
XACML define uma linguagem para expressão de políticas de segurança
baseado em documentos XML;

Web Services Interoperability Organization (WS-I): diferente da W3C e da
OASIS, a WS-I desenvolve perfis de o que usar, e como usar as tecnologias
existentes para promover segurança em Web Services. Alguns desses perfis são:
o Basic Security Profile (BSP) que fornece um guia de uso do framework
WSS;
o REL Token Profile que é o guia de como usar a linguagem de expressão
de direitos (Rights Expression Language);
o SAML Token Profile: guia de uso da tecnologia SAML;
o Security Challenges, Threats, and Countermeasures (Desafios, ameaças,
e contramedidas de segurança): é um documento escrito pela Web
Services Interoperability Organization (WS-I), que visa identificar
ameaças de segurança em uma aplicação que faz uso de Web Services e
em sua infra-estrutura. Este documento também visa promover uma
tecnologia apropriada para tratar essa ameaça.
7. API de segurança em nível de mensagem para Web Services na
plataforma Java
O framework responsável pela segurança em Web Services na plataforma Java é o
XWS-Security (XML and Web Serivices Security). Este faz parte do JWSDP (Java Web
Services Developer Pack), que provê um meio a desenvolvedores de aplicar segurança
em aplicações desenvolvidas com JAX-RPC (Java API for XML Based RPC), JAX-WS
(Java API for Web Services) ou SAAJ (SOAP with Attanchments API for Java), através
de configurações de políticas de segurança de requisição e resposta no nível de serviço,
porta ou operação. Esta implementação de XWS-Security provê segurança para Web
Services no nível de mensagem e implementa os padrões de Segurança em Web Services
(WSS) propostos pela OASIS.
O framework XWS-Security fornece ao desenvolvedor de aplicações Web
Services uma ampla variedade de opções de definição de segurança em seu aplicativo. O
framework faz uso de uma série de tecnologias relacionadas que possibilita uma
configuração flexível e interoperável na camada de segurança do aplicativo.
O meio de se aplicar a segurança é através de arquivos XML de configuração,
usados em conjunto com o descritor da aplicação que é um documento requerido em
toda aplicação Enterprise para plataforma Java EE.
Segundo a SUN MICROSYSTEMS (2006), uma aplicação Web Services pode ser
segura conforme os seguintes cenários:

Assinando e verificando partes de uma mensagem SOAP e seus anexos (fazendo
uso da tecnologia XML Digital Signature);

Criptografando ou descriptografando partes de uma mensagem SOAP e seus
anexos (fazendo uso da tecnologia XML Encryption);

Enviando informações de identificação e autorização de usuários junto com a
mensagem SOAP (fazendo uso da tecnologia SAML).
8. Considerações finais
Ao final do estudo realizado, chegou-se a conclusão de que existem duas maneiras de se
aplicar segurança em Web Services. Através da segurança sobre a camada de transporte
(atualmente HTTP / SSL), o que limita muito a aplicação no sentido de uma arquitetura
orientada a serviços. E, também, há a possibilidade de se aplicar segurança na camada
da mensagem, através de frameworks como XWSS que implementam padrões
específicos da indústria sobre segurança em Web Services.Através das informações
obtidas nesse estudo, conclui-se que a segurança sobre a camada de mensagem é a mais
indicada por aplicações que façam uso de Web Services, devido ao fato desta tecnologia
ser desenvolvida especialmente para suprir as necessidade de sistemas que utilizem essa
arquitetura de serviço, e também por cobrir as falhas apresentadas na segurança sobre a
camada de transporte.
Referencias
DEITEL, H. M. et al. JAVA Web Services for Experienced Programmers. New Jersey:
Prentice Hall, 2003.
GOODWIN, P. Web Services Security in Java™ Web Services Developer Pack (Java™
WSDP). In: JAVAONE CONFERENCE – San Francisco /US. Texto que trata sobre
a segurança em Web Services. SUN MICROSYSTEMS, 2004. Disponível em:
<http://developers.sun.com/learning/javaoneonline/2004/javatechweb/TS1614.html>. Acessado em 15 de janeiro de 2006.
HENDRICKS, M. et al. Profissional Java Web Services. Rio de Janeiro: Alta Books,
2002.
SINGH, I. et al. Designing Web Services with the J2EE 1.4 Platform JAX-RPC, SOAP,
and XML Technologies. Santa Clara, Califórnia, Estados Unidos: Sun Microsystems,
2004.
SUN MICROSYSTEMS. JAVA Web Services Developer Pack (Java WSDP) Version
2.0. Sun Developer Network (SDN), 2006e. Apresenta a introdução ao toolkit de
desenvolvimento de Web Services para plataforma Java. Disponível em
<http://java.sun.com/webservices/jwsdp/index.jsp>. Acesso em: 15 jan. 2006.
Download