17.04.2013 Views

Departamento de Informática - Arquitectura de Sistemas ...

Departamento de Informática - Arquitectura de Sistemas ...

Departamento de Informática - Arquitectura de Sistemas ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Departamento</strong> <strong>de</strong> <strong>Informática</strong><br />

Faculda<strong>de</strong> <strong>de</strong> Ciências e Tecnologia<br />

UNIVERSIDADE NOVA DE LISBOA<br />

Licenciatura em Engenharia <strong>Informática</strong><br />

PROVA DE TESTE PRÁTICO – <strong>Sistemas</strong> Distribuídos I<br />

2º Semestre, 2002/2003<br />

_____________________________________________________________________________<br />

NOTAS:<br />

Leia com atenção cada questão antes <strong>de</strong> respon<strong>de</strong>r. A interpretação do enunciado <strong>de</strong> cada pergunta é um factor<br />

<strong>de</strong> avaliação do teste.<br />

Po<strong>de</strong> utilizar elementos pessoais <strong>de</strong> consulta. A duração do teste é 2h00.<br />

O enunciado contém 6 páginas que <strong>de</strong>vem ser entregues com a resposta ao teste.<br />

__________________________________________________________________________________________<br />

1) Suponha que preten<strong>de</strong> implementar, usando a linguagem Java, um servidor iterativo <strong>de</strong> HTTP seguro para<br />

ser usado na Internet.<br />

a) Indique as chaves e certificados que o seu servidor <strong>de</strong>ve possuir para que um cliente da Internet<br />

(usando um browser normal) o possa autenticar. Indique quem cria essas chaves e certificados.<br />

b) No ANEXO A, apresenta-se um excerto do código do servidor. Complete este código, usando o<br />

pacote javax.net.ssl, preenchendo a caixa da figura com o código apropriado (leia atentamente os<br />

comentários das funções <strong>de</strong>finidas).<br />

c) Indique a linha <strong>de</strong> comando que permite iniciar o servidor na porta 8080 (assumindo que o código<br />

está na CLASSPATH). Explique sucintamente os parâmetros usados.<br />

1


2) No âmbito do trabalho prático referente ao <strong>de</strong>senvolvimento <strong>de</strong> um sistema <strong>de</strong> partilha <strong>de</strong> ficheiros<br />

imutáveis, indique se as afirmações seguintes são verda<strong>de</strong>iras ou falsas, justifique as afirmações falsas:<br />

a) Consi<strong>de</strong>re uma arquitectura peer-to-peer pura, em que todos os elementos do sistema partilham<br />

uma chave privada assimétrica. Neste caso, também é necessário criar uma chave privada própria<br />

para cada elemento do sistema mesmo que apenas se queira garantir que é possível <strong>de</strong>tectar a<br />

tentativa <strong>de</strong> acesso ao sistema por elementos exteriores ao mesmo.<br />

Verda<strong>de</strong>iro Falso porque...<br />

b) Consi<strong>de</strong>re uma arquitectura com um único servidor central. Neste caso, mesmo que fosse atribuída<br />

uma chave secreta a cada elemento do sistema aquando da sua entrada, era impossível ao servidor<br />

autenticar os clientes que pertencem ao sistema sem recurso a chaves assimétricas.<br />

Verda<strong>de</strong>iro Falso porque...<br />

c) Consi<strong>de</strong>re uma arquitectura que inclui um conjunto <strong>de</strong> servidores, cada um mantendo informação<br />

sobre um subconjunto <strong>de</strong> elementos do sistema. Neste caso, é possível a cada servidor funcionar<br />

como entida<strong>de</strong> <strong>de</strong> certificação e entrada no sistema se todos os elementos do sistema conhecerem<br />

os certificados <strong>de</strong> todos os servidores.<br />

Verda<strong>de</strong>iro Falso porque...<br />

3) Indique se as afirmações seguintes são verda<strong>de</strong>iras ou falsas. Justifique as afirmações falsas:<br />

a) Assuma que cria um proxy <strong>de</strong> conexões HTTPS usando o pacote javax.net.ssl. Este proxy é<br />

implementado <strong>de</strong> forma simples usando apenas um SSLServerSocket para receber as conexões dos<br />

clientes e criando uma conexão para o servidor <strong>de</strong>sejado usando um socket SSLSocket. Estes<br />

sockets são criados usando as fábricas <strong>de</strong> sockets SSL disponíveis sem nenhuma modificação. Com<br />

esta aproximação, o cliente po<strong>de</strong> ter a certeza que está a falar com o servidor <strong>de</strong>s<strong>de</strong> que confie no<br />

proxy e o proxy conheça os mesmos certificados que o cliente.<br />

Verda<strong>de</strong>iro Falso porque...<br />

2


) Usando a aproximação simples anterior, é possível ao servidor autenticar o cliente.<br />

Verda<strong>de</strong>iro Falso porque...<br />

