Configurando o Protocolo SSL (TLS)

Utilize o FileZilla para copiar o arquivo mydomain.key que foi gerado na página Gerando Chaves e o arquivo mydomain.crt obtido em Como Comprar um CRT ? para a pasta /home/ubuntu. Depois copie os arquivos para a pasta /usr/local/apache2/conf, utilizando o comando:

$ sudo mv mydomain.* /usr/local/apache2/conf

OBS: O FileZilla somente pode copiar os arquivos diretamente para a pasta /usr/local/apache2/conf caso esteja logado como usuário root.

O arquivo utilizado na configuração da comunicação criptografada no Apache é denominado httpd-ssl.conf

Para abrir o arquivo httpd-ssl.conf para edição:

$ sudo nano /usr/local/apache2/conf/extra/httpd-ssl.conf

As principais diretivas utilizadas na configuração do protocolo SSL/TLS são:

  Listen 443
    
  #   Speed-optimized SSL Cipher configuration:
  SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5
  SSLHonorCipherOrder on 
  
  #   Pass Phrase Dialog:
  SSLPassPhraseDialog  builtin
  
  #   Inter-Process Session Cache:
  SSLSessionCache        "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
  SSLSessionCacheTimeout  300
    
  ##
  ## SSL Virtual Host Context
  ##
  <VirtualHost _default_:443>
  
  #   General setup for the virtual host
  DocumentRoot "/usr/local/apache2/htdocs/mysite"
  ServerName mydomain.com:443
  ServerAdmin fulano@gmail.com
  ErrorLog "/usr/local/apache2/logs/error_log"
  TransferLog "/usr/local/apache2/logs/access_log"
  
  SSLEngine on
  
  SSLCertificateFile "/usr/local/apache2/conf/mydomain.crt"
  SSLCertificateKeyFile "/usr/local/apache2/conf/mydomain.key"
  
  <FilesMatch "\.(cgi|shtml|phtml|php)$">
      SSLOptions +StdEnvVars
  </FilesMatch>
  <Directory "/usr/local/apache2/cgi-bin">
      SSLOptions +StdEnvVars
  </Directory>
  
  <Directory "/usr/local/apache2/htdocs/mysite">
      Options Indexes FollowSymLinks MultiViews
      AllowOverride all
      Require all granted
  </Directory>
    
  BrowserMatch "MSIE [2-5]" \
           nokeepalive ssl-unclean-shutdown \
           downgrade-1.0 force-response-1.0
  
  CustomLog "/usr/local/apache2/logs/ssl_request_log" \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  
  </VirtualHost>                                

Reinicializar o Apache:

$ sudo /usr/local/apache2/bin/apachectl restart
$ sudo /usr/local/apache2/bin/apachectl status

Informações sobre as diretivas:

Listen 443  #Porta padrão HTTPS

SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5

A diretiva SSLCipherSuite especifica um conjunto de algorítmos (Cipher Suite) disponível para negociação durante o handshake SSL/TLS.

A especificação de cifra RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5 configura uma criptografia de dificuldade média. Criptografias fracas comprometem a segurança e fortes exigem muito recurso de CPU.

SSLHonorCipherOrder on

Na escolha de uma cifra durante um handshake SSLv3 ou TLSv1, normalmente a preferência do navegador do cliente é usada. No entanto, se essa diretiva estiver habilitada (SSLHonorCipherOrder on), a preferência do servidor será usada.

SSLPassPhraseDialog builtin

Quando o Apache é inicializado, deve ler os vários arquivos de certificado (consulte SSLCertificateFile) e Chave privada (consulte SSLCertificateKeyFile) dos servidores virtuais habilitados para SSL. Como, por razões de segurança, os arquivos de chave privada são geralmente criptografados, o mod_ssl precisa consultar o administrador sobre uma senha para descriptografar esses arquivos. Esta consulta pode ser feita de duas maneiras que podem ser configuradas por tipo:

O modo builtin é o padrão. Como muitos hosts virtuais habilitados para SSL/TLS podem ser configurados, no momento em que um arquivo de chave privada criptografado é encontrado, uma caixa de diálogo irá surgir solicitando a senha ao adminstrador. Caso a senha seja a correta, ela será lembrada caso outro servidor virtual contenha uma chave privada criptografada e, talvez, possa ser reutilizada. Caso não seja a correta, uma nova caixa de diálogo irá surgir, solicitando uma nova senha.

OBS: Nos exemplos apresentados nesse tutorial, as chaves privadas não estão criptografadas.

