certificaÇÃo digital: uma proposta de um processo …

65
SERVIÇO PÚBLICO FEDERAL MINISTÉRIO DA EDUCAÇÃO INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO PARÁ CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS LUCIANA SAYURI TSUCHIYA MASUDA CERTIFICAÇÃO DIGITAL: UMA PROPOSTA DE UM PROCESSO DE AUTENTICAÇÃO BELÉM 2010

Upload: others

Post on 29-Nov-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

SERVIÇO PÚBLICO FEDERAL

MINISTÉRIO DA EDUCAÇÃO INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO PARÁ

CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

LUCIANA SAYURI TSUCHIYA MASUDA

CERTIFICAÇÃO DIGITAL: UMA PROPOSTA DE UM PROCESSO DE AUTENTICAÇÃO

BELÉM 2010

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO PARÁ

CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

LUCIANA SAYURI TSUCHIYA MASUDA

CERTIFICAÇÃO DIGITAL: UMA PROPOSTA DE UM PROCESSO DE AUTENTICAÇÃO

Trabalho Acadêmico de Conclusão de

Curso apresentado ao Instituto Federal de Educação, Ciência e Tecnologia do Pará – IFPA, como requisito para a obtenção do

Grau em Tecnólogo em Desenvolvimento de Sistemas, sob a orientação do Prof. Msc. Cláudio Roberto de Lima Martins.

BELÉM 2010

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO PARÁ

CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

LUCIANA SAYURI TSUCHIYA MASUDA

CERTIFICAÇÃO DIGITAL: UMA PROPOSTA DE UM PROCESSO DE

AUTENTICAÇÃO

DATA DA DEFESA: 04/02/2010

CONCEITO: ___________________

BANCA EXAMINADORA

_____________________________________________________ Prof. Orientador Msc. Cláudio Roberto de Lima Martins – IFPA

_____________________________________________

Prof. Msc. Rita de Cássia Cerqueira Gomes - IFPA

_____________________________________________

Prof. Msc. Ricardo José Souza de Cabeça - IFPA

À minha família, pelo eterno incentivo.

AGRADECIMENTOS

Agradeço em primeiro lugar a Deus, pois sem Ele nada seria possível.

Aos meus pais, Yuji e Yukuko que com toda paciência, dedicação,

dificuldades e limitações não pouparam esforços para me educar, ajudando a

superar os obstáculos com humildade.

Aos meus irmãos, Suzana, Diana e Hector pela ajuda, motivação e incentivo.

Ao meu grande orientador, Cláudio Martins pelo aprendizado, apoio,

paciência, motivação e dedicação.

A todos os professores com os quais tive a oportunidade e o prazer de

aprender.

Ao Instituto Federal de Educação, Ciência e Tecnologia do Pará por ser uma

instituição pública.

Aos meus amigos pelo incentivo e apoio.

E a todas as pessoas que de alguma forma, seja direta ou indiretamente,

ajudaram na elaboração deste trabalho.

“A melhor maneira de ficar em segurança

é nunca se sentir seguro.”

(Benjamin Franklin)

RESUMO

Na segurança da informação, é necessário estabelecer uma política de criação e

uso de senhas pelos funcionários de uma empresa, pois, como muitos dos sistemas

usam senhas na autenticação de usuários, os mesmos optam por utilizar senhas

fáceis ou deixar anotados em um papel, facilitando um usuário malicioso conseguir

esses dados de acesso e utilizá-los para um ato ilícito. Em virtude desses problemas

de segurança, muitos especialistas da área procuram alternativas na autenticação

de usuários para minimizar esse problema de segurança. Uma das soluções para

esse problema é o uso de certificados digitais no lugar dos tradicionais login e

senha. Os certificados digitais são documentos que garantem a identidade de

pessoas e de computadores remotos, além de servirem para assinar e garantir a

integridade dos documentos. Portanto, este trabalho acadêmico tem como objetivo

propor um sistema de autenticação utilizando certificados digitais para uma rede

interna.

PALAVRAS-CHAVE: Segurança, Autenticação, Criptografia Assimétrica, Certificação

Digital.

ABSTRACT

In information security, it's needed to establish a policy for creating and use of

passwords by the employees in a company, because many systems use passwords

in its users authentication, them generally choose weak passwords or write it on a

paper, making for a malicious user to obtain these access data and use them for a

tort. Because these security problems, many specialists are looking for alternatives in

the users authentication to reduce these security problems. One solution to these

problems is the use of digital certificates in the place of traditional login and

password. The digital certificates are documents that guarantee the people and

remote computers identity, as well as serving to sign and guarantee the documents

integrity. Therefore, this academic work have as objective propose an authentication

system that uses digital certificates for a internal network.

KEYWORDS: Security, Authentication, Asymmetric Encryption, Digital Certificate.

LISTAS DE ILUSTRAÇÕES

1 Política de Segurança de Informações e seus relacionamentos 19

2 Esquema para cifragem e decifragem com chaves simétricas 21

3 Exemplo de criptografia simétrica por substituição, técnica de Júlio

César 21

4 Criptografia de chaves públicas 23

5 Analogia entre o processo para expedir um RG e um Certificado Digital 27

6 Estrutura do ICP-Brasil de forma resumida 29

7 Simplificação do sistema de certificação digital 30

8 Certificado Digital 33

9 Estrutura do formato X.509 34

10 Pilha TCP/IP – Camadas para um usuário navegando com SSL 40

11 Janela Opções, na categoria “Avançado”, na aba “Criptografia” 43

12 Gerenciador de Certificados 44

13 Diálogo para a importação do Certificado da AC 44

14 Dados do Certificado do Cliente no Gerenciador de certificados 45

15 Solicitação de identificação do usuário utilizando certificado digital 45

16 Ícone do cadeado na barra de status do navegador 46

17 Fluxo de funcionamento do sistema 47

18 Página index.jsp do protótipo do Sistema de Autenticação 47

19 Solicitação de identificação do usuário 48

20 Página dadosCertificado.jsp, mostra os dados do certificado do Cliente 49

21 Página entradaForca.jsp 50

SUMÁRIO

1 INTRODUÇÃO.......................................................................................... 12

1.1 OBJETIVO GERAL................................................................................... 13

1.2 OBJETIVO ESPECÍFICO......................................................................... 13

1.3 ORGANIZAÇÃO DO TRABALHO............................................................. 13

2 SEGURANÇA DA INFORMAÇÃO........................................................... 15

2.1 MODELO CIA (CONFIDENTIALITY, INTEGRITY AND AVAILABITY)...... 15

2.2 OUTROS PRINCÍPIOS DE SEGURANÇA............................................... 16

2.3 AMEAÇAS................................................................................................ 17

2.4 POLÍTICA DE SEGURANÇA DA INFORMAÇÃO..................................... 18

3 CRIPTOGRAFIA....................................................................................... 20

3.1 CRIPTOGRAFIA SIMÉTRICA................................................................... 20

3.2 CRIPTOGRAFIA ASSIMÉTRICA.............................................................. 22

3.2.1 Funcionamento do Algoritmo RSA............................................................ 23

4 CERTIFICAÇÃO DIGITAL........................................................................ 26

4.1 ESTRUTURA HIERÁRQUICA DA CERTIFICAÇÃO DIGITAL.................. 26

4.2 INFRA-ESTRUTURAS DE CHAVES PÚBLICAS BRASILEIRAS (ICP-

BRASIL).................................................................................................... 28

4.2.1 Comitê Gestor (CG).................................................................................. 30

4.2.2 Autoridade Certificadora Raiz (AC-Raiz).................................................. 31

4.2.3 Autoridades Certificadoras (ACs)............................................................. 31

4.2.4 Autoridades de Registro (ARs)................................................................. 31

4.3 TIPOS DE CERTIFICADOS..................................................................... 32

4.4 ESTRUTURA DE UM CERTIFICADO DIGITAL....................................... 33

5 AUTENTICAÇÃO WEB COM CERTIFICADOS DIGITAIS...................... 37

5.1 TECNOLOGIAS UTILIZADAS.................................................................. 37

5.1.1 Apache Tomcat......................................................................................... 38

5.1.2 Eclipse Ganymede.................................................................................... 38

5.1.3 Java Development Kit (JDK)..................................................................... 38

5.1.4 OpenSSL.................................................................................................. 39

5.2 PROCESSO DE AUTENTICAÇÃO.......................................................... 39

5.3 GERAÇÃO DE CERTIFICADOS.............................................................. 40

5.3.1 Criação da Chave e do Certificado da Autoridade Certificadora.............. 40

5.3.2 Criação do Keystore, do Certificado do Servidor e do Truststore............. 41

5.3.3 Criação do Certificado do Cliente............................................................. 42

5.4 CONFIGURAÇÃO DO SSL...................................................................... 42

5.5 AUTENTICAÇÃO E MANIPULAÇÃO DE CERTIFICADOS..................... 46

6 CONCLUSÃO........................................................................................... 51

REFERÊNCIAS........................................................................................ 53

APÊNDICE A............................................................................................ 55

12

1. INTRODUÇÃO

Tradicionalmente, as organizações (bancos, empresas grandes ou

pequenas, governos) davam mais atenção à proteção de seus meios físicos e

financeiros do que às informações que possuíam. A tecnologia da informação servia

de retaguarda ou na melhoria de processos, mas dificilmente tinha destaque dentro

das organizações.

Atualmente, as organizações necessitam da tecnologia da informação para

o seu funcionamento, devido à automatização e agregação de valores aos

processos organizacionais. As redes de computadores facilitam bastante a

comunicação entre as organizações e pessoas do mundo todo, porém, a partir da

década de 90, com a globalização surgiu a preocupação com a segurança das

informações.

Atividades que antes não precisavam do uso da informática e da Internet se

fazem necessárias hoje em dia. Por exemplo, fazemos transações bancárias,

fazemos compra, estudamos e trabalhamos utilizando um computador, e, para

garantir a segurança e a privacidade das transações realizadas por pessoas e

empresas no ambiente virtual, usamos ferramentas de hardware e software que

provêem a segurança do sistema. Mesmo com todas as ferramentas disponíveis no

mercado, há sempre uma possibilidade de falhas na segurança, e com o

crescimento de Aplicações Web surge a necessidade de ambientes seguros que

possam dispor de informações confiáveis e verdadeiras.

A importância na segurança da aplicação está crescendo de forma rápida

devido ao incremento das necessidades de transações virtuais por parte do negócio.

A fraude em Aplicações Web tornou-se um problema em escala mundial, que tem

custado bilhões às organizações.

