Tutorial

Como Criar um Certificado SSL Autoassinado para o Apache no Debian 10

ApacheSecurityDebian 10

Introdução

O TLS, ou Transport Layer Security, e seu predecessor SSL, que significa Secure Sockets Layer, são protocolos web usados para agrupar o tráfego normal em um encapsulamento protegido e criptografado.

Usando essa tecnologia, os servidores podem enviar tráfego com segurança entre servidores e clientes, sem a possibilidade de mensagens serem interceptadas por terceiros. O sistema de certificação também ajuda os usuários a verificar a identidade dos sites aos quais estão se conectando.

Neste guia, mostraremos como configurar um certificado SSL autoassinado para uso com um servidor web Apache no Debian 10.

Nota: Um certificado autoassinado irá criptografar a comunicação entre o seu servidor e quaisquer clientes. No entanto, como ele não é assinado por nenhuma autoridade de certificação confiável incluída nos navegadores web, os usuários não podem usar o certificado para validar a identidade do seu servidor automaticamente.

Um certificado autoassinado pode ser apropriado se você não tiver um nome de domínio associado ao seu servidor e nos casos em que uma interface web criptografada não esteja voltada para o usuário. Se você tiver um nome de domínio, em muitos casos, é melhor usar um certificado assinado pela CA (Autoridade Certificadora). Você pode descobrir como configurar um certificado gratuito confiável com o projeto Let’s Encrypt aqui.

Pré-requisitos

Antes de começar, você deve ter um usuário não-root configurado com privilégios sudo. Você pode aprender como configurar esse tipo de conta de usuário seguindo nosso tutorial Initial Server Setup with Debian 10.

Você também precisará ter o servidor web Apache instalado. Se você deseja instalar uma pilha LAMP inteira (Linux, Apache, MariaDB, PHP) em seu servidor, siga nosso guia setting up LAMP on Debian 10. Se você deseja apenas o servidor Apache, pule os passos referentes ao PHP e ao MariaDB.

Quando tiver concluído esses pré-requisitos, continue abaixo.

Passo 1 — Criando o Certificado SSL

O TLS/SSL funciona usando uma combinação de um certificado público e uma chave privada. A chave SSL é mantida em segredo no servidor. Ela é usada para criptografar o conteúdo enviado aos clientes. O certificado SSL é compartilhado publicamente com qualquer pessoa que solicite o conteúdo. Ele pode ser usado para descriptografar o conteúdo assinado pela chave SSL associada.

Podemos criar uma chave autoassinada e um par de certificados com o OpenSSL em um único comando:

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Você será solicitado a responder uma série de perguntas. Antes de analisarmos isso, vamos dar uma olhada no que está acontecendo no comando que estamos executando:

  • openssl: Esta é a ferramenta de linha de comando básica para criar e gerenciar certificados OpenSSL, chaves e outros arquivos.
  • req: Este subcomando especifica que queremos usar o gerenciamento de solicitação de assinatura de certificado X.509 (CSR). O “X.509” é um padrão de infraestrutura de chave pública ao qual o SSL e o TLS aderem para seu gerenciamento de chaves e certificados. Queremos criar um novo certificado X.509, portanto, estamos usando esse subcomando.
  • -x509: Isso modifica ainda mais o subcomando anterior dizendo ao utilitário que queremos criar um certificado autoassinado em vez de gerar uma solicitação de assinatura de certificado, como normalmente aconteceria.
  • -nodes: Isso diz ao OpenSSL para ignorar a opção de proteger nosso certificado com uma senha. Precisamos do Apache para poder ler o arquivo, sem a intervenção do usuário, quando o servidor iniciar. Uma senha secreta impediria que isso acontecesse, pois teríamos que inseri-la após cada reinicialização.
  • -days 365: Esta opção define o período em que o certificado será considerado válido. Definimos isso para um ano aqui.
  • -newkey rsa:2048: Isso especifica que queremos gerar um novo certificado e uma nova chave ao mesmo tempo. Não criamos a chave necessária para assinar o certificado em uma etapa anterior, portanto, precisamos criá-la junto com o certificado. A parte rsa: 2048 diz para criar uma chave RSA com 2048 bits de comprimento.
  • -keyout: Essa linha informa ao OpenSSL onde colocar o arquivo de chave privada gerado que estamos criando.
  • -out: Isso informa ao OpenSSL onde colocar o certificado que estamos criando.

