quinta-feira, 5 de abril de 2012

Aprenda a configurar o Apache com SSL

Hoje em dia, é importante que todos os dados sensíveis que são trasmitidos entre um cliente e um servidor sejam cifrados de modo a que estes não possam ser entendidos por terceiros. Na prática, quando aderimos a um serviço online que nos solicita dados pessoais ou credenciais de acesso (ex. sites de bancos) é importante que a toda a informação passada seja cifrada de modo a tornar-se ilegível. No caso dos servidor Web (entre outros serviços de uma rede), uma das formas de proceder  paraa cifrar dos dados é recorrendo ao protocolo SSL.
ssl_00

Sendo este o primeiro artigo relacionado com a certificação digital, hoje vamos apresentar alguns conceitos teóricos associados a este tema.
O SSL é um protocolo criptográfico baseado em cifras assimétricas (chave privada + chave publica) que tem como principal objectivo providenciar segurança e integridade dos dados transmitidos em redes inseguras como é o caso da Internet. Quando um utilizador entra ema um site que recorre ao SSL, o servidor envia ao cliente a chave publica para que esta possa cifrar a informação que vai ser passada ao servidor. Quando o servidor recebe essa informação, usa a sua chave privada para decifrar a informação transmitida pelo cliente.
Existem várias aplicações para este protocolo, como por exemplo o comércio eletrónico, servidores Web, servidores FTP, etc. Para identificar facilmente se estão visualizando um site seguro basta verificar no URL que em vez de estar o normal http:// se encontra https://. Saber mais aqui.
Chave pública vs Chave privada
A chave pública, que está presente no certificado digital, é usada para cifrar os dados a serem enviados ao para o servidor. Já a chave privada, que só o dono do certificado conhece, serve para decifrar a informação que foi cifrada com a sua chave pública.
chave_publica_chave_privada
Certificado Digital
Um certificado é um documento digital que contém informação acerca de quem o possui, nome, morada, localidade, e-mail, duração do certificado, domínio (Common Name) e nome da entidade que assina o certificado. Contém ainda uma chave pública e um hash que permite verificar a integridade do próprio certificado (i.e se um certificado foi alterado).
Um certificado assenta numa estrutura hierárquica de confiança, cujo topo é pertença de uma Entidade Certificadora (CA Root Certificate).
Esta entidade certificadora confirma que o possuidor do certificado é quem afirma ser, e assina o certificado, impossibilitando desta forma a sua modificação. Em Portugal, como entidade certificadora temos como exemplo a multicert.
SSL
O protocolo SSL – Secure Socket Layer é um protocolo que foi desenvolvido pela Netscape com o objectivo de garantir transações seguras entre um servidor web e um browser. O protocolo utiliza uma entidade certificadora para identificar o servidor ou o servidor e o cliente.
Openssl
O OpenSSL é uma implementação em código aberto dos protocolos SSL e TLS. Uma das funcionalidades consiste na criação de certificados X.509 que permitem confidencialidade em ligações com SSL (HTTPS) entre outros serviços. Os certificados digitais X.509 representam para o utilizador, o mecanismo de segurança mais visível no âmbito da certificação digital.
Depois de termos uma breve descrição sobre o que são chaves privadas e chaves publicas, um certificado digital, o protocolo SSL e o OpenSSL, hoje vamos aprender a produzir certificados digitais.
Para a criação do presente tutorial, recorri a uma máquina com o CentOS 6. Como referido no tutorial anterior, o OpenSSL permite criar e entidade de certificação privada e disponibiliza ferramentas para criação e gestão de chaves privadas e publicas e certificados digitais.
Caso não tenham o OpenSSL instalado, podem fazê-lo executando o comando
yum install openssl
Para podermos emitir um certificado X.509 é importante (apesar de opcional) rever alguns parâmetros no arquivo de configuração do openSSL. No CentOS o arquivo de configuração (openssl.cnf) encontra-se em/etc/pki/tls/openssl.cnf e nele podemos definir algumas informações relativamente à entidade certificadora e também indicar o directório onde os certificados vão ser guardados por omissão.  De referir que este processo só é necessário efetuar a primeira vez.
###################################################################
[ ca ]
default_ca      = CA_Pplware           # The default ca section
 
####################################################################
[ CA_Pplware ]
 
dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.
 
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
# must be commented out to leave a V1 CR
L
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
 
RANDFILE        = $dir/private/.rand    # private random number file
 
