Configuração de SSL/TLS no Apache do CentOS 7

Se você seguiu as instruções detalhadas em Instalação do Apache, PHP e MySQL (MariaDB) no CentOS 7, sua instalação está pronto e funcionando mas não está segura: conexões SSL/TLS não estão habilitadas.

Por padrão o Apache do CentOS 7 não habilita o SSL. Para isso, siga as instruções abaixo.

Verifique se o sistema está atualizado (como root):

# yum check-update
# yum update

Agora instale o mod_ssl e o OpenSSL:

# yum install mod_ssl openssl

Isso criará o arquivo /etc/httpd/conf.d/ssl.conf com as configurações do SSL/TLS. Um problema nesse arquivo é que ele habilita protocolos SSL antigos que já não são seguros: SSLv2 e SSLv3. Devemos desabilitar esses protocolos não seguros e habilitar somente os protocolos seguros TLSv1.1 e TLSv1.2 (se você tem alguma aplicaçãoantiga que não funciona bem com esses protocolos mais novos, habilite também o TLSv1.0). Siga os passos abaixo.

Edite o arquivo /etc/httpd/conf.d/ssl.conf e procure por todas as ocorrências da variável SSLProtocol e deixe da seguinte maneira (se você configurou essa variável em algum virtual host, também deve alterar essa variável na configuração do virtual host!):

SSLProtocol -all +TLSv1.1 +TLSv1.2

Agora reinicie o Apache:

# systemctl restart httpd.service

Se tudo correu bem, o SSL/TLS está habilitado em seu Apache. Por padrão o CentOS gera um certificado auto-assinado com informações genéricas. Temos que criar um outro certificado auto-assinado com informações mais específicas, ou obter um certificado comercial válido na internet (via Comodo, Geotrust, VeriSign, etc.).

Para criar um certificado auto-assinado temos que instalar o pacote crypto-utils:

# yum install crypto-utils

O pacote crypto-utils contém utilitários para criar, manter e gerenciar certificados e chaves privadas, incluindo o utilitário “genkey” da RedHat, que gera o par de chaves e o certificado (nos diretórios /etc/pki/tls/private  e /etc/pki/tls/certs).

Para gerar o certificado e a chave com o utilitário genkey, faça o seguinte (ATENÇÃO! Não execute esse utilitário via SSH pois ele precisa gerar números aleatórios com o dispositivo /dev/random que precisa de movimentos de teclado, mouse, etc. para gerar entropia suficiente para a geração dos números aleatórios; se você rodar esse comando por SSH, não vai terminar nunca!):

Chame o genkey, como root, passando como parâmetro o nome do servidor que utilizará o certificado:

# genkey www.smsaude.com.br

Inicialmente o genkey informará em quais arquivos salvará o certificado e a chave (figura abaixo). Basta clicar next.

genkey passo 01

Depois o genkey solicitará o tamanho da chave. Aceite o padrão de 2048 bits e clique em next:

genkey passo 02

Agora o genkey gerará alguns bits aleatórios (isso não deverá demorar muito):

genkey passo 03

E agora o genkey gerará números aleatórios através do /dev/random. Digite no teclado, movimente o mouse (se for o caso), utilize o disco, enfim: faça qualquer coisa para gerar entropia suficiente para o gerador de números aleatórios (caso contrário esse processo não terminará nunca):

genkey passo 04

Agora o genkey perguntará se você deseja gerar uma solicitação de assinatura para uma autoridade certificadora válida (Comodo, Geotrust, VeriSign, etc.). Se você digitar YES o genkey não gerará um certificado, somente uma solicitação para ser enviado à autoridade certificadora; Se você ditiar NO o genkey gerará um certificado auto-assinado. No nosso caso, escolha a opção NO:

genkey passo 05

Agora o genkey pergunta se a chave privada deverá ser criptografada. ATENÇÃO: se você criptografar a chave privada e gerar uma senha para ela, toda vez que o servidor ou o Apache for reiniciado, a senha do certificado será solicitada; se você não criar uma senha, o sistema não solicitará a senha da chave do certificado no momento do reboot do sistema, mas se alguém invadir seu servidor, poderá obter a chave. Em nosso caso, continue SEM criptografar a chave (não marque a opção):

genkey passo 06

Agora preencha as informações do certificado (não use acentos ou caracteres especiais!):

genkey passo 07

Agora o genkey irá rodar rapidamente e gerar os arquivos solicitados: a chave (www.smsaude.com.br.key – root:root; 400) será gerada no diretório /etc/pki/tls/private e o certificado (www.smsaude.com.br.crt – root:root 640) será gerado no diretório /etc/pki/tls/certs.

Para fazer o Apache usar o novo certificado e chave, altere o arquivo /etc/httpd/conf.d/ssl.conf e aponte os novos arquivos nas variáveis abaixo (se essas configurações estão em algum virtual host, ajuste de acordo):

SSLCertificateFile /etc/pki/tls/certs/www.smsaude.com.br.crt
SSLCertificateKeyFile /etc/pki/tls/private/www.smsaude.com.br.key

Agora basta reiniciar o Apache:

# systemctl restart httpd.service

Se nenhum erro ocorreu, o Apache já está usando os certificados novos. Obviamente, como o certificado é auto-assinado, os browsers reclamarão dizendo que a conexão não é segura. Basta aceitar o certificado no browser (ou então, pagar um certificado válido).