Uma versão anterior deste tutorial foi escrita por Justin Ellingwood.
O TLS, ou segurança de camada de transporte e seu antecessor, o SSL, que significa camada de socket segura, são protocolos Web usados para envolver o tráfego normal em um pacote protegido e criptografado.
Ao usar essa tecnologia, os servidores podem enviar tráfego com segurança entre servidores e clientes sem a possibilidade de mensagens serem interceptadas por agentes externos. O sistema de certificados também ajuda os usuários a verificar a identidade dos sites com os quais eles estão se conectando.
Neste guia, mostraremos como configurar um certificado SSL autoassinado para uso com um servidor Web Apache no Ubuntu 18.04.
Nota: um certificado autoassinado irá criptografar a comunicação entre seu servidor e qualquer cliente. No entanto, uma vez que ele não está assinado por nenhuma das autoridades de certificados confiáveis incluídas com 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 para instâncias onde uma interface Web criptografada não seja voltada para o usuário. Se você tiver de fato um nome de domínio, em muitos casos é melhor usar um certificado assinado por CA. Você pode descobrir como configurar um certificado de confiança gratuito com o projeto Let’s Encrypt aqui
Antes de começar, você deve ter um usuário não-raiz configurado com privilégios sudo
. Você pode aprender como configurar esse tipo de usuário seguindo nossa Configuração inicial de servidor com o Ubuntu 18.04.
Você também precisará ter o servidor Web Apache instalado. Se você quiser instalar uma pilha LAMP (Linux, Apache, MySQL, PHP) inteira no seu servidor, você pode seguir nosso guia sobre como configurar o LAMP no Ubuntu 18.04. Se você quiser apenas o servidor web Apache, pule os passos referentes ao PHP e MySQL.
Quando tiver completado os pré-requisitos, continue abaixo.
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 para clientes. O certificado SSL é compartilhado publicamente com qualquer um que solicitar o conteúdo. Ele pode ser usado para decifrar o conteúdo assinado pela chave SSL associada.
Podemos criar um par chave autoassinada e certificado 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
Uma séria de questões será feita a você. Antes de passarmos por isso, vamos ver o que está acontecendo no comando que estamos emitindo:
rsa:2048
diz a ele para criar uma chave RSA que seja de 2048 bits.Como mostrado acima, essas opções criarão tanto um arquivo de chave como um certificado. Algumas perguntas sobre nosso servidor serão feitas para incorporar as informações corretamente no certificado.
Preencha os prompts devidamente. A linha mais importante é aquela que solicita o Nome comum (por exemplo, o servidor FQDN ou o SEU nome)
. Você precisa digitar o nome do domínio associado ao seu servidor ou, mais provável, o endereço IP público do seu servidor.
A totalidade dos prompt se parecerá com isto:
OutputCountry 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) []:server_IP_address
Email Address []:admin@your_domain.com
Ambos os arquivos que você criou serão colocados nos subdiretórios apropriados em /etc/ssl
.
Criamos nossos arquivos de chave e certificado no diretório /etc/ssl
. Agora, precisamos modificar nossa configuração do Apache para aproveitarmos melhor o mesmo.
Vamos fazer alguns ajustes na nossa configuração:
Quando terminarmos, devemos ter uma configuração SSL segura.
Primeiro, vamos criar um snippet de configuração do Apache que defina algumas configurações do SSL. Isso irá configurar o Apache com uma série de criptografia SSL forte e habilitar algumas funcionalidades avançadas que irão ajudar a manter nosso servidor seguro. Os parâmetros que vamos definir podem ser usados por qualquer Host Virtual habilitando o SSL.
Crie um novo snippet no diretório /etc/apache2/conf-available
. Vamos nomear o arquivo ssl-params.conf
para deixar seu objetivo claro:
- sudo nano /etc/apache2/conf-available/ssl-params.conf
Para configurar o Apache SSL com segurança, utilizaremos as recomendações de Remy van Elst presentes no site Cipherli.st. Este site foi projetado para fornecer configurações de criptografia de fácil acesso para softwares populares.
[<$>note ]As configurações sugeridas no site mostrado acima oferecem uma segurança robusta. De vez em quando, isso acontece ao custo de maior compatibilidade com o cliente. Se você precisa dar suporte a clientes antigos, existe uma lista alternativa que pode ser acessada clicando no link na página rotulada “Sim, dê-me uma criptografia que funciona com o software legado / velho.” Essa lista pode ser substituída pelos itens copiados abaixo.
A escolha de qual configuração você usa dependerá em grande parte do que você precisa suportar. Ambas fornecerão uma ótima segurança. <$>
Para nossos propósitos, podemos copiar as configurações fornecidas em sua totalidade. Vamos fazer apenas uma pequena mudança. Vamos desativar o cabeçalho Strict-Transport-Security
(HSTS).
O pré-carregamento do HSTS proporciona maior segurança, mas pode ter consequências consideráveis se for habilitado acidentalmente ou de maneira incorreta. Neste guia, não habilitaremos essas configurações, mas você pode modificar isso caso tenha certeza de que você entenda as implicações.
Antes de decidir, leia com cuidado Segurança de transporte estrito HTTP, ou HSTS, mais especificamente sobre a funcionalidade “pré-carregamento”
Cole a configuração no arquivo ssl-params.conf
que abrimos:
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 você terminar.
Em seguida, vamos modificar o /etc/apache2/sites-available/default-ssl.conf
, o arquivo padrão de Host Virtual SSL do Apache Se estiver usando um arquivo de bloco de servidor diferente, substitua seu nome nos comandos abaixo.
Antes de continuar, vamos voltar para o arquivo de Host Virtual SSL original:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
Agora, abra o arquivo de Host Virtual SSL para fazer ajustes:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
Dentro, com a maioria dos comentários removidos, o arquivo de Host Virtual deve se parecer com isso por padrão:
<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>
Vamos fazer alguns pequenos ajustes no arquivo. Vamos definir as coisas normais que gostaríamos de ajustar em um arquivo de Host Virtual (endereço de e-mail do ServerAdmin, ServerName, etc., e ajustar as diretivas do SSL para que apontem para nossos arquivos de certificado e chave.
Após fazer essas alterações, seu bloco de servidor deve se parecer com este:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin your_email@example.com
ServerName server_domain_or_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 você terminar.
Da forma em que se encontra, o servidor fornecerá tanto tráfego HTTP não criptografado quanto HTTPS criptografado. Para maior segurança, é recomendável redirecionar na maioria dos casos o HTTP para HTTPS automaticamente. Se não quiser ou precisar dessa funcionalidade, você pode pular essa seção com segurança.
Para ajustar o arquivo de Host Virtual não criptografado para redirecionar todo o tráfego a ser criptografado pelo SSL, podemos abrir o arquivo /etc/apache2/sites-available/000-default.conf
:
- sudo nano /etc/apache2/sites-available/000-default.conf
Lá, dentro dos blocos de configuração VirtualHost
, precisamos adicionar uma diretiva Redirect
, que direciona todo o tráfego para a versão SSL do site:
<VirtualHost *:80>
. . .
Redirect "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
Salve e feche o arquivo quando você terminar.
Se você tem o firewall ufw
ativado, conforme recomendado pelos guias de pré-requisitos, pode ser necessário ajustar as configurações para permitir o tráfego SSL. Felizmente, o Apache registra alguns perfis com o ufw
na instalação.
Podemos ver os perfis disponíveis digitando:
- sudo ufw app list
Você deve ver uma lista como essa:
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
Você pode verificar a configuração atual digitando:
- sudo ufw status
Se você permitiu apenas o tráfego HTTP regular mais cedo, seu resultado pode se parecer com este:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
Para também admitir o tráfego HTTPS, podemos permitir o perfil “Apache Full” e então excluir a permissão de perfil redundante “Apache”:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
Agora, seu status deve se parecer com este:
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
Agora que fizemos nossas alterações e ajustamos nosso firewall, é possível habilitar os módulos SSL e de cabeçalhos no Apache, habilitar nosso Host Virtual pronto para o SSL e reiniciar o Apache.
Podemos habilitar o mod_ssl
, o módulo SSL do Apache e o mod_headers
, necessário para algumas das configurações no nosso snippet SSL, com o comando a2enmod
:
- sudo a2enmod ssl
- sudo a2enmod headers
Em seguida, podemos habilitar nosso Host Virtual SSL com o comando a2ensite
:
- sudo a2ensite default-ssl
Também precisaremos habilitar nosso arquivo ssl-params.conf
, para que leia nos valores que definirmos:
- sudo a2enconf ssl-params
Neste ponto, nosso site e os módulos necessários estão habilitados. Devemos verificar e garantir que não haja erros de sintaxe em nossos arquivos. Podemos fazer isso digitando:
- sudo apache2ctl configtest
Se tudo for bem-sucedido, você receberá um resultado que se parecerá com este:
OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
A primeira linha é apenas uma mensagem informando que a diretiva ServerName
não está definida globalmente. Se você quiser se livrar dessa mensagem, é possível definir o ServerName
como o nome do domínio do seu servidor ou o endereço IP em /etc/apache2/apache2.conf
. Isso é opcional, uma vez que a mensagem não causará problemas.
Se seu resultado tiver Syntax OK
, seu arquivo de configuração não possui erros de sintaxe. Podemos reiniciar com segurança o Apache para implementar nossas alterações:
- sudo systemctl restart apache2
Agora, estamos prontos para testar nosso servidor SSL.
Abra seu navegador Web e digite https://
seguido pelo nome do domínio ou endereço IP do seu servidor na barra de endereço:
https://server_domain_or_IP
Pelo fato do certificado que criamos não ser assinado por uma das autoridades de certificado confiáveis do seu navegador, você provavelmente verá um aviso assustador como o que está abaixo:
Isso é esperado e é normal. Só estamos interessados no aspecto de criptografia do nosso certificado, não na validação de terceiros da autenticidade do nosso host. Em todo caso, clique em “ADVANCED” e então no link fornecido para prosseguir para seu host:
Você deve ser levado para seu site. Se você olhar na barra de endereço do navegador, será possível ver um cadeado com um “x” sobre ele. Neste caso, isso significa apenas que o certificado não pode ser validado. Ela ainda está criptografando sua conexão.
Se você configurou o Apache para redirecionar HTTP para HTTPS, também é possível verificar se o redirecionamento está funcionando corretamente:
http://server_domain_or_IP
Se o resultado for o mesmo ícone, isso significa que seu redirecionamento funcionou corretamente.
Se seu redirecionamento funcionou corretamente e você tem certeza de que quer permitir apenas o tráfego criptografado, você deve modificar novamente o Host Virtual do Apache não criptografado para tornar o redirecionamento permanente.
Abra mais uma vez o arquivo de configuração do bloco do seu servidor:
- sudo nano /etc/apache2/sites-available/000-default.conf
Encontre a linha Redirect
que adicionamos mais cedo. Adicione permanent
a essa linha. Isso muda o redirecionamento de uma redirecionamento temporário 302 para um redirecionamento permanente 301:
<VirtualHost *:80>
. . .
Redirect permanent "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
Salve e feche o arquivo.
Verifique sua configuração quanto a erros de sintaxe:
- sudo apache2ctl configtest
Quando estiver pronto, reinicie o Apache para tornar o redirecionamento permanente:
- sudo systemctl restart apache2
Você configurou seu servidor Apache para usar uma criptografia robusta para conexões com clientes. Isso permitirá que você atenda aos pedidos com segurança e impedirá que agentes externos leiam seu tráfego.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Eu tenho vários sites de teste que ficam assim “localhost/site”. Quando eu ativo o redirecionamento eu não consigo acessar os sites, mas quando eu desativo o redirecionamento para usar SSL, eu consigo acessar, inclusive colocando o “https” na frente, tem como dar uma luz quanto a esse problema???
Muito bom! Seria possível acessar sem aparecer a mensagem “Sua conexão não é particular”? Visto que isso é um incomodo para certas aplicações como Zabbix por exemplo (meu caso), ele fica offline a todo momento e precisa ficar atualizando e aceitando os “riscos”.