c) Numa conexão TCP segura em que se troquem vários milhões <strong>de</strong> bytes <strong>de</strong> informação, a utilização<br />

do protocolo SSL sem compressão <strong>de</strong> dados é muito mais pesada que a utilização <strong>de</strong> um protocolo<br />

mais simples baseado na utilização <strong>de</strong> chaves simétricas.<br />

Verda<strong>de</strong>iro Falso porque...<br />

4) No âmbito do trabalho prático referente ao <strong>de</strong>senvolvimento <strong>de</strong> um sistema <strong>de</strong> partilha <strong>de</strong> ficheiros<br />

imutáveis, suponha que:<br />

• Existe uma entida<strong>de</strong> <strong>de</strong> certificação baseada na utilização <strong>de</strong> criptografia assimétrica;<br />

• Cada elemento do sistema conhece o certificado (assinado pela própria) da entida<strong>de</strong> <strong>de</strong> certificação;<br />

• Cada elemento do sistema tem um par “chave privada/chave pública” e a chave pública está<br />

certificada pela entida<strong>de</strong> <strong>de</strong> certificação;<br />

• A entida<strong>de</strong> <strong>de</strong> certificação guarda todos os certificados criados no sistema.<br />

Complete o anexo B <strong>de</strong> modo a que seja possível verificar o elemento que introduziu o ficheiro no<br />

sistema. A sua solução <strong>de</strong>ve permitir que a verificação seja efectuada, por or<strong>de</strong>m <strong>de</strong> preferência:<br />

• Por qualquer elemento do sistema <strong>de</strong> forma in<strong>de</strong>pen<strong>de</strong>nte (i.e. sem comunicar com nenhum<br />

outro processo do sistema);<br />

• No caso <strong>de</strong> não ser possível fazer esta verificação <strong>de</strong> forma in<strong>de</strong>pen<strong>de</strong>nte, explique<br />

sucintamente como é possível efectuar esta verificação e em que elemento do sistema <strong>de</strong>ve ser<br />

feita (não se esqueça <strong>de</strong> completar o código do anexo B).<br />

3


ANEXO A<br />

/** Servidor HTTP seguro.<br />

*/<br />

public class HttpsServer<br />

{<br />

private int port;<br />

HttpsServer( int port) {<br />

this.port = port;<br />

}<br />

/**<br />

* Devolve um stream para o recurso referido num dado pedido http<br />

* (in<strong>de</strong>pen<strong>de</strong>ntemente <strong>de</strong> se tratar <strong>de</strong> uma página estática ou dinâmica).<br />

* Caso o recurso não exista, o stream contém o conteúdo da mensagem<br />

* <strong>de</strong> erro apropriada.<br />

*<br />

* @param pedidoHTTP Linha completa <strong>de</strong> um pedido HTTP (ex. GET /in<strong>de</strong>x.html)<br />

*/<br />

public static InputStream obtemRecurso( String pedidoHTTP) {...}<br />

/**<br />

* Inicia o servidor <strong>de</strong> https (ex. HttpsServer port_num).<br />

*/<br />

public static void main( String[] args) {<br />

if( args.length == 1) {<br />

HttpsServer server = new HttpsServer(Integer.parseInt( args[0]));<br />

server.run();<br />

}<br />

}<br />

/**<br />

* Função principal do servidor. As excepções ocorridas numa conexão não<br />

* <strong>de</strong>vem fazer com que o servidor conclua a sua execução.<br />

*/<br />

private void run() throws Exception {<br />

}<br />

}<br />

4


ANEXO B<br />

/**<br />

* Classe que representa um ficheiro no sistema peer-to-peer.<br />

* Assuma que a dimensão dos ficheiros não causa problemas na serialização<br />

* dos objectos <strong>de</strong>ste tipo.<br />

*/<br />

class P2PFile implements java.io.Serialziable<br />

{ // <strong>de</strong>fina as variáveis internas do ficheiro<br />

/**<br />

* Método usado para criar um novo ficheiro. Este ficheiro será<br />

* posteriormente propagado entre os elementos do sistema peer-to-peer.<br />

* Descreva cada parâmetro adicional <strong>de</strong> forma semelhante ao parâmetro file<br />

*/<br />

public P2PFile( // <strong>de</strong>fina as parâmetros do construtor<br />

byte[] file // conteúdo do ficheiro<br />

}<br />

) throws Exception { // <strong>de</strong>fina o código do construtor<br />

5


}<br />

/**<br />

* Devolve “true” caso seja possível verificar a origem do ficheiro.<br />

* Caso contrário, o resultado da função <strong>de</strong>ve ser “false”.<br />

* NOTA: Esta função não <strong>de</strong>ve lançar excepções.<br />

* Caso necessite <strong>de</strong> parâmetros, <strong>de</strong>screva-os como fez anteriormente.<br />

*/<br />

public boolean knownSource( //<strong>de</strong>fina os parâmetros da função knowSource<br />

) { // Defina o método knownSource<br />

}<br />

6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!