quinta-feira, 10 de agosto de 2023

Instalar certificado SSL/TLS digital válido gratuito no Linux



INTRODUÇÃO

Um certificado SSL (Secure Sockets Layer) é um tipo de certificado digital que é usado para autenticar a identidade de um website e proteger a comunicação entre o website e os usuários que o acessam.

O SSL é um protocolo de segurança que criptografa a conexão entre o navegador do usuário e o servidor do website, garantindo que a informação enviada e recebida seja mantida privada e segura contra hackers e interceptações.

Os certificados SSL são emitidos por autoridades certificadoras confiáveis e contêm informações sobre o nome do proprietário do website, a validade do certificado e a chave pública usada para criptografar a conexão. Quando um usuário visita um site com um certificado SSL válido, seu navegador exibe um ícone de cadeado na barra de endereço para indicar que a conexão é segura.

Um certificado SSL (Secure Sockets Layer) é um certificado digital que criptografa e autentica a comunicação entre um navegador da web e um servidor da web. Ele é usado para proteger a privacidade dos usuários e garantir que as informações transmitidas entre o navegador e o servidor sejam seguras e privadas.

Os certificados SSL são usados em sites que lidam com informações confidenciais, como informações de login, informações de pagamento ou informações pessoais dos usuários. Eles ajudam a prevenir ataques de hackers e garantem que as informações não sejam interceptadas ou roubadas durante a transmissão.

Os certificados SSL são emitidos por autoridades certificadoras confiáveis e contêm informações sobre o proprietário do site, a data de validade do certificado e a chave pública usada para criptografar as informações. Quando um usuário visita um site com um certificado SSL válido, o navegador exibe um cadeado na barra de endereço, indicando que a conexão é segura. Isso transmite confiança e oferece garantia para quem está visitando o site.

O certificado que usaremos aqui será o da Let's Encrypt que utiliza a ferramenta Certbot para instalar o certificado.

O Certbot é uma ferramenta de software gratuita e de código aberto para usar automaticamente os certificados Let's Encrypt em sites administrados manualmente para habilitar o HTTPS.

O Certbot é feito pela Electronic Frontier Foundation (EFF), uma organização sem fins lucrativos 501(c)3 (501(c)3 é um item da legislação tributária norte-americana que trata de organizações sem fins lucrativos que têm direitos à isenção de impostos) com sede em San Francisco, CA, que defende a privacidade digital, a liberdade de expressão e a inovação.

O antigo protocolo SSL, atualmente TLS (Transport Layer Security), geralmente designado por SSL/TLS, começou a ser usado há quase 25 anos, sendo que a designação correta atual é TLS, mas as as iniciais SSL permaneceram, por isso a nova versão do protocolo ainda é comumente referida pelo antigo nome.

Muitos provedores de hospedagem possuem ferramentas internas para habilitar o HTTPS. Antes de usar o Certbot, verifique se o seu provedor de hospedagem é um deles .

Caso não utilize um provedor de hospedagem e tenha seu site hospedado num servidor em casa ou na sua empresa, então este artigo lhe será muito útil.

As distribuições testadas foram os Debian 10, 11 e 12 e o Ubuntu 22.04, todos no Apache2, porém, acredito que a instalação servirá para a maioria das distribuições.

INSTALANDO

Na própria página oficial do Certbot encontramos instruções de instalação para várias distribuições Linux:

Basta acessar a página, escolher o software (Apache, Nginx, etc) e escolher o sistema operacional e aparecerão instruções de instalação.

Contudo, a instalação aqui demonstrada procurou evitar as sugestões da página oficial, pois a maioria das instalações ali sugeridas pedem primeiro a instalação do Snapd, todavia, não utilizei o Snapd para evitar mais camadas intermediárias, entretanto, caso você queira, utilize o snap.

*** LEIA ATÉ O FINAL ANTES DE SAIR EXECUTANDO COMANDOS ***

Parece complicado, mas a sequência de comandos é curtinha. Optei por dar explicações a mais do que o necessário. Os comandos são utilizados como root ou sudo, se quiser, e devem ser executados na ordem abaixo:

# apt-get update
# apt-get install certbot python3-certbot-apache
# systemctl reload apache2
# apache2ctl configtest

Deverá aparecer Syntax Ok.

Agora antes de continuar dando o último comando veja o arquivo de configuração teu_site.conf (ou 000-default.conf ou com o nome que você deu) em /etc/apache2/sites-available e verifique se o parâmetro ServerName está com www, por exemplo: www.exemplo.com.br.

Se não estiver, coloque e dê um reload no Apache2 e teste abrindo o navegador.

Porém, depois colocando as configurações oferecidas na próxima página provavelmente não terá esse problema.

Agora escolha como você gostaria de executar o Certbot.

Execute o comando abaixo para obter um certificado e fazer com que o Certbot edite sua configuração do apache automaticamente ativando o acesso HTTPS em uma única etapa.

# certbot --apache

Ou apenas obtenha um certificado.

Se você se sentir mais conservador e quiser fazer as alterações na configuração do Apache manualmente, execute este comando:

# certbot certonly --apache
(dê preferência para este comando)

ou

# certbot certonly --apache -d exemplo.com.br -d www.exemplo.com.br

este comando já indica o domínio/site para o qual deve ser gerado o certificado.

Sugiro FORTEMENTE que utilizem o comando "certbot certonly --apache" porque vamos configurar o Apache2 manualmente, sendo que deixarei um exemplo de arquivo "meu_site.conf" que deverá ficar no diretório /etc/apache2/sites-available.

Com o comando "certbot --apache", sem certonly, a ferramenta realiza automaticamente as configurações dos arquivos e isso trouxe problemas com alguns programas como, por exemplo: o PgAdmin4-web perdeu o acesso a conexão com o servidor. Esse foi um dos softwares que saíram feridos na realização das instalações, mas eles passam bem no momento.

Tal fato aconteceu porque com o comando "certbot --apache" uma das perguntas que aparecem é esta:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Caso escolher a opção 1, para não redirecionar automaticamente todas as conexões para HTTPS você deverá configurar manualmente os redirects nos arquivos, porém, ainda assim o Certbot se mete em algumas outras configurações do Apache.

Caso escolher a opção 2, para redirecionar automaticamente todas as conexões e mesmo ali dizendo que você pode desfazer isso (You can undo this) editando seus arquivos de configurações do Apache, ainda assim não é uma boa opção, pois o Cerbot se entranha no Apache.

EXECUTE o comando:

# certbot certonly --apache

e responda algumas perguntas e forneça um e-mail.

Responda Yes para todas ou, se quiser, responda No para a pergunta que pede se a Electronic Frontier Foundation (EFF) pode compartilhar seu email para receber mensagens dela.

Aparecerá algo parecido com o que está abaixo:

Plugins selected: Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): seu@email.com.br

  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(A)gree/(C)ancel: A

  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom.
  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y

Com o comando certbot certonly --apache uma das perguntas que aparecerão a seguir é a pergunta que pede para escolher em qual site gerar o certificado.


O Certbot "pega" as informações do ServerName e do ServerAlias dos arquivos do Apache2, por exemplo:

ServerName www.exemplo.com.br:80
ServerAlias exemplo.com.br exemplo exemplo2

Segundo a documentação do Apache2 a sintaxe do ServerName é:

ServerName fully-qualified-domain-name[:port]

Ou seja, www.exemplo.com.br:80 ou seguido da porta utilizada, porém, na própria documentação diz que se não for colocada a porta o Apache2 procura a porta indicada no virtualhost.

Depois no arquivo de configuração veremos como isso se dá na prática e que colocar www.exemplo.com.br ou exemplo.com.br no ServerName faz muita diferença.

A sintaxe do ServerAlias é:

ServerAlias hostname hostname ...

<VirtualHost *>
ServerName server.domain.com
ServerAlias server server2.domain.com server2
# ...
</VirtualHost>

Caso o Certbot sugira duas opções de sites para instalar o certificado, por exemplo:

1. exemplo.com.br
2. www.exemplo.com.br