À medida que a Web cresce, também crescem os problemas de segurança

associados a ela. Os navegadores e servidores tornaram-se mais complexos,

porém, com muitas brechas para os hackers tirarem proveito. E com o uso de

informações confidenciais e privadas trafegando através da Web, os hackers têm

um grande incentivo para descobrir essas brechas.

Na maioria dos casos, é simplesmente impossível para os usuários

gerenciarem a própria segurança; os problemas são muito complexos e o ambiente

13

é muito flexível. Grande parte da responsabilidade pela segurança deve,

consequentemente, recair sobre o desenvolvedor de aplicativos Web, que tem de

codificá-los de forma defensiva e segura para tentar impedir problemas relacionados

à segurança.

Uma das categorias de segurança muito crítica para Aplicações Web é a

autenticação, pois falhas nesta área geralmente podem estar ligadas a roubo de

contas de usuários ou administradores, o que resulta em um contorno de controles

de autorização e responsabilidade, causando violações de privacidade, e como

consequência causaria um grande prejuízo para o usuário e a empresa, pois,

imagine se a conta de um usuário de uma empresa e-commerce fosse roubada.

Uma das possíveis soluções para este problema de segurança seria

trabalhar com a encriptação de dados que trafegam na rede, por meio de algoritmos

de assinatura, como o RSA, e o uso de certificados digitais. “A certificação digital

assegurada pelos pilares da autenticidade, integridade e confidencialidade pode ser

uma grande parceira na tarefa de minimizar os problemas de segurança” (SILVA et

al., 2008, p. 44).

1.1. OBJETIVO GERAL

Propor um processo de autenticação com certificados digitais para redes

internas.

1.2. OBJETIVOS ESPECÍFICOS

a) Esclarecer a diferença entre a criptografia simétrica e criptografia assimétrica.

b) Mostrar como configurar um servidor web (Apache Tomcat) de forma a

permitir que um usuário se autentique utilizando certificados digitais.

c) Esclarecer como os certificados digitais garantem a segurança da informação.

1.3. ORGANIZAÇÃO DO TRABALHO

O trabalho está organizado da seguinte forma:

No capítulo 2, são apresentados conceitos fundamentais da segurança da

14

informação, os principais requisitos de segurança e sobre o que vem a ser política

de segurança da informação.

No capítulo 3, aborda-se o que vem a ser criptografia, e são apresentados os

dois tipos de criptografia, a simétrica e a assimétrica, além de ser explicado como

funciona o algoritmo RSA.

No capítulo 4, apresentam-se os conceitos sobre certificação digital,

abordando conceitos sobre a infra-estrutura de chaves públicas, em especial a

adotada pelo Brasil.

No capítulo 5, é disposto o objetivo geral deste trabalho, onde será abordado

o processo de autenticação, geração dos certificados, implementação do protótipo

do sistema de autenticação e as tecnologias utilizadas.

Finalmente, no capítulo 6, são apresentadas as conclusões e os trabalhos

futuros.

15

2. SEGURANÇA DA INFORMAÇÃO

A informação, atualmente, é considerada como um bem de maior valia. É

como se fosse um patrimônio de uma organização e por consequência é uma

vantagem competitiva no mercado. Assim, a segurança de informação tornou-se um

ponto importante para a sobrevivência das organizações.

A segurança de informação busca reduzir ao máximo possível os riscos de

fraudes em arquivos, banco de dados, vazamento de informação, uso indevido do

sistema por falta de treinamento, paralisações de rede ou serviços, sabotagens,

roubo de informações ou qualquer outra ameaça que possa prejudicar a organização

ou equipamentos da mesma. Para Dias (2000, p.41), segurança é a proteção de

informações, sistemas, recursos e serviços contra desastres, erros, manipulações

não autorizadas, de forma a reduzir a probabilidade e o impacto de incidentes de

segurança.

De acordo com Albuquerque e Ribeiro (2002, p. 25):

Segurança é um termo tão genérico que é melhor pensarmos em aspectos

de segurança da informação. Em vez de perguntar quanto queremos de

segurança, devemos perguntar quanto queremos de disponibilidade do

sistema ou qual a necessidade de confidencialidade, por exemplo.

2.1. MODELO CIA (CONFIDENTIALITY, INTEGRITY AND AVAILABITY)

A segurança de informação segue um conjunto de princípios em que se

podem estabelecer métricas para a definição do nível de segurança existente, os

principais objetivos que orientam a análise, o planejamento e a implementação da

segurança é a tríade CIA (Confidentiality, Integrity and Availabity – Confidencialidade,

integridade e disponibilidade).

Para fornecer uma melhor compreensão, a definição dos principais objetivos

está disposta a seguir:

a) Confidentiality (Confidencialidade): Assegura que as informações estejam

acessíveis somente para pessoas autorizadas, protegendo-as contra leituras e

cópias indevidas.

b) Integrity (Integridade): Proteger as informações contra alterações ou

modificações, garantindo que seu conteúdo não foi corrompido nem forjado.

16

c) Availabity (Disponibilidade): Assegura que os usuários autorizados acessem a

informação quando requisitada, protegendo-a de forma que ela não seja degradada

nem se torne indisponível.

2.2. OUTROS PRINCÍPIOS DE SEGURANÇA

Além do modelo CIA, há outros princípios que são importantes de acordo com

a natureza da aplicação. A seguir é apresentada a definição de cada princípio:

a) Autenticação: Provê a garantia de identidade do usuário, sistema ou informação,

ou seja, é responsável por verificar que um requerente é quem ele alega ser.

b) Não repudio: Impede que um usuário venha a negar falsamente a sua

participação em qualquer ação no sistema.

c) Legalidade: Aderência de um sistema à legislação.

d) Privacidade: Assegura que dados confidenciais não são revelados a pessoas

que não possuem o privilégio de acesso.

e) Auditoria: Engloba o exame cuidadoso das operações, processos, sistemas e

responsabilidades gerenciais de uma determinada entidade, cujo objetivo é

averiguar se elas estão de acordo com as disposições planejadas e estabelecidas.

De acordo com a norma ISO/IEC 17.799/2005, para uma organização é

fundamental conhecer os seus requisitos de segurança, os quais podem ser

identificados por três fontes principais:

a) A primeira é obtida a partir de uma avaliação de risco, ou seja, é feito um

estudo sobre a probabilidade de ocorrência das ameaças e do impacto

potencial que causará à organização se esses riscos acontecerem;

b) A segunda é com relação à legislação vigente, os estatutos, a

regulamentação e as cláusulas contratuais que a organização, seus

parceiros, contratados e provedores de serviço têm que atender;

c) A terceira é definido um conjunto de princípios, objetivos e requisitos para

processamento de informação que uma organização tem que desenvolver

para apoiar suas operações.

17

2.3. AMEAÇAS

Quando ocorre a perda de um dos princípios citados anteriormente, como a

confidencialidade de um dado, estamos nos deparando com um problema de

segurança do qual estamos querendo evitar. Alguns desses problemas são

ocasionados por desastres naturais, outros por alguma operação incorreta, ou então,

por um ataque ao sistema. Sendo que o último é um dos mais sérios em virtude do

“agente que está realizando o ataque visa obter algum retorno, podendo, com isso,

provocar grande prejuízo. Ao contrário dos demais, o ataque pode ser planejado,

sistemático e é muito difícil de prever” (ALBUQUERQUE e R IBEIRO, 2002, p. 3).

Vale lembrar que o agente não precisa ser necessariamente uma pessoa.

Pode ser também um grupo ou empresa. A ameaça causada por ação da natureza,

também, provoca danos. Afeta a confidencialidade, a integridade e a disponibilidade

de uma informação ou bem, fazendo uso de uma ou mais vulnerabilidades.

O ataque só acontecerá se houver uma ameaça à segurança. A ameaça é

uma tríade composta por Agente, Vulnerabilidade (ou Mecanismo) e Ativo com alto

valor.

Com base na ISO/IEC 15.408 e Albuquerque e Ribeiro (2002, p.4), os termos

ataque, ativo, vulnerabilidade e ameaça têm as seguintes definições:

a) Ataque: é um tipo de problema de segurança caracterizado pela existência

de um agente que busca obter algum retorno, atingindo um ativo de alto valor.

O retorno pode ser financeiro ou não.

b) Ativo: algo de valor resguardado pelo sistema.

c) Vulnerabilidade: é uma fraqueza no sistema, ou seja, erro de operação só

pode causar dano se houver um ponto fraco no sistema que permita que o

ativo seja atingido.

d) Ameaça: como afirmamos acima, é composta pelos elementos: agente,

vulnerabilidade e ativo de alto valor. É um ataque potencial.

A ameaça pode ser classificada como intencional (humana), acidental

(humana) ou natural, e pode ser também externa ou interna.

Vários profissionais da área de segurança da informação afirmam que não

existe sistema totalmente impenetrável, pois é impossível prevenir todos os ataques.

O sistema que concentra suas defesas nos ataques mais prováveis e com maior

18

perda esperada são os considerados seguros.

2.4. POLÍTICA DE SEGURANÇA DA INFORMAÇÃO

Uma política de segurança da informação é um conjunto de normas e

procedimentos que definem as melhores práticas para manuseio, armazenamento,

transporte e descarte das informações. É um mecanismo preventivo de proteção da

informação, de forma a restringir acessos e manipulações por pessoas não

autorizadas.

Uma política de segurança representa as ações que são ou não permitidas

durante a operação de um sistema. Uma política de segurança de alto nível

leva em consideração a operação segura de um sistema em caráter

integral, sem necessariamente prover detalhes de implementação de como

os resultados desejados devem ser alcançados. A política de segurança

representa as considerações gerais em termos mais precisos dos requisitos

de segurança do sistema, passando por um processo de refinamento na

especificação do sistema para o qual ela será aplicada. (SILVA ET AL.,

2008, p.6)

É importante lembrar que a política de segurança tem um caráter de processo

de aculturação de segurança, pois deve ser seguida pelo corpo técnico e gerencial e

pelos usuários, internos ou externos, e estabelece, ainda, procedimentos de

segurança adequados, processos de auditoria e uma base para procedimentos

legais na sequência de ataques.

A política de segurança, assim como toda política institucional, deve ser clara,

alinhada com os objetivos de negócio, aprovada e apoiada pela alta gerência e

divulgada a todos os funcionários e usuários. A sua definição deve ir além dos

aspectos relacionados com sistema de informações e recursos computacionais, visto

que, uma má ou boa política de segurança vai influenciar em impactos sobre todos

os projetos de informática e todas as informações da organização. A figura 1 mostra

