sexta-feira, 7 de janeiro de 2011

Configurando o Apache com SSL (Certificação Digital)

Este artigo é a continuação do artigo anterior: Criando Certificados SSL com OpenSSL. Aqui vamos aprender a usar o CA (certificate authority - autoridade certificadora) criado anteriormente para criar chaves assinadas digitalmente e implantá-las no Apache Web Server. A criação e assinatura das chaves é um processo que pode ser usado Ipsi literis para qualquer serviço ou aplicativo que necessite de chaves assinadas, diferindo apenas o processo de implantação das mesmas. Como exemplo, vamos implantá-la no Apache Web Server, de forma a que ele venha a suportar conexões seguras (protocolo HTTPS). As conexões seguras do Apache normalmente são servidas na porta 443 (e não na porta 80) e, para que funcionem, dependem de configuração extra: cada pasta virtual interessada em servir via conexão segura deve criar uma entidade VirtualHost para tanto. Este artigo não cobre a criação do VirtualHost (que será tema do próximo artigo, o terceiro desta série), mas somente a implantação e configuração do Apache de sorte a torná-lo apto e pronto para servir páginas via SSL, quando desejado.


  • Criando uma Chave e um Requerimento (Certificate Request)

Antes de tudo, entre como root. Em seguida, volte ao nosso diretório especial que criamos para guardar os arquivos do OpenSSL (se você seguiu nosso primeiro artigo, possivelmente nomeou este diretório de "/var/ssl"):

cd /var/ssl

Agora, vamos utilizar o certificado já criado anteriormente para criar uma chave e um signing request:

openssl req -new -nodes -out name-req.pem -keyout private/name-key.pem -config ./openssl.cnf

O que isto faz??
req -new: significa que vai criar um request novo.
-out name-req.pem: o nome da sua chave pública. Pode ser o nome do host, ou algo assim. Escolha o nome de sua preferência, mas evite usar o termo "key", para não confundir com o arquivo de chave privada.
-keyout private/name-key.pem: o nome de sua chave privada. Pode ser qualquer nome, mas sugiro que você utilize o mesmo nome do arquivo anterior, adicionando o termo "key". Note que este arquivo vai para a pasta private e deve estar protegido, ou seja, inacessível a terceiros, por motivos de segurança.
-config ./openssl.cnf: o mesmo arquivo de configuração do OpenSSL utilizado para criar o seu certificado (realizado no artigo anterior, conforme mencionado no caput deste artigo).

O OpenSSL vai fazer aquelas mesmas perguntas anteriores, a respeito de sua localidade (país, estado, cidade) e do nome da sua organização. Responda às perguntas (ou uso os valores padrões) exatamente conforme foi feito na criação de seu certificado, executado no artigo anterior.
Após esta operação, surgirão dois novos arquivos em ser diretório: name-req.pem (contendo o certificate request) e, dentro do diretório private, name-key.pem (private key - chave privada).


  • Assinando o Certificate Request

Agora vamos propriamente assinar este requerimento do certificado. Isto servirá para garantir que o usuário conectado ao seu servidor por conexão segura realmente recebeu a chave dele através de seu servidor, e não uma chave adulterada por terceiros. Esta verificação é obrigatória para o protocolo SSL, por isso precisa ser feita.
Bom, trocando em miúdos, basta digitar:

openssl ca -out name-cert.pem -config ./openssl.cnf -infiles name-req.pem

O que isso significa??
ca: vamos assinar o request e criar um certificado assinado.
-out name-cert.pem: o nome do novo certificado, agora devidamente assinado.
-config ./openssl.cnf: naturalmente, o mesmo arquivo de configuração utilizado desde o início.
-infiles name-req.pem: o arquivo de request original, gerado no passo anterior, que ainda não está assinado mas já contém a chave em si.

