Departamento de Informática - Arquitectura de Sistemas ...
Departamento de Informática - Arquitectura de Sistemas ...
Departamento de Informática - Arquitectura de Sistemas ...
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