Como dissemos acima, essas opções criarão um arquivo de chave e um certificado. Serão feitas algumas perguntas sobre nosso servidor para incorporarmos as informações corretamente no certificado.

Preencha as instruções adequadamente. A linha mais importante é aquela que solicita o Common Name (por exemplo, FQDN do servidor ou SEU nome). Você precisa inserir o nome de domínio associado ao seu servidor ou, mais provavelmente, o endereço IP público do seu servidor.

O sumário das solicitações será mais ou menos assim:

Output
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:endereço_IP_do_servidor Email Address []:admin@seu_domínio.com

Ambos os arquivos que você criou serão colocados nos subdiretórios apropriados em /etc/ssl.

Passo 2 — Configurando o Apache para Usar SSL

Criamos nossos arquivos de chave e certificado no diretório /etc/ssl. Agora só precisamos modificar nossa configuração do Apache para tirar vantagem disso.

Vamos fazer alguns ajustes em nossa configuração:

  1. Criaremos um bloco de configuração para especificar configurações SSL fortes por padrão.
  2. Modificaremos o arquivo incluído de Virtual Host SSL do Apache para apontar para nossos certificados SSL que foram gerados.
  3. (Recomendado) Modificaremos o arquivo de Virtual Host não criptografado para redirecionar automaticamente as solicitações para o Virtual Host criptografado.

Quando terminarmos, devemos ter uma configuração SSL segura.

Criando um Bloco de Configuração do Apache com Definições Fortes de Criptografia

Primeiro, criaremos um bloco de configuração do Apache para definir algumas configurações de SSL. Isso configurará o Apache com um forte conjunto de cifras SSL e permitirá alguns recursos avançados que ajudarão a manter nosso servidor seguro. Os parâmetros que definiremos podem ser usados por qualquer Virtual Host que habilite o SSL.

Crie um novo bloco no diretório /etc/apache2/conf-available. Vamos nomear o arquivo como ssl-params.conf para tornar claro o seu propósito.

  • sudo nano /etc/apache2/conf-available/ssl-params.conf

Para configurar o Apache SSL com segurança, usaremos as recomendações de Remy van Elst no site Cipherli.st. Este site foi desenvolvido para fornecer configurações de criptografia fáceis de consumir por softwares populares.

As configurações sugeridas no site mencionado acima oferecem segurança forte. Às vezes, isso vem com o custo de se ter mais compatibilidade do cliente. Se você precisar oferecer suporte a clientes mais antigos, existe uma lista alternativa que pode ser acessada clicando no link na página rotulada “Yes, give me a ciphersuite that works with legacy / old software.” Essa lista pode ser substituída pelos itens copiados abaixo.

A escolha de qual configuração você usará dependerá em grande parte do que você precisa suportar. Ambos fornecerão grande segurança.

Para nossos propósitos, podemos copiar as configurações fornecidas na íntegra. Faremos apenas uma pequena alteração e desabilitaremos o cabeçalho Strict-Transport-Security (HSTS).

O pré-carregamento do HSTS fornece maior segurança, mas pode ter consequências de longo alcance se for ativado acidentalmente ou incorretamente. Neste guia, não habilitaremos as configurações, mas você poderá modificá-las se tiver certeza de entender as implicações.

Antes de decidir, reserve um momento para ler HTTP Strict Transport Security, or HSTS, e especificamente sobre a funcionalidade de “pré-carregamento”.

Cole a seguinte configuração no arquivo ssl-params.conf que abrimos:

/etc/apache2/conf-available/ssl-params.conf
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Salve e feche o arquivo quando terminar.