esse relacionamento da política de segurança de informações com vários projetos e

com a estratégia da organização.

19

Figura 1: Política de Segurança de informações e seus relacionamentos.

Fonte: DIAS, 2000, p. 49

20

3. CRIPTOGRAFIA

A criptografia, do grego kriptós, oculta, e grápho, grafia, é a arte ou ciência de

escrever em cifra ou em códigos, de forma a permitir que somente o destinatário a

decifre (KRONBAUER, 2007, p.17). Para Silva et.al (2008, p.13), a “criptografia é a

'ciência' de fazer com que o custo de adquirir uma informação de maneira imprópria

seja maior que o custo obtido com a informação”.

A criptografia usa uma chave (algoritmo criptográfico) para cifrar um texto

original e para decifrar faz-se o procedimento inverso com o texto cifrado.

(…) um algoritmo criptográfico da Alice com chave K criptografa um texto

legível x obtendo-se um outro texto ilegível 𝑓𝑘 𝑥 = 𝑦. O texto y é transmitido

para o computador-destino do Beto onde y é decriptografado pelo algoritmo

inverso 𝑓𝑘−1 𝑦 obtendo-se x se e só se o destinatário Beto conhece a chave

K. Para quem desconhece a chave K é computacionalmente difícil obter-se

x a partir do conhecimento de y, se o algoritmo for bem projetado, isto é, se

for seguro (TERADA, 2000, p.18).

As técnicas criptográficas podem ser usadas como um meio efetivo de

proteção de dados suscetíveis a ataques, estejam eles armazenados em um

computador ou trafegando pela rede. Assim, a criptografia serve de base a uma

série de mecanismos de segurança, como: garantir serviços básicos de

autenticação, privacidade e integridade dos dados. Existem basicamente dois tipos

de criptografia: a simétrica e a assimétrica, que serão tratados a seguir.

3.1. CRIPTOGRAFIA SIMÉTRICA

A criptografia simétrica realiza a cifragem e a decifragem de uma informação

através de algoritmos que utilizam a mesma chave, garantindo sigilo na transmissão

e armazenagem de dados.

Sistema simétrico ou de chave secreta é o método de encriptação que utiliza

uma mesma chave (o segredo, como nos tempos antigos) para encriptar e

decriptar a mensagem. Esta forma é conhecida como Criptografia por Chave

Secreta ou Chave Única, Criptografia Simétrica ou Criptografia Tradicional

(XAVIER, 2005, p.28).

A figura 2 ilustra de forma simples o funcionamento da chave simétrica. A

soma da mensagem com a chave gera uma mensagem criptografada, após é

21

enviada através da rede e ao chegar ao lado oposto é decriptografado com a chave

que está no destino.

Figura 2: Esquema para cifragem e decifragem com chaves simétricas

Fonte: XAVIER, 2005, p.29

Os algoritmos criptográficos envolvem a substituição de um dado por outro. E

um algoritmo de chaves simétricas muito conhecido é a cifra de César, utilizada pelo

imperador romano Júlio César. A técnica consiste em se trocar cada letra do alfabeto

por uma letra que se encontra a n lugares da original (onde n é um número natural,

que no caso do imperador romano era 3). Por exemplo, a mensagem original “casa”

se torna “fdvd” em texto cifrado. A figura 3 mostra um exemplo de criptografia

simétrica por substituição, a partir da técnica de Júlio César.

Figura 3: Exemplo de criptografia simétrica por substituição, técnica de Júlio César

Fonte: BROCARDO, 2006, p.16

22

Outro algoritmo de chave secreta é o DES (Data Encryption Standard), um

padrão de criptografia de chaves simétricas desenvolvido em 1977. Porém, em

1997, o NIST (National Institute of Standards in Technology) lançou uma competição

aberta para o sucessor do DES, chamado AES (Advanced Encryption Standards).

Além da necessidade de se ter um algoritmo mais seguro e eficiente que o DES, já

que este apresentava fragilidades, o NIST iniciou um programa para

desenvolvimento de um padrão único para a proteção de dados informatizados e

comunicação de dados, de tal forma que este padrão fosse totalmente público e

permitisse que diferentes equipamentos pudessem interoperar (BROCARDO, 2006,

p. 19).

E de acordo com Kurose (2006, p.520), o Padrão Avançado de Criptografia

(Advanced Encryption Standards – AES), também conhecido como algoritmo de

Rijndael, é um algoritmo de chave simétrica que processa dados em blocos de 128

bits e pode funcionar com chaves de 128, 192 e 256 bits de comprimento. O NIST

estima que uma máquina que conseguisse quebrar o DES de 56 bits em 1 segundo

(isto é, experimentar 255

chaves por segundo), levaria aproximadamente 149 trilhões

de anos para quebrar uma chave AES de 128 bits.

3.2. CRIPTOGRAFIA ASSIMÉTRICA

A criptografia assimétrica surgiu devido aos problemas relacionados a

segurança da criptografia simétrica.

O principal problema relacionado à criptografia simétrica está no fato de que

as partes que necessitam utilizá-la devem ter acesso à mesma chave.

Portanto, há a necessidade da adoção de uma política de segurança para a

troca e guarda das chaves. Esta política acarreta dois problemas quanto à

segurança, decorrentes do gerenciamento das chaves. O primeiro diz

respeito à conservação do segredo de uma chave que é de conhecimento

de várias pessoas. Bastaria uma delas agir de forma dolosa para que todos

sofressem as eventuais consequências. O segundo problema refere-se à

própria distribuição da chave. Sempre que uma nova pessoa fosse admitida

no grupo, necessitaria receber essa chave. (BROCARDO, 2006, p.19)

A criptografia assimétrica, também chamada de criptografia de chaves

públicas, envolve o uso de duas chaves distintas, a pública e a privada, que

funcionam em conjunto (uma das chaves cifra e a outra consegue decifrar). A chave

23

privada deve ser mantida em segredo, enquanto que a chave pública deve ser

distribuída. O algoritmo que atualmente é a base da maioria das aplicações que

utilizam criptografia assimétrica é o RSA (cujo nome se deve a seus inventores –

Ron Rivest, Adi Shamir e Leonard Adleman).

A figura 4 representa o funcionamento da criptografia assimétrica, onde

alguém que possui a chave pública de Beto cifra uma mensagem e somente o Beto

pode decifrar a mensagem, pois só ele tem a chave privada correspondente.

Figura 4: Criptografia de chaves públicas

O princípio do algoritmo RSA é construir chaves públicas e privadas utilizando

números primos. Assim, de acordo com Kurose (2006, p. 522), há dois componentes

inter-relacionados no RSA:

a) a escolha da chave pública e da chave privada;

b) o algoritmo de criptografia/decriptografia.

3.2.1 FUNCIONAMENTO DO ALGORITMO RSA

Para a obtenção das chaves, seguem os seguintes passos:

a) Escolhe-se de forma aleatória dois números primos de valores altos, 𝑝 e 𝑞. Para

maior segurança, deve-se escolher dois primos com o mesmo número de bits e

quanto maiores os valores, mais difícil será quebrar o RSA, porém mais tempo se

levará para realizar a codificação e decodificação (KUROSE, 2006, p.522).

24

b) Efetua-se os produtos:

𝑛 = 𝑝𝑞 e 𝑧 = 𝑝 − 1 (𝑞 − 1)

“O RSA Laboratories recomenda que o produto de 𝑝 e 𝑞 seja da ordem de

1024 bits para uso empresarial e de 768 bits para utilização com 'informações

menos valiosas'” (KUROSE, 2006, p.522).

c) Escolhe-se de forma aleatória um número 𝑒 de forma que seja menor do que 𝑛 e

que 𝑒 e 𝑧 sejam números primos entre si, ou seja, não têm fatores comuns (exceto o

1).

d) Calcula-se 𝑑 (chave para decifrar), tal que 𝑒𝑑 − 1 seja divisível exatamente por 𝑧,

isto é, dado 𝑒,obtém-se 𝑑 tal que o resto da divisão de 𝑒𝑑 por 𝑧 seja o número inteiro

1.

e) A chave pública é o par de números 𝑛, 𝑒 e a chave privada, 𝑛, 𝑑 .

A criptografia e a decriptografia acontece da seguinte maneira:

a) Suponha que se queira enviar um padrão de bits 𝑚 tal que 𝑚 < 𝑛. Para codificar,

calcula-se a potência 𝑚𝑒 e gera-se o resto inteiro da divisão de 𝑚𝑒 por 𝑛. Assim, o

valor cifrado, 𝑐, da mensagem em texto aberto, 𝑚, é:

𝑐 = 𝑚𝑒 𝑚𝑜𝑑 𝑛

b) Para decifrar a mensagem em texto cifrado, 𝑐, basta processar:

𝑚 = 𝑐𝑑 𝑚𝑜𝑑 𝑛

Para um melhor entendimento (KUROSE, 2006, p.523), vamos supor que Bob

escolha 𝑝 = 5 e 𝑞 = 7 (note que admitimos valores muito pequenos, para ser seguro

é necessário que os valores sejam altos). Logo, temos 𝑛 = 35 e 𝑧 = 24. Bob escolhe

𝑒 = 5, já que 5 e 24 não têm fatores em comuns. Por fim, obtém-se 𝑑 = 29, pois

5 ∙ 29 − 1 é divisível exatamente por 24 ( 5 ∙ 29 𝑚𝑜𝑑 24 = 1). Ele divulga os dois

valores 𝑛 = 35 e 𝑒 = 5, e mantém em segredo o valor 𝑑 = 29. Agora, suponha que

Alice queira enviar as letras 'l', 'o', 'v' e 'e' a Bob. Cada letra do alfabeto é

representado por um número como mostra a tabela 1.

Tabela 1: Representação numérica de cada letra do alfabeto

A criptografia e a decriptografia realizadas por Alice e Bob estão mostradas na

25

tabela 2 e 3, respectivamente.

Tabela 2: Criptografia RSA para Alice: e= 5 , n= 35

Fonte: KUROSE, 2006, p.523

Tabela 3: Decriptografia RSA para Bob: d = 29 , n= 35

Fonte: KUROSE, 2006, p. 524

26

4. CERTIFICAÇÃO DIGITAL

De acordo com o ITI (Instituto Nacional de Tecnologia da Informação), “a

certificação digital é um conjunto de técnicas e processos que propiciam mais

segurança às comunicações e transações eletrônicas, permitindo também a guarda

segura de documentos” (ITI, 2009). Utilizando-se a certificação digital é possível

evitar que hackers interceptem ou adulterem as comunicações realizadas via