escolha sempre a opção com www e procure verificar no arquivo de configuração exemplo.conf em sites-available se o parâmetro ServerName está com www.

Caso ofereça somente uma opção escolha essa mesma, óbvio.

Depois seguirá:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for exemplo.conf
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/exemplo.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/exemplo.conf
Enabling available site: /etc/apache2/sites-available/exemplo.conf

  • - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations! You have successfully enabled https://www.exemplo.com.br

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/www.exemplo.com.br/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/www.exemplo.com.br/privkey.pem
Your cert will expire on 2019-10-24. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Lets Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Em /etc/letsencrypt/live/www.exemplo.com.br/fullchain.pem está o caminho para o certificado.

Em /etc/letsencrypt/live/www.exemplo.com.br/privkey.pem está o caminho para a chave.

Resumindo a sequência de comandos:

# apt-get update
# apt-get install certbot python3-certbot-apache
# systemctl reload apache2
# apache2ctl configtest
# certbot certonly --apache

Veremos a seguir a configuração do arquivo meu_site.conf que fica em /etc/apache2/sites-available.


CONFIGURANDO

RENOVAÇÃO DOS CERTIFICADOS
O certificado auto-assinado é válido por 90 dias. No entanto, este pode ser renovado quando estiver prestes a expirar nos últimos 30 dias.

RENOVAÇÃO MANUAL
O processo de renovação dos certificados Let's Encrypt é facilitado pelo certbot que reutiliza os parâmetros usados na criação do certificado.

Os certificados são renovados apenas se estiverem prestes a expirar.

Caso tente renovar antes do término do prazo de 90 dias dará um aviso de que não foi possível renovar:

# certbot renew

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-----------------------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/exemplo.com.conf
-----------------------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
/etc/letsencrypt/live/home.example.com/fullchain.pem (skipped)
No renewals were attempted.

----------------------------------------------------------------------------------------------

Antes de renovar pode fazer uma simulação com:

# certbot renew --dry-run

RENOVAÇÃO AUTOMÁTICA
Opcionalmente, pode-se criar uma tarefa agendada no Cron para proceder à renovação automática dos certificados quando estes estiverem prestes a expirar.

Durante a instalação o certbot configura essa tarefa de forma automática.

Você pode vislumbrar o arquivo com:

# vim /etc/cron.d/certbot
* ou use teu editor de texto predileto.

# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

Para adicionar um domínio:
# certbot-auto --expand -d dominio1.com.br,dominio2.com.br

Para deletar um certificado:
# certbot revoke --cert-path /etc/letsencrypt/live/www.exemplo.com/fullchain.pem

Para ver o status e se o certificado está ativo e ver informações como data, etc:
# systemctl status certbot.timer

Arquivo meu_site.conf:
# cd /etc/apache2/sites-available
# vim meu_site.conf

Lembrando que o arquivo meu_site.conf você já deverá tê-lo criado na instalação e configuração do Apache2.

Aqui chamaremos de exemplo.conf.
# vim exemplo.conf

Coloque o seguinte dentro do arquivo e/ou adapte para as tuas configurações:

<VirtualHost *:80>
   ServerName www.exemplo.com.br
   ServerAlias exemplo.com.br
   Redirect permanent / https://www.exemplo.com.br/
   # ErrorLog ${APACHE_LOG_DIR}/www.exemplo.com.br/www-error.log
   # CustomLog ${APACHE_LOG_DIR}/www.exemplo.com.br/www-access.log combined
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
#
<VirtualHost _default_:443>
   ServerName exemplo.com.br
   Redirect permanent / https://www.exemplo.com.br/
   SSLProxyEngine on
   SSLEngine on
   SSLCertificateFile        /etc/letsencrypt/live/www.exemplo.com.br/cert.pem
   SSLCertificateKeyFile /etc/letsencrypt/live/www.exemplo.com.br/privkey.pem
   SSLCaCertificateFile   /etc/letsencrypt/live/www.exemplo.com.br/fullchain.pem