Modificando o Arquivo Padrão de Virtual Host SSL do Apache

Agora, vamos modificar /etc/apache2/sites-available/default-ssl.conf, o arquivo padrão de Virtual Host SSL do Apache. Se você estiver usando um arquivo de blocos de servidor diferente, substitua seu nome nos comandos abaixo.

Antes de prosseguir, vamos fazer backup do arquivo original do Virtual Host SSL:

  • sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Agora, abra o arquivo Virtual Host SSL para fazer ajustes:

  • sudo nano /etc/apache2/sites-available/default-ssl.conf

Dentro dele, com a maioria dos comentários removidos, o bloco de Virtual Host deve se parecer com isso por padrão:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Faremos alguns pequenos ajustes no arquivo. Definiremos as coisas normais que queremos ajustar em um arquivo de Virtual Host (endereço de email do ServerAdmin, ServerName etc.) e ajustaremos as diretivas SSL para apontar para o nosso certificado e arquivos de chave. Novamente, se você estiver usando um document root diferente, atualize a diretiva DocumentRoot.

Depois de fazer essas alterações, seu bloco de servidor deve ser semelhante a este:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin seu_e-mail@example.com
                ServerName domínio_do_servidor_ou_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Salve e feche o arquivo quando terminar.

(Recomendado) Modificando o Arquivo de Virtual Host HTTP para Redirecionar para HTTPS

Do jeito que está no momento, o servidor fornecerá tanto o tráfego HTTP não criptografado quanto HTTPS criptografado. Para maior segurança, é recomendado na maioria dos casos redirecionar HTTP para HTTPS automaticamente. Se você não quiser ou não precisar dessa funcionalidade, você poderá pular seguramente esta seção.

Para ajustar o arquivo de Virtual Host não criptografado para redirecionar todo o tráfego a ser criptografado por SSL, abra o arquivo /etc/apache2/sites-available/000-default.conf:

  • sudo nano /etc/apache2/sites-available/000-default.conf

Dentro dos blocos de configuração VirtualHost, adicione uma diretiva Redirect, apontando todo o tráfego para a versão SSL do site:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect "/" "https://seu_domínio_ou_IP/"

        . . .
</VirtualHost>

Salve e feche o arquivo quando terminar.

Essas são todas as alterações de configuração que você precisa fazer no Apache. A seguir, discutiremos como atualizar as regras do firewall com o ufw para permitir o tráfego HTTPS criptografado no seu servidor.

Passo 3 — Ajustando o Firewall

Se você tiver o firewall ufw ativado, conforme recomendado pelos guias de pré-requisito, pode ser necessário ajustar as configurações para permitir o tráfego SSL. Felizmente, quando instalado no Debian 10, o ufw vem carregado com perfis de aplicativos que você pode usar para ajustar suas configurações de firewall.

Podemos ver os perfis disponíveis digitando:

  • sudo ufw app list

Você deve ver uma lista como esta, com os quatro perfis a seguir na parte inferior da saída:

Output
Available applications: . . . WWW WWW Cache WWW Full WWW Secure . . .

Você pode ver a configuração atual digitando:

  • sudo ufw status

Se você permitiu apenas o tráfego HTTP regular anteriormente, sua saída pode ter esta aparência:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere WWW ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) WWW (v6) ALLOW Anywhere (v6)

Para permitir adicionalmente o tráfego HTTPS, permita o perfil “WWW Full” e então exclua a permissão redundante de perfil “WWW”:

  • sudo ufw allow 'WWW Full'
  • sudo ufw delete allow 'WWW'

Seu status deve ficar assim agora:

  • sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere WWW Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) WWW Full (v6) ALLOW Anywhere (v6)

Com seu firewall configurado para permitir o tráfego HTTPS, você pode prosseguir para o próximo passo, onde veremos como habilitar alguns módulos e arquivos de configuração para permitir que o SSL funcione corretamente.

Passo 4 — Ativando as Alterações no Apache