Internet ou, então, garantir a integridade de dados confidenciais.

A certificação digital baseia-se na existência de certificados digitais, que, para

Brocardo (2006, p. 34), “é um documento eletrônico assinado digitalmente por uma

autoridade certificadora, e que contém diversos dados sobre o emissor e seu titular”.

Assim, o certificado digital visa atestar a identidade de seu titular (pessoa física ou

jurídica) em documentos ou e-mails digitalmente assinados, em navegações na

Internet ou em operações online, inclusive as sigilosas.

Podemos dizer, de forma genérica, que um certificado digital é a versão

digital de um documento de identidade. Quando é necessário comprovar

sua identidade, o certificado é utilizado como forma de presença, por

mostrar a chave privada que se relaciona com uma chave pública. (SILVA et

al, 2008, p.25)

A função do certificado digital é a de vincular uma pessoa ou uma entidade a

uma chave pública.

4.1. ESTRUTURA HIERÁRQUICA DA CERTIFICAÇÃO DIGITAL

Muitos profissionais costumam fazer uma analogia entre a estrutura

hierárquica de um certificado digital e de uma carteira de identidade. Por exemplo, o

documento oficial de identificação, o RG, é expedido pela Secretaria de Segurança

Pública, que atesta quem você realmente é, e no mundo virtual, o processo não é

diferente. A figura 5 mostra essa analogia.

27

Figura 5: Analogia entre o processo para expedir um RG e um Certificado Digital.

Fonte: BROCARDO, 2006, p. 35

Para que os certificados digitais possam ser aceitos e utilizados por pessoas,

empresas e governos, precisam ser emitidos por entidades apropriadas. Conforme

Brocardo (2006, p. 35) afirma:

O certificado digital é emitido por uma Autoridade de Certificação (AC), que

pode ser uma empresa, organização ou indivíduo, tanto público quanto

privado. A Autoridade de Registro (AR) atua como tabelião para verificar e

autenticar a identidade dos usuários de um sistema criptográfico de chave

pública. Uma AC pode fazer o papel de uma AR.

A AC responsabiliza-se pela distribuição da chave pública e pela garantia de

que uma determinada chave pública esteja seguramente ligada ao nome de

seu dono.

28

4.2. INFRA-ESTRUTURAS DE CHAVES PÚBLICAS BRASILEIRAS

(ICP-BRASIL)

Como já foi abordado, o uso da certificação digital proporciona aos usuários

autenticidade, integridade, sigilo e não repúdio em um ambiente inseguro, o que

possibilita a execução de operações que necessitem de um grau elevado de

segurança. Vimos também que um certificado deve ser emitido por uma AC. Quando

essa AC é reconhecida, ou como os especialistas chamam confiáveis, o certificado

digital é reconhecido perante o mundo, ou seja, garante, por força da legislação,

validade jurídica aos atos praticados com seu uso. Porém, por esses certificados

serem um pouco caros, quando se quer trabalhar com certificados digitais de uma

forma interna (por exemplo, comunicação interna na empresa) não é necessário

uma solicitação para uma AC reconhecida, pois qualquer pessoa pode produzir seu

próprio certificado digital.

Na maioria dos países, os certificados não seguem um protocolo único de

segurança, causando problemas, como: dificuldades inter-relacionais e em muitos

casos o certificado não tem um valor legal.

Para evitar esses problemas, o Brasil se baseou em um Estrutura Única de

Certificação, em que o Governo tem o controle de toda a cadeia de regulamentação

para que a certificação funcione corretamente.

Assim, uma das formas de um certificado digital ter a validade jurídica e até

mesmo garantir segurança em transações eletrônicas que o Governo venha a fazer

é a implantação de uma Infra-Estrutura de Chaves Públicas (ICP). No Brasil foi

implantado a ICP-Brasil (Infra-Estrutura de Chaves Públicas Brasileira) como mostra

a Medida Provisória nº 2.200-2, de 24 de Agosto de 2001:

O PRESIDENTE DA REPÚBLICA, no uso da atribuição que lhe confere o

art.62º da Constituição, adota a seguinte Medida Provisória, com força de

lei:

Art. 1º Fica instituída a Infra-Estrutura de Chaves Públicas Brasileira – ICP-

Brasil, para garantir a autenticidade, a integridade e a validade jurídica de

documentos em forma eletrônica, das aplicações de suporte e das

aplicações habilitadas que utilizem certificados digitais, bem como a

realização de transações eletrônicas seguras.

A ICP-Brasil, segundo o próprio site, se define como um conjunto de técnicas,

29

práticas e procedimentos implementados pelas organizações governamentais e

privadas brasileiras com o objetivo de estabelecer os fundamentos técnicos e

metodológicos de um sistema de certificação digital baseado em criptografia de

chave pública.

A estrutura da ICP-Brasil é do tipo hierárquica e tem uma concepção

institucional, definição de Raiz Única, com as Autoridades Certificadoras como

âncoras de confiança. A figura 6 mostra a estrutura da ICP-Brasil de forma resumida,

com as Autoridades Certificadoras de 1º nível e de 2º nível, sendo que no topo da

estrutura temos a Autoridade Certificadora Raiz (AC-Raiz).

Figura 6: Estrutura da ICP-Brasil de forma resumida

A figura 7 mostra de forma simplificada o sistema de certificação digital

brasileiro, note que a ICP-Brasil está vinculada ao ITI, pois o ITI é o órgão

responsável por manter a ICP-Brasil. O Comitê Gestor da ICP-Brasil e a Autoridade

Certificadora Raiz, assim como as demais entidades que compõem a estrutura,

30

foram instituídas pela Medida Provisória 2.200-2, de 24 de Agosto de 2001. A partir

dessa medida, foram elaborados os regulamentos que passaram a reger as

atividades das entidades integrantes da ICP-Brasil, chamados de resoluções do

Comitê Gestor da ICP-Brasil.

Figura 7: Simplificação do sistema de certificação digital brasileiro

Fonte: VERONESE; FREITAS, 2007, p.18

A certificação digital da ICP-Brasil é considerada segura devido a auditoria

que é feita nas autoridades, seja certificadora ou de registro, representando assim

teias de confiança.

As entidades participantes da ICP-Brasil são auditadas previamente ao

credenciamento, para verificar se estão aptas a desenvolver suas atividades

conforme os regulamentos. São efetuadas auditorias, também, anualmente,

para verificar se todos os procedimentos previstos foram executados. (SILVA

et al, 2008, p. 80)

Para um melhor entendimento da estrutura da ICP-Brasil, vamos descrever

cada tipo de entidade componente, a seguir.

4.2.1. COMITÊ GESTOR (CG)

É a entidade máxima dentro da estrutura da ICP-Brasil, é quem coordena a

implantação e o funcionamento da ICP-Brasil, estabelece a política e as normas

31

para credenciamento das Autoridades Certificadoras e das Autoridades de Registro,

definindo níveis da cadeia de certificação, e fiscaliza a atuação da Autoridade

Certificadora Raiz.

Os membros do CG são nomeados pelo Presidente da República, entre

representantes dos poderes da República, bem como, de segmentos da sociedade e

das Instituições de Ensino Superior, como forma de dar estabilidade, transparência e

confiabilidade ao sistema.

4.2.2. AUTORIDADE CERTIFICADORA RAIZ (AC-RAIZ)

É a primeira autoridade da cadeia de certificação. É a executora das políticas

de certificados e normas técnicas e operacionais aprovadas pelo CG, portanto, a

AC-Raiz emiti, expedi, distribui, revoga e gerencia os certificados das autoridades

certificadoras de nível imediatamente subsequente ao seu.

A AC-Raiz, também, está encarregada de emitir a lista de certificados

revogados e de fiscalizar e auditar as autoridades certificadoras e as autoridades de

registro, bem como, as demais prestadoras de serviço habilitados na ICP-Brasil.

4.2.3. AUTORIDADES CERTIFICADORAS (ACs)

São entidades, pública ou privada, credenciadas a emitir certificados digitais,

vinculando pares de chaves criptográficas ao respectivo titular.

As ACs são responsáveis por emitir, distribuir, renovar e gerenciar certificados

digitais, e colocá-los à disposição dos usuários. De acordo com o site da ICP-Brasil,

desempenha, como função essencial, a responsabilidade de verificar se o titular do

certificado possui a chave privada que corresponde à chave pública que faz parte do

certificado. Cria e assina digitalmente o certificado do assinante, onde o certificado

emitido pela AC representa a declaração da identidade do titular, que possui um par

único de chaves (pública e privada).

4.2.4. AUTORIDADES DE REGISTRO (ARs)

De acordo com o site da ICP-Brasil, as ARs são entidades responsáveis pela

32

interface entre o usuário e a AC. Elas são vinculadas a uma AC e tem por objetivo o

recebimento, validação, encaminhamento de solicitações de emissão ou revogação

de certificados digitais às ACs e identificação, de forma presencial, de seus

solicitantes.

As ARs têm como responsabilidade manter o registro de suas operações e

pode estar fisicamente localizada em uma AC ou ser uma entidade de registro

remota.

4.3. TIPOS DE CERTIFICADOS

A ICP-Brasil oferece duas categorias de certificados digitais: A e S, sendo que

cada uma se divide em quatro tipos: A1, A2, A3 e A4; S1, S2, S3 e S4. A categoria A

é direcionada para assinatura digital e a do tipo S é direcionada para atividades

sigilosas.

A seguir apresentamos a tabela 4 em que apresenta as descrições dos tipos

de certificados.

Tabela 4: Tipos de certificados e suas descrições

4.4. ESTRUTURA DE UM CERTIFICADO DIGITAL

O certificado digital é uma estrutura de dados, dentro do qual estão, no

mínimo, as seguintes informações:

Nome da pessoa ou entidade a ser associado à chave pública

33

Período de validade

Chave pública

Nome e assinatura da entidade que emitiu o certificado

Número de série

Figura 8: Certificado Digital

Embora existam vários tipos de formatos de certificados em uso na Internet. A

maior aceitação, atualmente, é o certificado descrito pela recomendação X.509 do

ITU-T (International Telecommunication Union – Telecommunication Standartization

Sector). De acordo com Silva et al (2008, p. 26), o formato X.509 é um padrão de

formato criado pela ITU-T, primeiramente publicado em 1988. A versão um (v1) deste

34

formato foi estendida, em 1993, para incorporar dois campos usados em controle de

acesso, resultando na versão dois (v2) do formato, posteriormente, mais um recurso

foi necessário e em 1996 foi lançada a versão três (v3) com a possibilidade de usar

campos de extensão.