Lembra-se de que, quando geramos, lá no artigo anterior, o seu certificate authority, você foi obrigado a dar uma senha?? Pois é: este é o momento de usá-la. A primeira coisa que o comando faz é pedir aquela mesma senha, que deve ser digitada exatamente conforme o foi na criação do seu CA, no artigo anterior.
Em seguida, o comando exibe todas as informações particulares de seu servidor informadas na criação da chave e faz duas perguntas:

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Digite "y" para a primeira pergunta, para que o certificado seja assinado. Isto vai gerar o arquivo name-cert.pem no diretório. Este arquivo nada mais é do que o mesmo request anterior, tendo adicionado um bloco contendo a assinatura, ou seja, os dados informados do servidor e o cálculo MD5SUM destes dados encriptados em RSA com a senha que você digitou. Nunca ninguém no mundo vai ser capaz de abrir esse cálculo RSA e ler o MD5SUM se não possuir a sua bendita senha. Quebrar essa senha certamente dará muito trabalho. Por isso o certificado está assinado e é seguro.
Responda "y" para a segunda pergunta. Isto irá criar uma cópia exata do arquivo no diretório "certs", o seu banco de dados de certificados, porém utilizando o nome dado no arquivo "serial", que criamos no artigo anterior (você achou que ele não serviria para nada, mas aí está a função dele!!). Automaticamente, este arquivo "serial" é sobrescrito com o valor numérico seqüencial imediatamento posterior (antes era 100001, agora é 100002).


  • Vamos Conferir Tudo??

Esta seção foi escrita para quem duvida do que eu digo... não precisa ser realizada, mas vai te ajudar a conferir e entender o que foi feito até o momento.


1- Testando se o seu certificado é igual ao que está no banco de certificados:

diff name-cert.pem certs/100001.pem

Se o comando não mostrou saída de texto, os dois arquivos existem, têm estes nomes e são iguais.


2- Verificando se o arquivo de índice está com o valor imediatamente posterior:

cat serial
100002

De fato, está pronto para o próximo certificado, que será armazenado no banco (pasta certs) com o nome "100002.pem". Se você configurou o atual certificado com data de expiração de 1 ano (365 dias), este certificado novinho provavelmente será gerado no ano que vem...


3- Verificando se as chaves privadas estão geradas:

ls private/
cakey.pem name-key.pem

Sim, ambas as chaves que fazem parte do processo estão lá corretamente.


  • Removendo a Senha da Chave Privada

Alguns serviços tendem a usar a chave privada pedindo a senha a cada vez que se inicializam. Normalmente, desejamos que o serviço inicie com o boot automaticamente e sem pedir nenhuma informação. Para tanto, podemos retirar a senha da chave privada, que não precisa mais dela, pois já estamos com todas as chaves e certificados gerados e prontos. Para tanto, utilize o comando:

openssl rsa -in private/name-key.pem -out private/name-key-nopassword.pem
writing RSA key

Isto vai gerar o arquivo "name-key-nopassword.pem" dentro do diretório private, semelhante ao primeiro, mas sem a senha embutida.


  • Configurando o Apache para Usar o SSL

Agora, finalmente terminamos todas as gerações de chaves, requests e certificados. Precisamos apenas ensinar o Apache a usar essa tecnologia. Então vamos por partes...


1- Ativando o Módulo SSL do Apache

Vamos verificar se seu Apache (que, suponho, já está instalado) está com o módulo de SSL instalado (provavelmente sim) e ativado (talvez não...):

ls /etc/apache2/mods-available/ssl*
/etc/apache2/mods-available/ssl.conf /etc/apache2/mods-available/ssl.load

(substitua "/etc/apache2" pelo local de configuração do seu Apache. Em algumas distribuições, pode ser "/etc/httpd").
Se a listagem acima mostrou os dois arquivos "ssl.conf" e "ssl.load", então o módulo está instalado. Vamos saber se ele está ativado:

ls /etc/apache2/mods-enabled/ssl*
ls: cannot access /etc/apache2/mods-enabled/ssl*: No such file or directory

Se a listagem não retornou os mesmos dois arquivos, conforme o caso aí em cima, então o módulo não está ativo. Para ativá-lo, basta criar, no diretório mods-enabled, um link simbólico para cada arquivo ssl.* presente no mods-available:

ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load

Agora os módulos estão configurados. Mas, calma, não reinicie o Apache ainda... precisamos configurar o módulo e instruí-lo sobre onde estão as chaves que criamos...


2- Importando as Chaves para o Apache

Vamos criar um diretório dentro das configurações do Apache para armazenar as chaves que desejamos utilizar e, em seguida, copiá-las para lá:

mkdir /etc/apache2/ssl
cp private/name-key-nopassword.pem /etc/apache2/ssl/
cp name-cert.pem /etc/apache2/ssl/


3- Configurando o Módulo SSL do Apache

Agora falta pouco!! Vamos editar o arquivo de configuração do módulo SSL do Apache e dizer para ele onde estão as chaves que acabamos de copiar aí em cima:

vi /etc/apache2/mods-available/ssl.conf

Acrescente, possivelmente ao final do arquivo (porém antes de fechar a tal "IfModule"), as seguintes linhas:

# Including certificate authority
SSLCertificateFile /etc/apache2/ssl/name-cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/name-key-nopassword.pem

Vamos ver se o Apache entendeu bem a configuração e achou os arquivos?? Vamos reiniciá-lo e observar o log de erros:

/etc/init.d/apache2 stop
/etc/init.d/apache2 start
less /var/log/apache2/error.log

Agora o seu Apache já está pronto para utilizar SSL. O que falta é apenas configurar quais portais servidos por ele serão tunelados por conexão segura, ou seja, serão servidos via protocolo HTTPS, pela porta 443, e não mais pela porta 80, que é a padrão. Isto é feito na tag VirtualHost. No próximo artigo trataremos deste pormenor... até lá!!

Quem quiser, claro: comente!!

10 comentários:

Daniel disse...

Muito obrigado. Excelente post! Me ajudou muito.

O Pajé disse...

Disponha, amigo!! Pretendo contribuir sempre e fico feliz de ter sido útil!!

Luiz Carlos Gonçalves disse...

Foi uma das explicações mais claras sobre OpenSSL e Apache que já vi.
Parabéns!

O Pajé disse...

Muito obrigado, Luiz!! Fico muito feliz de ter podido ajudar!! Torço que vc encontre sempre no pajeonline boas dicas e tutoriais, sempre claros e completos.

Anônimo disse...

Obrigado amigo. Como disse o Luiz Carlos Gonçalves, sua explicação sobre a configuração do OpenSSL no apache foi a melhor que encontrei. Me ajudou muito e tenho certeza que está ajudando a muitas outras pessoas também.

Felicidades!!!

O Pajé disse...

Muito grato, amigo!!

É sempre um grande prazer receber estas excelentes notícias!! Fico feliz de perceber que o esforço para redigir os artigos está dando frutos, colaborando com a comunidade, ajudando as pessoas e divulgando estes conhecimentos.
Muito grato!!
Pajé

Anônimo disse...

Muito obrigado. Mais claro que este post não existe.

Unknown disse...

Depois de ler a fraca documentação oficial do openssl e seguir vários tutoriais online, finalmente com seu manual e relendo várias vezes as man pages eu consegui criar meu certificado! Muito obrigado! Só uma dúvida, qual a diferença em adicionar as linhas SSLCertificateFile e SSLCertificateKeyFile no arquivo /etc/apache2/mods-available/ssl.conf ao invés de inseri-lo em um virtual host, como por exemplo /etc/apache2/sites-available/default-ssl ou outro qualquer? Abraços!

Anônimo disse...

Muito obrigado !! ótimo tutorial

O Pajé disse...

Muito grato, amigo!