SSLSessionCache memcache:localhost:11211

Antes do navegador solicitar ao servidor uma página que contém texto, figuras, entre outros dados, pe necessário realizar o handshake. Clientes modernos (navegadores atuais) podem solicitar essas informações de modo paralelo para poderem visualiza o conteúdo mais rápido. Para evitar que o servidor realize vários handshakes (que consiste em um processo demorado) para enviar cada informação pedida, utilza-se a diretiva SSLSessionCache para que o servidor configure um cache para acelerar o processamento de solicitações paralelas.

Um cache entre processos ajuda a evitar handshakes de sessão desnecessários, pois mantém a conexão ativa (via HTTP keep-alive). Assim, quando o servidor recebe várias solicitações paralelas para o mesmo processo, atende as solicitações com menos esforço de CPU e consumo de memória.

SSLSessionCacheTimeout 300

Esta diretiva define o tempo limite em segundos para: informações armazenadas no cache de sessão SSL global/entre processos, cache de memória interna OpenSSL e para as sessões retomadas pela retomada da sessão TLS (RFC 5077). O tempo mínimo é de 15 segundos, porém, somente para testes. Para operação normal, deve ser definido para valores mais altos. O valor padrão é de 300 segundos.

<VirtualHost _default_:443>

Inicia uma seção de host virtual na porta 443

SSLEngine on

Esta diretiva deve ser usada dentro de uma seção <VirtualHost _default_:443> para habilitar ou desabilitar o mecanismo do protocolo SSL/TLS. Por padrão, o mecanismo de protocolo SSL/TLS está desabilitado para o servidor principal e todos os hosts virtuais configurados.

DocumentRoot "/usr/local/apache2/htdocs/mysite"

Esta diretiva informa ao Apache que os arquivos do site estão na pasta mysite e o caminho para encontrá-la

ServerName mydomain.com:443

Quando um navegador realiza uma requisição HTTP ao servidor, ele verifica se a informação de host que ela contém é igual a informada em ServerName.

ServerAdmin fulano@mydomain.com

ServerAdmin define o endereço de contato que o servidor inclui em qualquer mensagem de erro que retorna ao cliente.

ErrorLog "/usr/local/apache2/logs/error_log"

A diretiva ErrorLog define a localização e o nome do arquivo de log, isto é, o arquivo onde os erros que ocorrerem no servidor serão gravados. É o local onde o Apache httpd enviará informações de diagnóstico e registrará quaisquer erros que encontrar nas solicitações de processamento. É o primeiro lugar a olhar quando ocorre um problema ao iniciar o servidor ou ao funcionamento do servidor, pois muitas vezes contém detalhes sobre o que deu errado e como corrigi-lo.

O log de erros geralmente é gravado em um arquivo (normalmente error_log em sistemas Unix e error.log no Windows e OS/2).

TransferLog "/usr/local/apache2/logs/access_log"

TransferLog especifica o arquivo no qual armazenar o log de acessos ao site. Se não estiver explicitamente incluído no arquivo de configuração, nenhum log será gerado. Tanto a requisição a uma página quanto cada elemento que ela contém, fica registrado no arquivo de log de acesso (asses_log).

Exemplo:

Um navegador, que está sendo executado em uma máquina com ip 164.163.214.61, acessou uma página que possui várias figuras, em 26/Feb/2021:07:06:06 +0000, hospedada em um servidor Apache, denominada buy_crt.html.

O acesso gerou o seguinte log de acesso no arquivo acess_log:

 
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/buy_crt.html HTTP/1.1" 200 12264
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/dynadot_ssl_inicial.png HTTP/1.1" 200 247322
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/ssl_regular.png HTTP/1.1" 200 46821
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/dynadot_csr_empty.png HTTP/1.1" 200 30967
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/Notepad_CSR.png HTTP/1.1" 200 132283
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/dynadot_csr_full.png HTTP/1.1" 200 89091
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/dynadot_csr_review.png HTTP/1.1" 200 64405
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/meu_ssl.png HTTP/1.1" 200 5449
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/status_do_pedido.png HTTP/1.1" 404 196
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/he.png HTTP/1.1" 200 63273
164.163.214.61 -- [26/Feb/2021:07:06:06 +0000] "GET /apache/images/he_txt_record.png HTTP/1.1" 200 99685
164.163.214.61 -- [26/Feb/2021:07:06:07 +0000] "GET /apache/images/certificate_code.png HTTP/1.1" 404 196

Para obter informações mais detalhadas, consulte Apache Module mod_ssl