A figura 9 ilustra o formato X.509 com os campos que cada versão apresenta.

Figura 9: Estrutura do formato X.509

Fonte: Site http://www.cic.unb.br/~pedro/c003/c2.htm

As extensões (extensions) presentes na versão três do formato X.509

proporcionam uma possibilidade de entidades (organizações e empresas) definirem

seus próprios campos de extensões e codificar informações específicas às suas

necessidades. A própria ICP-Brasil, através da Resolução nº 41, de 18 de Abril de

2006, definiu as seguintes extensões obrigatórias:

Authority Key Identifier, não crítica: o campo keyIdentifier deve conter o hash

SHA-11 da chave pública da AC;

Key Usage, crítica: em certificados do tipo A, somente os bits digitalSignature,

nonRepudiation e keyEncipherment podem estar ativados. Em certificados do

tipo S, somente os bits keyEncipherment e dataEncipherment podem estar

ativados;

Certificates Policies, não crítica: deve conter o OID2 da Política de

1 Hash SHA-1 é um tipo de função hash, ou seja, é um tipo de algoritmo criptográfico que está

diretamente ligado com a assinatura digital. 2 OID ou Object Identifier é um identificador usado para nomear um objeto.

35

Certificação correspondente e o endereço Web da Declaração de Práticas de

Certificação da AC que emite o certificado;

CRL3 Distribution Points, não crítica: deve conter o endereço Web onde se

obtém a Lista dos Certificados Revogados correspondente.

A ICP-Brasil também define como obrigatória a extensão Subject Alternative

Name, não crítica, e com os seguintes formatos:

a) Para certificado de pessoa física, três campos othername, obrigatórios, contendo:

OID = 2.16.76.1.3.1

Conteúdo = nas primeiras oito posições, a data de nascimento do titular, no

formato ddMMaaaa; nas onze posições subsequentes, o Cadastro de Pessoa

Física (CPF); nas onze posições subsequentes, o Número de Identificação

Social – NIS (PIS, PASEP ou CI); nas quinze posições subsequentes, o

número do Registro Geral (RG) do titular; nas seis posições subsequentes, as

siglas do órgão expedidor do RG e respectiva UF.

OID = 2.16.76.1.3.6

Conteúdo = nas doze posições, o número do Cadastro Específico do INSS

(CEI) da pessoa física titular do certificado.

OID = 2.16.76.1.3.5

Conteúdo = nas primeiras doze posições, o número de inscrição do Título de

Eleitor; nas três posições subsequentes, a Zona Eleitoral; nas quatro posições

seguintes, a Seção; nas vinte e duas posições subsequentes, o município e a

UF do Título de Eleitor.

b) Para certificados de pessoa jurídica, quatro campos othername, obrigatórios,

contendo, nesta ordem:

OID = 2.16.76.1.3.4

Conteúdo = nas primeiras oito posições, a data de nascimento do responsável

pelo certificado, no formato ddMMaaaa; nas onze posições subsequentes, o

Cadastro de Pessoa Física (CPF) do responsável; nas onze posições

subsequentes, o Número de Identificação Social – NIS (PIS, PASEP ou CI) do

responsável; nas quinze posições subsequentes, o número do RG do

responsável; nas seis posições subsequentes, as siglas do órgão expedidor

do RG e respectiva UF;

3 CRL é a lista de certificados revogados.

36

OID = 2.16.76.1.3.2

Conteúdo = nome do responsável pelo certificado;

OID = 2.16.76.1.3.3

Conteúdo = Cadastro Nacional de Pessoa Jurídica (CNPJ) da pessoa jurídica

titular do certificado;

OID = 2.16.76.1.3.7

Conteúdo = nas doze posições, o número do Cadastro Específico do INSS

(CEI) da pessoa jurídica titular do certificado.

37

5. AUTENTICAÇÃO WEB COM CERTIFICADOS DIGITAIS

Este capítulo apresentará uma abordagem sobre o processo de autenticação,

bem como, a implementação de um protótipo de um sistema de autenticação

utilizando certificados digitais.

No capítulo anterior foi abordada a certificação digital de acordo com a ICP-

Brasil. Porém, neste trabalho, os certificados digitais usados não são emitidos por

uma AC credenciada pela ICP-Brasil, em virtude de que cada certificado do tipo

A1(tipo utilizado na aplicação) em uma AC credenciada custa em torno de R$ 110,00

(cento e dez reais), o que torna inviável o uso desse certificado neste trabalho

acadêmico. Mas, os certificados usados no aplicativo estão de acordo com as

especificações do capítulo anterior, pois, para que haja segurança na emissão dos

certificados os mesmos serão emitidos por uma AC. Mais adiante será simulada a

criação de uma “AC” para que todo certificado cliente seja criado e assinado

digitalmente, atendendo, assim, um sistema web para ambiente fechado, ou seja,

sistema com público alvo conhecido em que os usuários são identificados e

registrados pela própria instituição.

O tipo de certificado utilizado neste trabalho é do tipo A1, ou seja, suas

chaves criptográficas vão ser geradas por software, que no caso é o OpenSSL ou a

ferramenta Keytool, e o tamanho de suas chaves é de 1024 bits.

A aplicação de demonstração é um protótipo de autenticação típica em

sistemas web. O processo de autenticação empregado pode ser indicado para

sistemas em que exigem uma conexão segura. Por exemplo, um sistema de

lançamento de notas ou controle de reserva de publicações de uma biblioteca em

uma instituição de ensino. Tais sistemas devem prover a integridade das

informações, portanto, necessitam de uma conexão segura. Nesse caso, a própria

instituição poderá emitir e criar os próprios certificados dos usuários. É este o

cenário que será tratado neste trabalho.

5.1. TECNOLOGIAS UTILIZADAS

Para a implementação do protótipo do sistema de autenticação foram

38

utilizadas as seguintes tecnologias: Apache Tomcat, Eclipse Ganymede, JDK e

OpenSSL, que serão apresentadas cada uma a seguir.

5.1.1. APACHE TOMCAT

O próprio site do Apache Tomcat apresenta como definição que Apache

Tomcat é uma implementação de software Open Source do Java Servlet e

tecnologias Java Server Pages.

O Tomcat é um servidor web, mais especificamente, um contêiner. Possui

características próprias de um servidor de aplicação, porém, não pode ser

considerado um servidor de aplicação devido não preencher os requisitos

necessários; por exemplo, não tem suporte a Enterprise JavaBeans (EJB).

Desenvolvido pela Apache Software Foundation, dentro do projeto Jakarta, sendo

utilizado tanto em ambientes de desenvolvimento, quanto de produção, portanto,

robusto. A versão 6.0.20 foi a utilizada no presente trabalho.

5.1.2. ECLIPSE GANYMEDE

Eclipse Ganymede é uma plataforma de desenvolvimento para várias

linguagens de programação, e é composto por Ambiente de Desenvolvimento

Integrado (IDE) e um sistema de plugins para estendê-lo. É um software Open

Source e para seu funcionamento é necessário que se tenha uma Java Virtual

Machine (JVM) instalada no computador. A versão Ganymede do Eclipse utilizada foi

a 3.4.0.

5.1.3. JAVA DEVELOPMENT KIT (JDK)

Java Development Kit (JDK), que em português significa kit de

desenvolvimento Java, é um produto da Sun Microsystems destinado a

programadores Java. Constitui um conjunto de programas que englobam

compilador, interpretador e utilitários, fornecendo, assim, um pacote de ferramentas

básicas para o desenvolvimento de aplicações Java.

O JDK é liberado pela Sun sob a licença GNU General Public License (GPL) e

39

a versão utilizada neste trabalho é a 1.6.0_17.

5.1.4. OPENSSL

De acordo com o site do OpenSSL (OPENSSL, 2009), o projeto OpenSSL é

um esforço colaborativo, ou seja, é mantida por um grupo de voluntários de todo o

mundo, cujo o objetivo é desenvolver uma biblioteca criptográfica robusta e com

várias funcionalidades.

A sua biblioteca é de domínio público que pode ser utilizada livremente para

desenvolvimento de aplicações comerciais ou não. Nestas bibliotecas são

implementados protocolos para camadas de Secure Sockets Layer (SSL v2/v3) e de

Transport Layer Security (TLS v1), além de funcionalidades criptográficas de

propósitos gerais.

5.2. PROCESSO DE AUTENTICAÇÃO

O processo de autenticação vai utilizar a criptografia assimétrica. A sua

principal utilização não é só garantir a autenticação e o não repudio do emissor, mas

também garantir a confidencialidade e a integridade das mensagens.

O uso dos certificados digitais determina quem é efetivamente o dono das

chaves públicas distribuídas, pois, como já foi dito, o certificado digital é um

documento eletrônico assinado digitalmente por uma autoridade certificadora, e que

contém diversos dados sobre o emissor e seu titular, cuja função é vincular uma

pessoa ou entidade a uma chave pública.

De acordo com Kurose (2006, p. 555), o protocolo SSL foi desenvolvido pela

Netscape e é um protocolo projetado para fornecer criptografia de dados e

autenticação entre um cliente e um servidor Web.

A combinação do protocolo SSL (Secure Sockets Layer) com o protocolo

HTTP (Hypertext Transfer Protocol) nos dá o HTTPS (Hypertext Transfer Protocol

Secure), que fornece encriptação de dados, autenticação de servidor, integridade de

mensagem e autenticação de cliente. Caso seja feita uma análise na pilha TCP/IP,

podemos dizer que o SSL está em uma sub-camada localizada entre a camada de

aplicação e a camada de transporte, como mostra a figura 10.

40

Aplicação (HTTP)

Segurança (SSL)

Transporte (TCP)

Rede (IP)

Enlace de Dados (PPP)

Física (Modem, ADSL)

Figura 10: Pilha TCP/IP – Camadas para um usuário navegando com SSL

O sistema implementado consiste no uso de um certificado servidor e do

certificado cliente em que há a utilização do SSL duplo. O uso do certificado servidor

irá garantir a identidade do servidor e os clientes terão certeza de que estão

acessando o site desejado. Quando a autenticação é somente do servidor,

chamamos de SSL simples, mas quando a autenticação é de ambos os lados

(servidor e cliente), chamamos de SSL duplo. Para os propósitos do trabalho, é

utilizado o SSL duplo.

5.3. GERAÇÃO DOS CERTIFICADOS

Obter um certificado emitido por uma AC dentro da cadeia do ICP-Brasil pode

ser um pouco caro e burocrático. Em virtude disso, estaremos gerando e simulando

certificados que serão utilizados no sistema. Para a geração desses certificados

