Você está na página 1de 8

Procedimento para criao de um web-service HTTPS usando Apache2 como servidor e Android como cliente

OBS: Todos os comandos citados neste tutorial devem ser executados utilizando o sistema operacional linux (Ubuntu foi usado nos testes). CRIANDO O CERTIFICADO DIGITAL 1 Primeiro deve-se criar um certificado digital customizado. Para isso execute o seguinte comando:
openssl genrsa -out chave.pem 1024

O comando deve gerar como resposta a seguinte saida:


Generating RSA private key, 1024 bit long modulus ...........................................................++++++ ................++++++ e is 65537 (0x10001)

2 Com este comando ns criamos uma chave de 1024 bits customizada. A partir desta chave ns iremos criar a nossa chave de requisio. Caso nossa chave precise ser enviada a alguma entidade certificadora, ser necessrio inserir alguns dados que identifiquem o criador da chave e o responsvel por ela. Para isto execute o comando:
openssl req -new -key chave.pem -out requisicao.pem

Isto ir gerar algumas perguntas que devero ser respondidas corretamente:


You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:BR State or Province Name (full name) [Some-State]:RN Locality Name (eg, city) []:Natal Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sua Empresa Organizational Unit Name (eg, section) []:Sede Common Name (eg, YOUR name) []:zeka Email Address []:fulano@suaempresa.com.br Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:suasenha An optional company name []:Sua Empresa

DN.

As perguntas devem ser respondidas da seguinte maneira: Country Name: Cdigo do pas com duas letras (BR)

State or province name: Nome do estado (RN) Locality name: Nome da cidade (Natal) Organization name: Nome da sua empresa que usar o certificado (Sua Empresa) Common Name: Nome do domnio ou nome da mquina do servidor que hospedar o site que usar o certificado. Email Address: Seu endereo de e-mail Challenge password: Senha que ser usada para validar o certificado (GUARDE ESSA SENHA) An optional company name: Repita o nome da sua empresa. 3 Como neste tutorial ns criaremos um certificado customizado (que no passar por uma entidade certificadora), ns validaremos localmente o certificado que acabamos de criar. Lembrando que como o certificado que criamos no foi assinado por nenhuma entidade certificadora, quando o site que contiver o certificado por acessado, aparecer uma mensagem informando que o Site no confivel. Isto s vai deixar de aparecer quando o certificado for validado por uma entidade como CertiSign ou Verisign ou similares. 4 Agora ns assinaremos nosso certificado para que ele funcione para nosso propsito. Para isto execute o seguinte comando:
openssl req -x509 -days 365 -key chave.pem -in requisicao.pem -out certificado.pem

O comando acima cria um certificado no formato X509 com durao de 365 dias a partir da chave chave.pem no arquivo de requisio requisicao.pem e gera como sada o arquivo
certificado.pem.

5 Com isso ns geramos nosso arquivo de certificado e o de requisio. Ambos sero usados no nosso servidor Apache para assinar nosso site. CONFIGURANDO O SERVIDOR APACHE COM O CERTIFICADO DIGITAL OBS: Todos os exemplos citados aqui utilizam o Apache2 rodando sobre uma plataforma Linux com Ubuntu 11.10 . Quaisquer outras situaes ou sistemas operacionais devem ser observadas suas equivalncias com relao aos arquivos de configurao e pastas destes arquivos. 1 necessrio instalar o apache na mquina que servir de servidor. Usaremos aqui como exemplo o Ubuntu 11.10. Para instalar o Apache execute o seguinte comando:
sudo apt-get install apache2

Aguarde a instalao. Aps instalado necessrio habilitar a opo de uso do SSL, necessrio para uso de pginas HTTPS. Para isto execute:
sudo a2enmod ssl

2 Para que os comandos de habilitao do SSL funcione necessrio reiniciar o Apache. Faa isso com o comando:
sudo /etc/init.d/apache2 restart

3 Agora ns iremos configurar nosso Apache para reconhecer nosso certificado que criamos anteriormente. A estrutura de funcionamento do Apache permite que se criem vrios domnios