Agora que fizemos nossas alterações e ajustamos o nosso firewall, podemos habilitar os módulos de SSL e de headers no Apache, habilitar o Virtual Host pronto para SSL e reiniciar o Apache para efetivar essas alterações.

Ative o mod_ssl, o módulo SSL do Apache e o mod_headers, que são necessários para algumas das configurações em nosso bloco SSL, com o comando a2enmod:

  • sudo a2enmod ssl
  • sudo a2enmod headers

Em seguida, ative seu Virtual Host SSL com o comando a2ensite:

  • sudo a2ensite default-ssl

Você também precisará habilitar seu arquivo ssl-params.conf para ler os valores que você definiu:

  • sudo a2enconf ssl-params

Neste ponto, o site e os módulos necessários estão habilitados. Devemos verificar para garantir que não haja erros de sintaxe em nossos arquivos. Faça isso digitando:

  • sudo apache2ctl configtest

Se tudo der certo, você obterá um resultado parecido com o seguinte:

Output
Syntax OK

Desde que sua saída tenha um Syntax OK, seu arquivo de configuração não tem erros de sintaxe e você poderá reiniciar o Apache com segurança para implementar as alterações:

  • sudo systemctl restart apache2

Com isso, seu certificado SSL autoassinado está pronto. Agora você pode testar se seu servidor está criptografando corretamente o tráfego.

Passo 5 — Testando a Criptografia

Agora você está pronto para testar seu servidor SSL.

Abra o seu navegador e digite https:// seguido pelo nome de domínio ou IP do seu servidor na barra de endereços:

https://domínio_do_servidor_ou_IP

Como o certificado que você criou não foi assinado por uma das autoridades de certificação confiáveis do seu navegador, você provavelmente verá um aviso de aparência assustadora como o abaixo:

Apache self-signed cert warning

Isso é esperado e normal. Estamos interessados apenas no aspecto de criptografia do nosso certificado, não na validação de terceiros da autenticidade do nosso host. Clique em AVANÇADO e, em seguida, no link fornecido para continuar com seu host:

Apache self-signed override

Você deve ser levado ao seu site. Se você procurar na barra de endereço do navegador, verá uma fechadura com um “x” sobre ela ou outro aviso similar de “não seguro”. Nesse caso, isso significa apenas que o certificado não pode ser validado. Ele ainda está criptografando sua conexão.

Se você configurou o Apache para redirecionar HTTP para HTTPS, também poderá verificar se o redirecionamento funciona corretamente:

http://domínio_do_servidor_ou_IP

Se isso resultar no mesmo ícone, isso significa que seu redirecionamento funcionou corretamente. No entanto, o redirecionamento que você criou anteriormente é apenas um redirecionamento temporário. Se você deseja tornar o redirecionamento permanente para HTTPS, continue até o passo final.

Passo 6 — Alterando para um Redirecionamento Permanente

Se o seu redirecionamento funcionou corretamente e você tem certeza de que deseja permitir apenas o tráfego criptografado, modifique o Apache Virtual Host não criptografado novamente para tornar o redirecionamento permanente.

Abra o arquivo do bloco de configuração do seu servidor novamente:

  • sudo nano /etc/apache2/sites-available/000-default.conf

Encontre a linha Redirect que adicionamos anteriormente. Adicione permanent a essa linha, que altera o redirecionamento de um redirecionamento 302 temporário para um redirecionamento 301 permanente:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://seu_domínio_ou_IP/"

        . . .
</VirtualHost>

Salve e feche o arquivo.

Verifique sua configuração quanto a erros de sintaxe:

  • sudo apache2ctl configtest

Se este comando não relatar erros de sintaxe, reinicie o Apache:

  • sudo systemctl restart apache2

Isso tornará o redirecionamento permanente, e seu site servirá apenas tráfego por HTTPS.

Conclusão

Você configurou o servidor Apache para usar criptografia forte para conexões de cliente. Isso permitirá que você atenda solicitações com segurança e impedirá que terceiros leiam seu tráfego.

Creative Commons License