serão utilizadas as ferramentas OpenSSL e o Keytool4.

5.3.1. CRIAÇÃO DA CHAVE E DO CERTIFICADO DA AUTORIDADE

CERTIFICADORA

O comando para a criação da chave :

O comando acima gera a chave privada com tamanho de 1024 bits e usa o

4 Keytool é uma ferramenta de gerenciamento de chaves e certificados e é uma das ferramentas

presente no Java Development Kit (JDK).

C:\OpenSSL\bin>openssl req -new -newkey rsa:1024 -nodes -out

C:\Certificados\CA.csr -keyout C:\Certificados\CA.key

41

algoritmo criptográfico RSA. O arquivo “CA.key” é o que contém a chave privada da

AC.

O comando para a geração do certificado da AC é:

Após a execução deste comando, teremos o certificado da AC com validade

de cinco anos. As informações da chave privada e do certificado estão armazenados

no arquivo “CA.pem”.

5.3.2. CRIAÇÃO DO KEYSTORE, DO CERTIFICADO DO SERVIDOR E

DO TRUSTSTORE

Para a criação do certificado do servidor é utilizada a ferramenta Keytool. O

comando keytool será usado para criar um Keystore5 contendo um certificado digital

para o servidor, que no caso será o Tomcat.

O comando abaixo é para a criação do Keystore e do certificado do servidor.

O comando acima gera um par de chaves e um certificado referenciado pelo

alias “tomcat” com validade de 365 dias e que será armazenado no Keystore

“tomcat.jks”, e usa algoritmos RSA e SHA1WithRSA para gerar o par de chaves e o

certificado.

Antes da criação do Truststore6 é necessário converter o certificado da AC

que está na extensão “.pem” para a extensão “.der”, como segue abaixo:

E para a criação do Truststore, segue o comando:

5 Keystore é um armazenamento de chave que contém a chave privada, logo contém também o

certificado do servidor. 6 Truststore contém os certificados das Autoridades Certificadoras que pode confiar.

C:\OpenSSL\bin>openssl x509 –in C:\Certificados\CA.pem –out

C:\Certificados\CA.der –outform DER

C:\Arquivos de Programas\Java\jdk1.6.0_17\bin>keytool –genkey –

alias tomcat –keyalg RSA –sigalg SHA1WithRSA –keystore

C:\Certificados\tomcat.jks –validity 365

C:\OpenSSL\bin>openssl x509 –trustout –signkey

C:\Certificados\CA.key –days 1825 –req –in C:\Certificados\CA.csr

–out C:\Certificados\CA.pem

42

5.3.3. CRIAÇÃO DO CERTIFICADO DO CLIENTE

Para a solicitação do certificado do cliente é executado o seguinte comando:

O comando acima cria um novo pedido de certificado e uma nova chave

privada, onde se utiliza o algoritmo criptográfico RSA e o tamanho da chave é 1024

bits. O arquivo “CLIENTE.key” guarda as informações da chave privada criada.

O próximo passo é criar e assinar o certificado do cliente através da AC

criada. Para tal procedimento é executado o seguinte comando:

Como muitos utilizam o padrão Windows, é necessário criar o arquivo “.p12”,

como segue abaixo:

5.4. CONFIGURAÇÃO DO SSL

A proposta que se quer apresentar é a construção de um sistema de

autenticação usando certificados digitais, mas para que a autenticação seja

considerada forte é necessário habilitar o SSL duplo, configurando o servidor

Apache Tomcat. O código abaixo é a configuração da porta 8443 para o SSL duplo,

em que pertence ao arquivo server.xml da pasta conf do Tomcat.

C:\OpenSSL\bin>openssl pkcs12 –export –in

C:\Certificados\CLIENTE.pem –inkey C:\Certificados\CLIENTE.key –

out C:\Certificados\CLIENTE.p12

C:\OpenSSL\bin>openssl x509 –req –in C:\Certificados\CLIENTE.req –

CA C:\Certificados\CA.pem –CAkey C:\Certificados\CA.key –

CAcreateserial –out C:\Certificados\CLIENTE.pem

C:\OpenSSL\bin>openssl req –new –newkey rsa:1024 –nodes –out

C:\Certificados\CLIENTE.req –keyout C:\Certificados\CLIENTE.key

C:\Arquivos de Programas\Java\jdk1.6.0_17\bin>keytool –importcert

–alias ifpa –file C:\Certificados\CA.der –keystore

C:\Certificados\truststore.jks –storepass c796ne

43

Vale lembrar que o Keystore e o Truststore criados na sub-seção 5.3.2 devem

estar na pasta conf do Tomcat.

Antes de testarmos a configuração do Apache Tomcat é necessário importar o

certificado da AC e do cliente no Browser (como exemplo, será utilizado o Mozilla

Firefox).

No Mozilla Firefox, utilizaremos o menu “Ferramentas/Opções”, na categoria

“Avançado”, na aba “Criptografia”, conforme a figura 11:

Figura 11: Janela “Opções”, na categoria “Avançado”, na aba “Criptografia”

Clicando o botão “Certificados”, teremos o Gerenciador de Certificados.

<Connector port= “8443” protocol= “HTTP/1.1” SSLEnabled= “true”

maxThreads= “150” scheme= “https” secure= “true” keystoreFile=

“conf/tomcat.jks” keystorePass= “c796ne” truststoreFile=

“conf/truststore.jks” truststorePass= “c796ne” clientAuth= “true”

sslProtocol= “TLS” />

44

Figura 12: Gerenciador de Certificados

Para a importação do certificado da AC, selecionamos a aba “Autoridades” e

clicamos no botão “Importar”. Navegamos até o diretório em que se encontra o

certificado da AC, que no caso deste trabalho, conforme seção 5.3.1, chama-se de

“CA.pem”. Será apresentado o diálogo a seguir:

Figura 13: Diálogo para a importação do Certificado da AC

Marcando todas as opções e clicando no botão “OK” será concluída a

importação do certificado da AC.

Para a importação do certificado do cliente, selecionamos a aba “Seus

45

certificados” e clicamos no botão “Importar”. Navegamos até o diretório em que se

encontra o certificado do cliente e clicamos em “OK”. Os dados do certificado

deverão aparecer na lista do Gerenciador, como mostra a figura 14.

Figura 14: Dados do Certificado do Cliente no Gerenciador de certificados

Quando testamos a configuração do Apache Tomcat, em vez de

http://localhost:8080, deve-se trabalhar com a seguinte URL: https://localhost:8443.

Acessando essa página, o servidor solicita a identificação do usuário com uso de

certificado digital, confirmando a solicitação, é redirecionado para a página do

servidor.

Figura 15: Solicitação de identificação do usuário utilizando certificado digital

46

A utilização do certificado do servidor em conjunto com a tecnologia SSL

possibilita criptografar e proteger as informações transmitidas pela internet,

garantindo uma conexão segura entre o navegador do usuário e o servidor web. O

ícone do cadeado na barra de status simboliza essa conexão segura, como visto na

figura 16.

Figura 16: Ícone do cadeado na barra de status do navegador

5.5. AUTENTICAÇÃO E MANIPULAÇÃO DE CERTIFICADOS

O protótipo desenvolvido utilizou as tecnologias Java Server Pages (JSP) e

Servlet, e dentre as bibliotecas usadas temos o Bouncy Castle e o Java

Cryptography Architecture (JCA). O Bouncy Castle, assim como o JCA, é uma API

de segurança da linguagem de programação Java que permite aos programadores

incluir nas aplicações funcionalidades criptográficas.

A figura 17 ilustra o fluxo de funcionamento do sistema. O sistema obtém o

certificado do browser através do atributo da interface ServletRequest. Caso o valor

do atributo seja nulo, ocorre uma exceção. Se o valor do atributo não for nulo,

podem ocorrer duas alternativas: ou são mostrados os dados do certificado ou é

feita a autenticação.

47

Figura 17: Fluxo de funcionamento do sistema

Na figura 18 é mostrada a página principal do protótipo (index.jsp). No

Apêndice temos o código da página index.jsp, assim como os demais códigos.

Figura 18: Página index.jsp do protótipo do Sistema de Autenticação

48

Figura 19: Solicitação de identificação do usuário

Quando solicitamos Mostrar Certificado ou Acessar, ocorre o que foi abordado

na seção 5.2, ou seja, sucede a autenticação de ambos os lados (servidor e cliente),

conforme mostra a figura 19 com a solicitação de identificação do usuário. Há,

também, outro fato acontecendo: a obtenção do certificado do cliente no browser

através do seguinte atributo da interface ServletRequest:

E quando colocamos o código abaixo, estamos retornando o valor do atributo,

ou seja, estamos obtendo informações sobre o certificado do cliente.

Após obter o certificado do cliente, é possível verificar os dados do certificado,

como: assunto, número de série, as datas de início e de término da validade e o

emissor. Basta extrair os dados listados e preencher as variáveis apropriadas.

X509Certificate[] certs = (X509Certificate[]) req.getAttribute

(CLIENT_CERT);

private static final String CLIENT_CERT =

“javax.servlet.request.X509Certificate”;

49

A figura 20 mostra a página JSP dos dados do certificado do cliente.

Figura 20: Página dadosCertificado.jsp, mostra os dados do certificado do cliente

Para que possamos trabalhar com a autorização e autenticação do sistema é

necessário extrair o CN7, ou seja, o campo assunto do certificado identifica o titular

(proprietário do certificado) e nesse campo há o CN, que, normalmente, contém o

nome de uma empresa ou nome de uma pessoa. E para obter esse campo,

utilizamos a função getSubjectX500Principal() que retorna uma instância da classe

X500Principal.

7 CN é o Common name, é o campo do certificado que contém o nome de uma empresa ou nome de

uma pessoa.

String assunto = eeCert.getSubjectX500Principal().toString();

String numeroDeSerie = eeCert.getSerialNumber().toString(16);

String inicioValidade = eeCert.getNotAfter().toString();

String fimValidade = eeCert.getNotBefore().toString();

String emissor = eeCert.getIssuerX500Principal().toString();

req.setAttribute (Constantes.ASSUNTO, assunto);

req.setAttribute (Constantes.NUMERO_DE_SERIE, numeroDeSerie);

req.setAttribute (Constantes.INICIO_VALIDADE, inicioValidade);

req.setAttribute (Constantes.FIM_VALIDADE, fimValidade);

req.setAttribute (Constantes.EMISSOR, emissor);

50

A figura 21 mostra a página de acesso autorizado, ou seja, quando o

certificado é autorizado pelo sistema, conseguimos acessar esta página.