virtuais e sites que atendam ao mesmo servidor. No entraremos em detalhes de como isto funciona. Para efeito didtico do nosso tutorial utilizaremos o site padro do Apache. Abra o arquivo default na seguinte localizao /etc/apache2/sites-available/default. 4 O arquivo original deve parecer com o exemplo abaixo
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>

5 Essa e a configurao padro do site inicial do Apache. ele que aparece quando voc digita no navegador a partir da popria mquina o endereo http://localhost. O que ns faremos agora habilitar o SSL para este site. Assim, ns poderemos acessar o endereo https://localhost:80 para obtermos uma conexo segura com nosso site. 6 Para isto, coloque o seguinte cdigo logo abaixo da linha que contm DocumentRoot, ficando assim:
#--------habilita https-------SSLEngine on

SSLOptions +StrictRequire SSLCertificateFile /etc/ssl/certs/certificado.pem SSLCertificateKeyFile /etc/ssl/private/chave.pem #------------------------------

Repare nas linhas que contm SSLCertificateFile e SSLCertificateKeyFile, elas mostram os diretrios onde devem ficar os arquivos de certificado digital que criamos anteriormente. Copie os arquivos em suas pastas correspondentes e novamente reinicie o Apache. 7 Pronto, agora ns temos nosso site com certificado digital onde possvel acessa-lo via HTTPS. Se tentarmos acessar nosso site atravs do endereo https://localhost:80 (isso se voc acessar diretamente do prprio servidor, se acessar e uma outra mquina substitua a palavra localhost pelo IP do servidor). Aparecer um aviso parecido com o seguinte: Sabendo que essa pgina foi gerada com nosso certificado customizado, aperte no boto Continuar mesmo assim para poder acessar o contedo da nossa pgina.

A pgina deve aparecer aproximadamente como a mostrada abaixo:

CRIANDO UMA PGINA SIMPLES COM PHP PARA TESTAR A INTERAO COM NOSSO SERVIDOR. 1 Para podermos fazer uma interao entre nossa aplicao Android que criaremos posteriormente

e nosso servidor usando o protocolo SSL ser necessrio criar uma pequena pgina que recebe um parmetro e devolve alguma resposta. Para isso crie um arquivo chamado server.php com o seguinte contedo:
<?php if (isset($_GET['texto'])){ if ($_GET['texto'] != ""){ echo "Voce escreveu ".$_GET['texto']; }else{ echo "Voce no escreveu nada"; } }else{ echo "Voce est mandando pro lugar errado"; }

?>

2 Este arquivo PHP bem simples. Ele apenas recebe um parmetro chamado texto e escreve uma frase com o texto enviado. Copie este arquivo para o diretrio /var/www. Para que este arquivo PHP funcione corretamente no servidor necessrio que o apache contenha as libs corretas para processar arquivos PHP. (vide Google). 3 Para testarmos se nosso servidor est funcionando corretamente acesse o seguinte endereo: https://localhost:80/server.php?texto=testaaaaaaaaaaando. Deve aparecer a pgina abaixo:

CRIANDO O ARQUIVO BASEADO NO CERTIFICADO QUE FICAR DENTRO DA APLICAO ANDROID (APENAS PARA O CASO DE EXISTIR UM CERTIFICADO VALIDADO POR UMA ENTIDADE CERTIFICADORA) 1 Para que nossa aplicao Android possa se comunicar corretamente com o nosso servidor usando https necessrio que seja criado um certificado que v incluso na aplicao. Para fazermos isto ser uma biblioteca de validao e converso de certificados digitais chamada BouncyCastle. 2 Procure-o na internet, baixe os arquivos e descompacte-os em uma pasta. Ao descompactar crie uma pasta chamada res e dentro dela crie outra pasta chamada raw. Isto necessrio para gerarmos os arquivos de sada que sero importados para nossa aplicao Android. 3 Copie os arquivos chave.pem, requisicao.pem e certificado.pem para dentro da pasta onde

voc descompactou o arquivo baixado ficando com a estrutura assim:

Com esta estrutura ns criaremos nosso certificado para ser inserido dentro de nossa aplicao Android. 4 Agora vamos executar o nosso script para criao do arquivo .BKS. Acesse esta pasta usando um terminal e execute o seguinte comando:
keytool -importcert -v -trustcacerts -file "certificado.pem" -alias IntermediateCA -keystore "res/raw/mytruststore .bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16145.jar" -storetype BKS -storepass senha

