HTTPS no Apache

Comunicações HTTP podem ser criptografadas com SSL. Quando isso ocorre, o protocolo passa a se chamar HTTPS. O SSL, de forma muito resumida, utiliza o conceito de chaves privadas e públicas. Para saber um pouco mais sobre SSL e como ele funciona, clique aqui.

No caso de um servidor web, a chave pública costuma ser distribuída livremente. Somente através desta chave pode-se decriptografar os dados que foram criptografados pela chave privada. Vou dar mais detalhes e exemplos mais tarde.

Mas como distribuir esta chave em um servidor web? Fácil: Através de um certificado digital. Provavelmente você já ouviu falar em certificados digitais.

Existem vários tipos de certificados. Poderíamos utilizar nesta dica um “Wildcard SSL Certificate”, que é um certificado que pode ser usado com todos os subdomínios hospedados em um mesmo servidor. Mas hoje em dia isso não funciona  muito bem. Então usaremos como exemplo o domínio forenaite.com.br, e o hostname rocha.

Chega de enrolar. Mão na massa! 🙂

Você vai precisar de um servidor Linux ou Solaris, com OpenSSL e Apache já instalados e funcionando. Outras distribuições como FreeBSD e afins também devem funcionar. O processo de configuração é genérico, e a única coisa que muda são alguns diretórios e nomes de arquivo de configuração.

I) Gerando a Chave Privada:

Lembrando que esta chave deve ser secreta e serve apenas para criptografar os dados.

cd /etc/pki/tls/private
openssl genrsa -des3 -out rocha.forenaite.com.br.key 1024

Este comando gera uma chave privada RSA de 1024 bits. Para uma validação mais extensa, o tamanho da chave deve ser 2048 bits.

É altamente recomendável que seja utilizada uma frase secreta, semelhante a uma senha, para proteção da chave privada. Neste exemplo, será utilizada esta frase secreta:
“VouCriptografarParaNinguemSaber”

Nota: Para ignorar a solicitação de senha, omita o parâmetro “-des3” do comando que gera a chave.

Importante: Se a chave privada ficar desprotegida (sem senha), recomenda-se que apenas 1 administrador tenha acesso ao servidor onde esta ficar armazenada, e que todas as medidas lógicas de segurança, como boa configuração dos aplicativos e regras de firewall sejam empregadas.

Para que esta chave privada possa ser utilizada em servidores web, ela precisa estar assinada por uma autoridade certificadora.

OBS: É necessário usar nomes FQDN.

II) Gerando a requisição de assinatura da chave privada:

Para que uma chave privada possa ser assinada por uma CA (autoridade certificadora), uma requisição deve ser emitida. Os seguintes comandos geram uma requisição de assinatura, e o arquivo resultante (CSR) deve  ser enviado a CA (Ex: CertSign, VeriSign, TrustSign, etc). Ah, nós também podemos atuar como uma CA! Você já vai saber como.

cd /etc/pki/tls/certs
openssl req -new -key /etc/pki/tls/private/rocha.forenaite.com.br.key -out rocha.forenaite.com.br.csr

Uma mensagem semelhante a esta será exibida:

Enter pass phrase for rocha.forenaite.com.br.key:

Neste ponto você insere a senha que foi utilizada para gerar a chave privada. Lembra?

Outras informações precisam ser preenchidas. Complete somente os campos mostrados abaixo:
Country Name (2 letter code) [GB]: BR
State or Province Name (full name) [Berkshire]: Rio de Janeiro
Locality Name (eg, city) [Newbury]: Rio de Janeiro
Organization Name (eg, company) [My Company Ltd]: Forenaite Tecnologia
Organizational Unit Name (eg, section) []: Arquitetura de Soluções
Common Name (eg, your name or your server’s hostname) []: rocha.forenaite.com.br
Email Address []:VAZIO! NÃO DIGITAR NADA!
A challenge password []: VAZIO! NÃO DIGITAR NADA!
An optional company name []:VAZIO! NÃO DIGITAR NADA!

Dica: Não esquecer de incluir no seu Backup as chaves privadas!

III) Assinando localmente a chave

Para que uma chave criptográfica possa ser utilizada, ela precisa estar assinada por uma autoridade certificadora, como por exemplo a VeriSign. Como neste exemplo não estão sendo considerados os recursos necessários para o investimento em serviços de uma autoridade certificadora, será utilizada uma técnica que permite que a chave seja assinada localmente, ou seja, o administrador que está criando a chave criptográfica será também a autoridade certiticadora que a assinará.

Para assinar a chave, basta utilizar o comando abaixo, preenchendo as informações solicitadas tendo como exemplo o texto em vermelho a seguir:

/etc/pki/tls/private
openssl req -new -key rocha.forenaite.com.br.key -x509 -days 365 -out /etc/pki/tls/certs/rocha.forenaite.com.br.crt

Enter pass phrase for rocha.forenaite.com.br.key:

Neste ponto você insere novamente a senha que foi utilizada para gerar a chave privada.

Country Name (2 letter code) [GB]: BR
State or Province Name (full name) [Berkshire]: Rio de Janeiro
Locality Name (eg, city) [Newbury]: Rio de Janeiro
Organization Name (eg, company) [My Company Ltd]: Forenaite Tecnologia
Organizational Unit Name (eg, section) []: Arquitetura de Soluções
Common Name (eg, your name or your server’s hostname) []: rocha.forenaite.com.br
Email Address []:VAZIO! NÃO DIGITAR NADA!

Restringindo o acesso ao arquivo chave:

cd /etc/pki/tls/certs
chmod 600 rocha.forenaite.com.br.c* /etc/pki/tls/private/NOME.dominio.com.br.key

IV) Informações imprescindíveis:

A chave assinada (rocha.forenaite.com.br.crt), também é conhecida como chave pública, e pode ser importada em uma estação de trabalho, por exemplo. Comunicações criptografadas com a chave privada gerada neste exemplo só podem ser decriptografadas com esta chave assinada (pública), e vice versa. Isso garante a autenticidade, confidencialidade e a integridade das comunicações feitas com o uso destas chaves (3 pilares da certificação digital).

OBS: Formatos PEM são semelhantes aos formatos gerados neste procedimento, pois são arquivos em Base64 encodados em ASCII, que contém as diretivas “—–BEGIN CERTIFICATE—–” e “—–END CERTIFICATE—–“.
Certificados para Servidores, Certificados Intermediários e Chaves Privadas podem ser todas colocadas no formato PEM.

Dica: Convertendo entre formatos:

Converter um arquivo em formato DER (.crt .cer .der) para PEM

openssl x509 -in rocha.forenaite.com.br.crt -out rocha.forenaite.com.br.pem

V) Configurando o Apache para uso do SSL

Em breve …

One thought on “HTTPS no Apache

  1. Pingback: Estamos Online! | Andre Rocha

Leave a Reply