Figura 21: Página entradaForca.jsp

req.setAttribute(“nome”,

IcpBrasilUtils.getNome(eeCert.getSubjectX500Principal());

static String getNome(X500Principal assunto){

if(assunto != null){

X509NameTokenizer NameTokenizer = new

X509NameTokenizer(assunto.toString());

while (NameTokenizer.hasMoreTokens()){

String token = NameTokenizer.nextToken();

if(token.startsWith(“CN=”)){

return token.substring(3, token.length());

}

}

}

Return “”;

}

51

6. CONCLUSÃO

Sabe-se que a informação é um bem valioso e disputado, e a Internet se

tornou um meio de acelerar e movimentar as informações. Portanto, a necessidade

de autenticação de usuários para a segurança de sistemas é evidente e o uso de

mecanismos tradicionais, como login e senha, tem se mostrado muito vulnerável a

ataques. E além do mais, qualquer informação transmitida em redes de

computadores, ou na Internet, está vulnerável a interceptação por outros não

autorizados. Logo, uma das soluções para esse tipo de problema é o uso de

certificados digitais.

Então, combinando conceitos de segurança da informação, criptografia,

certificação digital e processo de autenticação utilizando SSL Duplo, propomos uma

alternativa de autenticação para atender um sistema web de ambiente fechado. O

uso da criptografia assimétrica em conjunto com o certificado digital torna possível

chegar ao objetivo de proteção de dados, que é proporcionado pela configuração do

Apache Tomcat.

Portanto, o sistema desenvolvido contribui para fornecer a autenticidade,

integridade e confidencialidade das informações, já que, atualmente, as informações

são consideradas um bem valioso. E o Instituto Federal de Educação, Ciência e

Tecnologia do Pará (IFPA) pode usufruir desta solução, melhorando a sua segurança

em seu sistema de Lançamento de Notas ou até mesmo em outro sistema, como por

exemplo, a reserva de livros na Biblioteca.

Como muitas redes internas buscam uma melhoria na sua segurança, essa

proposta de autenticação colabora para essa melhoria. Porém, não podemos deixar

de citar que para um sistema ter um nível de segurança alto é interessante empregar

os três paradigmas (algo-que-você-sabe, algo-que-você-tem e algo-que-você-é).

Mecanismos de autenticação se baseiam principalmente em três

paradigmas: algo-que-você-sabe, algo-que-você-tem ou algo-que-você-é.

No paradigma algo-que-você-sabe, um requerente apresenta conhecimento

de algo, como uma senha. Na abordagem algo-que-você-tem, um

requerente demonstra a posse de algo como uma chave física, cartão ou

arquivo. O paradigma algo-que-você-é é baseado em uma característica

imutável verificável do requerente, como a voz, impressão digital ou padrão

de retina (SILVA et al, 2008, p. 7).

52

Vale lembrar que o sistema desenvolvido é apenas um protótipo e os

certificados apresentados não podem ser de uso externo, pois não há validade

jurídica. Para ter essa validade é necessário que os certificados sejam emitidos por

uma AC credenciada pelo ICP-Brasil.

A certificação digital não se resume somente na autenticação de usuários,

muitas são as aplicações dessa tecnologia. Deste modo, há vários pontos a serem

aprofundados e consequentemente, muitos trabalhos científicos podem, assim como

devem ser desenvolvidos futuramente. Por exemplo, não foi tratado neste trabalho e

que pode ser trabalhado futuramente:

a) testar a aplicação web em outras linguagens de programação;

b) validar a proposta em um sistema real;

c) implementar e integrar um SGBD ( Sistema de Gerenciamento de Banco de

Dados);

d) obter OIDs válidos para uso nas extensões dos certificados;

e) trabalhar uma das aplicações da certificação que vem sendo bastante

utilizada: a assinatura digital, que recentemente o Ministério da Educação

vem adotando em suas transações eletrônicas; e muitas outras.

Apesar da certificação digital ser um tema pouco conhecido até por aqueles

que lidam constantemente com diversas tecnologias presentes na

contemporaneidade, a certificação digital tem trazido melhorias de processos e

possibilidade de novas formas de interação entre governo-governo, cidadão-governo

e governo-negócio, sendo assim, é uma tecnologia recente que vem aos poucos

permeando várias práticas sociais e políticas.

53

REFERÊNCIAS

ABNT NBR ISO/IEC 17799:2005 – Tecnologia da informação – Técnicas de

segurança – Código de prática para a gestão da segurança da informação.

ALBUQUERQUE, Ricardo; RIBEIRO, Bruno. Segurança no Desenvolvimento de

Software: Como garantir a segurança do sistema para seu cliente usando

ISO/IEC 15.408. Rio de Janeiro, Campus, 2002.

BRASIL. Medida Provisória 2200-2, de 24 de Agosto de 2001.

BRASIL. Resolução nº 41, de 18 de Abril de 2006.

BROCARDO, Marcelo Luiz et al. Introdução à Certificação Digital: Da Criptografia ao

Carimbo de Tempo. Florianópolis, BRy Tecnologia, 2006.

DIAS, Claúdia. Segurança e Auditoria da Tecnologia da Informação. Rio de Janeiro,

Editora Axcel Books do Brasil, 2000.

GOMES, Kleiton da Silva; SANTOS, Newton. Segurança no Desenvolvimento de

Aplicações Web. 2006. 83f. Trabalho de Conclusão de Curso (Bacharelado

em Ciência da Computação) – Universidade da Amazônia – UNAMA, Belém,

2006.

ICP-Brasil – Infra-Estrutura de Chaves Públicas Brasileira. Disponível em:

<http://www.icpbrasil.gov.br>. Acessado em 20 de out. 2009.

ISO/IEC 15408 – Common Criteria. Disponível em:

<http://www.commoncriteriaportal.org/>. Acessado em 18 de out. 2009.

ITI – Instituto Nacional de Tecnologia da Informação. Disponível em:

<http://www.iti.gov.br>. Acessado em: 20 de out. 2009.

KRONBAUER, Julio Cezar. Um Modelo Centralizado de Autenticação de Usuários

usando Certificação Digital. 2007. 64f. Trabalho de Conclusão de Curso

(Bacharelado em Ciência da Computação) – Universidade de Santa Cruz do

Sul – UNISC, Santa Cruz do Sul, 2007.

KUROSE, James F.; ROSS, Keith W. Segurança em Redes de Computadores.

In:_____. Redes de Computadores e Internet: uma abordagem top-down.

São Paulo, Pearson Addison Wesley, 2006. Cap. 8, p. 512-568.

OPENSSL – The Open Source toolkit for SSL/TLS. Disponível em:

http://www.openssl.org/. Acessado em: 20 de out. 2009.

54

REZENDE, Pedro Antônio Dourado de. Infraestrutura de Chaves Públicas.

Disponível em: <http://www.cic.unb.br/~pedro/c003/C2.htm>. Acessado em

22 de dez. 2009.

SILVA, Luiz Gustavo Cordeiro da et al. Certificação Digital – Conceitos e Aplicações.

Rio de Janeiro, Ciência Moderna Ltda., 2008..

SUTIL, Jeandré Monteiro. Implementando uma Nova Abordagem para a Troca do

Par de Chaves de uma AC-Raiz. 2006. 54f. Trabalho de Conclusão de Curso

(Bacharelado em Ciência da Computação) – Universidade Federal de Santa

Catarina – UFSC, Florianópolis, 2006.

TERADA, Routo. Segurança de Dados: Criptografia em Redes de Computador. São

Paulo, Editora Edgard Blücher Ltda., 2000.

VERONESE, Alexandre; DE FREITAS, Christiana Soares. Segredo e Democracia:

certificação digital e software livre. Informática Pública, Belo Horizonte, v.8,

n. 2, p. 09-26, 2007

XAVIER, Fabricio da Silva Valadares. Desenvolvimento de um Laboratório Virtual

baseado em PHP para estudo de criptografia RSA em Ambiente de Internet.

2005. 100f. Projeto de Conclusão de Curso (Bacharelado em Ciência da

Computação) – Universidade Vale do Rio Verde – UninCor, Três Corações,

2005.

55

APÊNDICE A – CÓDIGO FONTE DO SISTEMA DE AUTENTICAÇÃO

index.jsp

<html>

<head>

<title>::. Certificação Digital .::</title>

<link rel="stylesheet" href="styles/padrao.css"/>

<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-

1”>

<script type="text/javascript">

function setAction(action, form) {

if(action == 'mostraDados') {

form.action = 'https://localhost:8443/digitalCertification/

DetalhesDoCertificado’;

} else if (action == 'loga') {

form.action = 'https://localhost:8443/digitalCertification/

Entrada’;

}

return true;

}

</script>

</head>

<body>

<%@ include file="/banner.jsp"%>

<form id="formulario" name="formulario" method="POST" action="">

<table>

<tr>

<td>Para se autenticar com seu certificado digital, clique no

botão abaixo.</td>

</tr>

<tr>

<td></td>

</tr>

<tr>

<td><input type="submit" value="Acessar"onclick =

"setAction('loga', document.formulario)"/></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td>Para mostrar os dados do certificado, clique no botão

abaixo.</td>

</tr>

<tr>

<td></td>

</tr>

<tr>

<td><input type="submit" value="Mostrar Certificado" onclick =

"setAction('mostraDados', document.formulario)" /><br>

</tr>

</table>

</form>

</body>

</html>

56

banner.jsp

<table cellspacing="10" cellpadding="10">

<tr>

<td align="center">

<img src="images/ifpa.jpg" alt="IFPA">

</td>

<td align="center">

<table cellspacing="2" cellpadding="2">

<tr>

<td align="center"><h1>Sistema de Autenticação usando</h1></td>

</tr>

<tr>

<td align="center"><h1>Certificado Digital</h1></td>

</tr>

</table>

</td>

</tr>

</table>

entradaForca.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<link rel="stylesheet" href="styles/padrao.css"/>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-

1">

<title>::. Certificação Digital .::</title>

</head>

<body>

<%@ include file="/banner.jsp"%>

<br>

<br>

<h3>Seja bem-vindo, ${nome}</h3>

<br>

Você foi identificado(a) como um(a) ${papel}.

<br>

<br>

<h3>Ações</h3>

<ul>

<c:forEach items="${acoes}" var="acao">

<li>${acao}</li>

</c:forEach>

</ul>

</body>

</html>

57

dadosCertificado.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<link rel="stylesheet" href="styles/padrao.css"/>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-

1">

<title>::. Certificação Digital - Dados do Certificado .::</title>

</head>

<body>