x509_extensions = usr_cert              # The extentions to add to the cert
 
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options
 
# Extension copying option: use with caution.
# copy_extensions = copy
 
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions        = crl_ext
 
default_days          = 365                    # how long to certify for
default_crl_days      = 30                     # how long before next CRL
default_md            = default               # use public key default MD
preserve              = no                         # keep passed DN ordering
 
……
 
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = PT
countryName_min                 = 2
countryName_max                 = 2
 
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Guarda
 
localityName                    = Locality Name (eg, city)
localityName_default            = Guarda 
 
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Pplware
 
…
Feitas as alterações, podemos passar de imediato à criação de certificados X.509.
Nota importante: Para que tudo funcione correctamente, é importante que a máquina onde temos o apache a correr tenha um nome. Esse informação pode ser definida em /etc/sysconfig/network no parâmetro HOSTNAME.
Criação de certificados para servidores
Para a criação dos certificados X.509  para o servidor apache devem executar os seguintes 3 passos:
Criação da chave privada RSA para o certificado do servidor
Esta chave RSA ira ser posteriormente utilizada para assinar o CSR (Certificate Signing Request – contem várias informações sobre a entidade a certificar, incluindo a chave publica).
openssl genrsa -des3 -out chaveprivada.key 2048
Nota1: Na parte final do processo de criação da chave privada é necessário indicar uma senha.
Criação do CSR para o certificado do servidor
openssl req -new -key chaveprivada.key -out certificado.csr
Nota2: No campo Common Name (CN) devem colocar o nome do servidor (ex. www.pplware.com)
Emitir certificado X.509 para o servidor indicado
openssl x509 -req -days 365 -in certificado.csr -signkey chaveprivada.key -out www.crt

Depois de termos deixado uma breve descrição sobre o que são chaves privadas e chaves publicas, um certificado digital, o protocolo SSL e o OpenSSL, e de termos aprendido a produzir certificados digitais, hoje vamos finalizar esta sessão de tutoriais, explicando como se configura o Apache com o protocolo SSL (recorrendo aos certificados já criados).
Para quem não conhece, o Apache foi desenvolvido pela Apache Software Foundation e é o servidor WWW mais popular, tendo suporte para a maioria dos sistemas operacionais.
No CentOS o principal arquivo de configuração do Apache encontra-se em /etc/httpd/conf/httpd.conf. Dentro do directório /etc/httpd/conf.d/ podemos proceder à configuração dos módulos.
Como instalar o mod_ssl?
Como referido, o Apache tem suporte para SSL através do modulo mod_ssl. Para instalar o modulo mod_ssl basta executar o comando:
yum install mod_ssl
Após a instalação é criado automaticamente o ficheiro /etc/httpd/conf.d/ssl.conf, onde podemos realizar as configuração associadas ao SSL. Usando o ficheiro já criado, apenas necessitamos de indicar os seguintes paramentos:
  • SSLCertificateFile /etc/pki/tls/pplware/www.crt
  • SSLCertificateKeyFile /etc/pki/tls/pplware/chaveprivada.key
Nota: De referir, que osarquivos foram produzidos com base no processo descrito neste artigo
##
## SSL Virtual Host Context
##
 
<VirtualHost _default_:443>
 
# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443
 
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
 
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
 
#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol all -SSLv2
#   SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
 
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
 
SSLCertificateFile /etc/pki/tls/pplware/www.crt
SSLCertificateKeyFile /etc/pki/tls/pplware/chaveprivada.key
SSLVerifyClient require 
SSLVerifyDepth  10 …. 
</virtualhost>
Após a configuração, apenas temos de reiniciar o Apache (service httpd restart) e verificar se tudo está a funcionar correctamente. Para isso, basta que abram um browser e estabelecem ligação ao servidor.
ssl_01Como podemos ver pela imagem anterior, a ligação estabelecida ao servidor é segura, sendo usado o protocolo TLS. Relativamente ao aviso “O certificado do servidor não é fidedigno” tal acontece porque o  browser não conhece a nossa autoridade de certificação. Para tal, no primeiro aviso basta que indiquem que confiam na  autoridade de certificação e que pretendem prosseguir.
Esperamos que este  tutorial seja útel e que a partir de agora possam implementar servidores Apache seguros. O processo de criação de certificados é idêntico para outros serviços da rede como por exemplo e-Mail, FTP, etc. Alguma duvida ou questão, basta deixar comentários .



Nenhum comentário:

Postar um comentário