Preste ateno na ltima palavra do comando. Onde tem escrito senha, substitua pela senha usada na criao do arquivo de certificado. Se tudo correr bem ele exibir uma sada parecida com esta:
Adding certificate to res/raw/mytruststore.bks... Owner: EMAILADDRESS=kalil@focusautomacao.com.br, CN=192.168.0.206, OU=Sede, O=Focus Automacao, L=Natal, ST=RN, C=BR Issuer: EMAILADDRESS=kalil@focusautomacao.com.br, CN=192.168.0.206, OU=Sede, O=Focus Automacao, L=Natal, ST=RN, C=BR Serial number: ca19887c3e450386 Valid from: Mon Feb 13 11:15:35 BRT 2012 until: Tue Feb 12 11:15:35 BRT 2013 Certificate fingerprints: MD5: 78:7E:E2:6A:8A:8A:51:C2:72:F8:23:3C:D2:D2:23:DB SHA1: 2B:FD:AF:AB:C1:AC:CD:AE:74:AF:B8:4F:A2:15:B1:0D:D4:A4:4D:CB Signature algorithm name: SHA1withRSA Version: 1 Trust this certificate? [no]: yes Certificate was added to keystore [Storing res/raw/mytruststore.bks] Added 'certificado.pem' with alias 'eefe5b33' to res/raw/mytruststore.bks...

Quando ele perguntar Trust this certificate? responda com yes. 5 Agora ns criamos nosso arquivo de certificado chamado mytruststore.bks dentro da pasta res/raw.

CRIANDO A APLICAO ANDROID QUE SE COMUNICAR COM NOSSO SERVIDOR USANDO HTTPS 1 Baixe o arquivo contido no seguinte endereo:
http://www.tygerstar.net/arquivos/httpsBarCode.zip

2 Descompacte-o numa pasta e importe para o Eclipse. 3 Partindo do pre-suposto que o Eclipse j est configurado corretamente para trabalhar com o Android vamos abrir o projeto. Nosso projeto deve estar com a estrutura semelhante a esta. O pacote net.zeka.httpsbarcode.certificado contm a classe que ir tratar de conexes certificadas (usando um certificado digital validado) e o pacote net.zeka.httpsbarcode.easyssl ir tratar das conexes sem certificado (apenas usando o protocolo SSL mas sem validao de certificado).

4 O arquivo mytruststore.bks que foi gerado anteriormente dever ser copiado para a pasta raw dentro da pasta res (deve-se criar a pasta raw caso no exista). Ele ser usado para validar a conexo quando for utilizado um certificado assinado. 5 No caso deste tutorial, utilizaremos o pacote easyssl pois no temos um certificado validado. Vamos abrir a classe HttpsVarCodeActivity e estudar o nosso modelo de teste.

6 Basicamente vamos nos ater ao mtodo getTexto. Este mtodo o responsvel por receber uma string, enviar ela usando alguma forma de conexo e devolver a string que retornada do servidor. De acordo com a situao, usa-se o mtodo ClienteHttps() (caso queira usar uma conexo com certificado validado) ou o mtodo EasyDefaultHttpClient.getDefaultHttpClient(), caso queira usar uma conexo SSL mas sem validao do certificado (o nosso caso que estamos usando

aqui). 7 Em seguida, o mtodo getTexto ser chamado passando como parmetro a url do servidor e a instanciao do objeto DefaultHttpClient. Este mtodo retornar a string que foi processada pelo servidor e respondida atravs de um texto simples. 8 No exemplo que demonstramos aqui usamos um texto simples como resposta do servidor. Mas isso poderia ser facilmente substitudo por um mtodo de gerao de xml ou json conforme a convenincia.

Espero que tenham gostado deste tutorial e quaisquer dvidas podem me perguntar Cordialmente: Klil Maciel kalilmaciel@gmail.com Analista de Sistemas da Focus Automao Graduado em Tecnologia em Anlise e Desenvolvimento de Software pelo IFRN Ps-graduado em Sistemas Corporativos pela FARN (UNI-RN) Professor de Android