</VirtualHost>
#
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin admin@exemplo.com.br
                ServerName www.exemplo.com.br
                DocumentRoot /var/www/exemplo.com.br
                SSLEngine on
    SSLCertificateFile        /etc/letsencrypt/live/www.exemplo.com.br/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.exemplo.com.br/privkey.pem
    SSLCaCertificateFile   /etc/letsencrypt/live/www.exemplo.com.br/fullchain.pem
                <FilesMatch ".(cgi|shtml|phtml|php)$">
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                </Directory>
                BrowserMatch "MSIE [2-6]"
                                nokeepalive ssl-unclean-shutdown
                                downgrade-1.0 force-response-1.0
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
        </VirtualHost>
</IfModule>

Coloque teu site no lugar de www.exemplo.com.br e acrescente as tuas configurações no arquivo, se quiser. Salve e saia do arquivo e execute:

Para criar um link com sites-enabled, se já não tiver:
# a2ensite exemplo.conf

Para dar um reload nas configurações:
# systemctl reload apache2

Para reiniciar o Apache2:
# systemctl restart apache2

Teste abrindo o navegador e digitando na barra de endereços:

www.exemplo.com.br

e verá teu site abrir com HTTPS e o cadeado ao lado.

Caso isso não aconteça ou que apareça aquela página escrota de "site não confiável", certificado inválido, etc, pode ser que seja a tua primeira vez com o Certbot, então acesse o e-mail que tu cadastrou na instalação e clique no link do e-mail enviado pelo Certbot para ativar. As vezes é necessário, as vezes não.

Repare que temos três linhas:

SSLCertificateFile         /etc/letsencrypt/live/exemplo.com.br/cert.pem
SSLCertificateKeyFile  /etc/letsencrypt/live/exemplo.com.br/privkey.pem
SSLCaCertificateFile    /etc/letsencrypt/live/exemplo.com.br/fullchain.pem

  • SSLCertificateFile - arquivo de dados de certificado X.509 codificado por PEM do servidor ou identificador de token; aponta para um arquivo com os dados do certificado.
  • SSLCertificateKeyFile - arquivo de chave privada codificado por PEM do servidor; aponta para o arquivo de chave privada.
  • SSLCaCertificateFile - arquivo de certificados CA codificados por PEM concatenados para autenticação do cliente; define o arquivo tudo-em-um onde são montados os Certificados das Autoridades Certificadoras (CA).

PEM - significa Privacy Enhanced Mail (E-mails reforçados para privacidade). O formato PEM é frequentemente usado para representar certificados, solicitações de certificado, cadeias de certificados e chaves. A extensão típica para um arquivo formatado como PEM é . pem, mas não precisa ser. É usado para estabelecer um canal de comunicação seguro entre um servidor da Web e um navegador. É codificado em Base64 e pode conter uma chave privada, certificado de servidor e/ou uma combinação de outros certificados.

Grosso modo, PEM é um formato de arquivo contêiner que define a estrutura e o tipo de codificação do arquivo usado para armazenar os dados.

A linha repetida nos VirtualHosts 80 e 443:

Redirect permanent / https://www.exemplo.com.br/

fazem o redirecionamento de todas as conexões HTTP para HTTPS, ou seja, se alguém acessar teu site com http://www.exemplo.com.br será sempre automaticamente redirecionado para https://www.exemplo.com.br.

Caso tiver arquivos 000-default.conf aconselho a executar:
# mv 000-default.conf 000-default.conf.bkp

As linhas ServerName e ServerAlias deixe-as como estão.

Pode testar colocando ServerName e ServerAlias, os dois somente com www.exemplo.com.br ou com exemplo.com.br e verá que teu site poderá ficar lento ou aparecer o erro ERR_CONNECTION_REFUSED. O Apache é um cara bem sensível.

As linhas com BrowserMatch, pesquise no link com mod_setenvif abaixo.

A título de curiosidade, no arquivo README.Debian.gz do Apache2 encontramos informações interessantíssimas.

Caminho no Debian, procure o caminho na tua distribuição:
# vim /usr/share/doc/apache2/README.Debian.gz


REFERÊNCIAS

Nenhum comentário:

Postar um comentário