<%@ include file="/banner.jsp"%>

<br>

<br>

<h3>Dados do Certificado</h3>

<br>

<table>

<tr class="cor1">

<td>Assunto: </td>

<td>${assunto}</td>

</tr>

<tr class="cor2">

<td>Numero de Serie: </td>

<td>${numeroDeSerie}</td>

</tr>

<tr class="cor1">

<td>Data de Início de Validade:</td>

<td>${inicioValidade}</td>

</tr>

<tr class="cor2">

<td>Data de Término de Validade:</td>

<td>${fimValidade}</td>

</tr>

<tr class="cor1">

<td>Emissor:</td>

<td>${emissor}</td>

</tr>

</table>

</body>

</html>

acessoNegado.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<link rel="stylesheet" href="styles/padrao.css"/>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-

1">

<title>::. Certificação Digital .::</title>

</head>

58

<body>

<%@ include file="/banner.jsp"%>

<br>

<br>

<h3>Erro ao Liberar o Acesso</h3>

<br>

Você não pode entrar no sistema.

</body>

</html>

erro.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<link rel="stylesheet" href="styles/padrao.css"/>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-

1">

<title>::. Certificação Digital .::</title>

</head>

<body>

<%@ include file="/banner.jsp"%>

<br>

<br>

<h3>Erro ao obter o certificado</h3>

<br>

Verifique se você escolheu um certificado válido.

</body>

</html>

AutorizacaoException.java

package br.edu.ifpa.tac.cert;

public class AutorizacaoException extends Exception{

private static final long serialVersionUID = 1L;

public AutorizacaoException(){

super();

}

public AutorizacaoException(String message, Throwable cause){

super(message, cause);

}

public AutorizacaoException(String message){

super(message);

}

public AutorizacaoException(Throwable cause){

super(cause);

}

}

59

Autorizador.java package br.edu.ifpa.tac.cert;

import java.io.IOException;

import java.math.BigInteger;

import java.security.cert.X509Certificate;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class Autorizador {

public static final String PAPEL_ADMIN = "ADMINISTRADOR";

public static final String PAPEL_USU = "USUARIO";

private static Log logger = LogFactory.getLog(Autorizador.class);

private static Map<BigInteger, String> numSerieUsuarios;

static {

numSerieUsuarios = new HashMap<BigInteger, String>();

//Luciana

numSerieUsuarios.put(new BigInteger("f789f3ddb61fe00d", 16),

PAPEL_ADMIN);

//Isabella

numSerieUsuarios.put(new BigInteger("f789f3ddb61fe00f", 16),

PAPEL_USU);

//Jasper

numSerieUsuarios.put(new BigInteger("f789f3ddb61fe010", 16),

PAPEL_USU);

}

public static String autoriza(X509Certificate eeCert, String recurso)

throws AutorizacaoException, IOException {

// Verificar se o certificado enviado não é nulo

if(eeCert == null) {

logger.warn( "Certificado não encontrado na conexão." );

throw new AutorizacaoException("Não foi possível autenticar o

usuário.");

}

// Obter papel do usuário

String papel=getPapelUsandoNumeroDeSerie(eeCert.getSerialNumber());

// Validar se o papel foi encontrado

if( papel == null ) {

// Loga erro de autenticação

logger.info("\nAcesso negado para o certificado apresentado.

\nEmissor: '" + eeCert.getIssuerX500Principal().

toString() + "' \nNúmero de série: '" +

eeCert.getSerialNumber().toString(16) + "'" );

// Lança exceção

throw new AutorizacaoException("Acesso negado para o certificado

apresentado. Recurso: '" + recurso

+ "' Emissor: '" +

60

eeCert.getIssuerX500Principal().

toString() + "' Número de série:

'" + eeCert.getSerialNumber().

toString(16) + "'");

}

logger.info("\nAcesso liberado para o certificado apresentado.

\nRecurso: '" + recurso + "' \nEmissor: '" +

eeCert.getIssuerX500Principal().toString() + "'

\nNúmero de série: '" +

eeCert.getSerialNumber().toString(16) + "'

\nPapel: '" + papel + "'" );

// Retorna papel

return papel;

}

@SuppressWarnings("unused")

private static final String getPapelUsandoNumeroDeSerie(BigInteger

numeroDeSerie) {

return numSerieUsuarios.get(numeroDeSerie);

}

}

Constantes.java

package br.edu.ifpa.tac.cert;

public class Constantes {

public static final String PAPEL_USUARIO = "papel";

public static final String INICIO_VALIDADE = "inicioValidade";

public static final String FIM_VALIDADE = "fimValidade";

public static final String NUMERO_DE_SERIE = "numeroDeSerie";

public static final String ASSUNTO = "assunto";

public static final String EMISSOR = "emissor";

protected static final String accessDeniedPage = "/acessoNegado.jsp";

protected static final String noClientCertPage =

"/certificadoNaoEncontrado.jsp";

private Constantes(){

}

}

ControleDeAcesso.java

package br.edu.ifpa.tac.cert;

import java.io.IOException;

import java.security.cert.X509Certificate;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.RequestDispatcher;

61

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class ControleDeAcesso implements Filter{

private Log logger = LogFactory.getLog(this.getClass().getName());

private static final String CLIENT_CERT =

"javax.servlet.request.X509Certificate";

private static final String NO_CLIENT_CERT_PAGE =

"/certificadoNaoEncontrado.jsp";

private static final String ACCESS_DENIED_PAGE = "/acessoNegado.jsp";

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest req, ServletResponse resp,

FilterChain chain) throws IOException, ServletException {

logger.trace(">doFilter");

X509Certificate[] certs = (X509Certificate[])

req.getAttribute(CLIENT_CERT);

if (certs == null){

logger.warn("Certificado não encontrado na conexão");

dispatchErrorPage(NO_CLIENT_CERT_PAGE, req, resp);

return;

}

X509Certificate eeCert = certs[0];

try{

String papel = Autorizador.autoriza(eeCert,"Certificado Digital");

req.setAttribute(Constantes.PAPEL_USUARIO, papel);

chain.doFilter(req, resp);

}catch(AutorizacaoException e){

dispatchErrorPage(ACCESS_DENIED_PAGE, req, resp);

}

}

private void dispatchErrorPage(String errorPage, ServletRequest req,

ServletResponse resp)throws ServletException, IOException {

62

logger.trace(">dispatchErrorPage: " + errorPage);

RequestDispatcher dispatcher = req.getRequestDispatcher(errorPage);

dispatcher.forward(req, resp);

}

@Override

public void init(FilterConfig arg0) throws ServletException {

}

}

EntradaServlet.java

package br.edu.ifpa.tac.cert;

import java.io.IOException;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class EntradaServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

private static final String CLIENT_CERT =

"javax.servlet.request.X509Certificate";

private Log logger = LogFactory.getLog(this.getClass().getName());

protected void doGet(HttpServletRequest req, HttpServletResponse

resp)throws ServletException, IOException{

this.doPost(req, resp);

}

protected void doPost(HttpServletRequest req, HttpServletResponse

resp)throws ServletException, IOException{

X509Certificate[] certs = (X509Certificate[])

req.getAttribute(CLIENT_CERT);

63

String page = "/erro.jsp";

if (certs != null){

X509Certificate eeCert = certs[0];

req.setAttribute("nome",

IcpBrasilUtil.getNome(eeCert.getSubjectX500Principal()));

List<String> acoesPapel = getAcoes((String)

req.getAttribute(Constantes.PAPEL_USUARIO));

req.setAttribute("acoes", acoesPapel);

page = "/entradaForca.jsp";

}else{

logger.fatal("Erro inesperado. Certificado não foi encontrado");

}

RequestDispatcher dispatcher =

getServletContext().getRequestDispatcher(page);

dispatcher.forward(req, resp);

}

private List<String> getAcoes(String papel) {

List<String> acoes = new ArrayList<String>();

if(papel == Autorizador.PAPEL_ADMIN){

acoes.add("Administrar a rede");

acoes.add("Gerenciar contas de usuário");

}else if(papel == Autorizador.PAPEL_USU){

acoes.add("Acessar sua conta");

}

return acoes;

}

}

IcpBrasilUtils.java

package br.edu.ifpa.tac.cert;

import javax.security.auth.x500.X500Principal;

import org.bouncycastle.asn1.x509.X509NameTokenizer;

public class IcpBrasilUtil {

private IcpBrasilUtil(){

}

static String getNome(X500Principal assunto){

64

if(assunto != null){

X509NameTokenizer NameTokenizer = new

X509NameTokenizer(assunto.toString());

while (NameTokenizer.hasMoreTokens()){

String token = NameTokenizer.nextToken();

if (token.startsWith("CN=")){

return token.substring(3, token.length());

}

}

}

return "";

}

}

MostraCertificado.java

package br.edu.ifpa.tac.cert;

import java.io.IOException;

import java.security.cert.X509Certificate;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

public class MostraCertificado extends HttpServlet {

private static final long serialVersionUID = 1L;

@SuppressWarnings("unused")

private Log logger = LogFactory.getLog(this.getClass().getName());

@SuppressWarnings("unused")

private static final String SSL_SESSION =

"javax.servlet.request.ssl_session";

private static final String CLIENT_CERT =

"javax.servlet.request.X509Certificate";

protected void doGet(HttpServletRequest req, HttpServletResponse

65

resp)throws ServletException, IOException{

this.doPost(req, resp);

}

protected void doPost(HttpServletRequest req, HttpServletResponse

resp)throws ServletException, IOException{

X509Certificate[] certs = (X509Certificate[])

req.getAttribute(CLIENT_CERT);

String page = "/erro.jsp";

if(certs != null){

X509Certificate eeCert = (X509Certificate) certs[0];

String assunto = eeCert.getSubjectX500Principal().toString();

String numeroDeSerie = eeCert.getSerialNumber().toString(16);

String inicioValidade = eeCert.getNotAfter().toString();

String fimValidade = eeCert.getNotBefore().toString();

String emissor = eeCert.getIssuerX500Principal().toString();

req.setAttribute(Constantes.ASSUNTO, assunto);

req.setAttribute(Constantes.NUMERO_DE_SERIE, numeroDeSerie);

req.setAttribute(Constantes.INICIO_VALIDADE, inicioValidade);

req.setAttribute(Constantes.FIM_VALIDADE, fimValidade);

req.setAttribute(Constantes.EMISSOR, emissor);

page = "/dadosCertificado.jsp";

}

RequestDispatcher dispatcher =

getServletContext().getRequestDispatcher(page);

dispatcher.forward(req, resp);

}

}