Como Criar um Certificado SSL Auto-Assinado para o Apache no Ubuntu 16.04
Introdução
TLS, ou segurança da camada de transporte, e seu antecessor, o SSL, que significa secure sockets layer, são protocolos da web usada para encapsular tráfego normal em um criptografado e protegido wrapper.
usando essa tecnologia, os servidores podem enviar tráfego com segurança entre o servidor e os clientes sem a possibilidade de as mensagens serem interceptadas por terceiros. O sistema de certificados também ajuda os usuários a verificar a identidade dos sites com os quais estão se conectando.
neste guia, mostraremos como configurar um certificado SSL autoassinado para uso com um servidor web Apache em um servidor Ubuntu 16.04.
nota: um certificado autoassinado criptografará a comunicação entre seu servidor e quaisquer clientes. No entanto, como não é assinado por nenhuma das autoridades de certificação confiáveis incluídas nos navegadores da 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 casos em que a interface da web criptografada não seja voltada para o usuário. Se você tiver um nome de domínio, em muitos casos é melhor usar um certificado assinado pela CA. Você pode descobrir como configurar um certificado confiável gratuito com o projeto Let’s Encrypt aqui.
pré-Requisitos
Antes de começar, você deve ter um usuário não-root configurado com sudo
privilégios. Você pode aprender como configurar essa conta de usuário seguindo nossa configuração inicial do servidor para o Ubuntu 16.04.
você também precisará ter o servidor web Apache instalado. Se você gostaria de instalar uma pilha LAMP inteira (Linux, Apache, MySQL, PHP) em seu servidor, você pode seguir nosso guia sobre como configurar LAMP no Ubuntu 16.04. Se você quiser apenas o servidor web Apache, pule as etapas relativas ao PHP e MySQL no Guia.
quando você tiver concluído os pré-requisitos, continue abaixo.
Passo 1: Crie o certificado SSL
TLS/SSL funciona usando uma combinação de um certificado público e uma chave privada. A chave SSL é mantida em segredo no servidor. Ele é usado para criptografar 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 um par de chaves e certificados autoassinados com 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 uma série de perguntas. Antes de examinarmos isso, vamos dar uma olhada no que está acontecendo no comando que estamos emitindo:
- openssl: esta é a ferramenta básica de linha de comando 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 que o SSL e o TLS seguem para seu gerenciamento de chaves e certificados. Queremos criar um novo X. 509 cert, então estamos usando este subcomando.
- – x509: Isso modifica ainda mais o subcomando anterior, informando ao utilitário que queremos fazer um certificado autoassinado em vez de gerar uma solicitação de assinatura de certificado, como normalmente aconteceria.
- – nós: isso diz ao OpenSSL para pular a opção de proteger nosso certificado com uma senha. Precisamos do Apache para poder ler o arquivo, sem intervenção do usuário, quando o servidor é iniciado. Uma senha evitaria que isso acontecesse porque teríamos que inseri-la após cada reinicialização.
- -dias 365: Esta opção define o período de tempo que o certificado será considerado válido. Nós definimos isso por 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á-lo junto com o certificado. A parte
rsa:2048
diz para fazer uma chave RSA com 2048 bits de comprimento. - – keyout: esta linha informa ao OpenSSL onde colocar o arquivo de chave privada gerado que estamos criando.
- -para fora: 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 o nosso servidor, a fim de incorporar as informações corretamente no certificado.
preencha os prompts adequadamente. A linha mais importante é aquela que solicita o Common Name (e.g. server FQDN or YOUR name)
. Você precisa inserir o nome de domínio associado ao seu servidor ou, mais provavelmente, o endereço IP público do seu servidor.
a totalidade dos prompts será semelhante a isso:
OutputCountry Name (2 letter code) :USState or Province Name (full name) :New YorkLocality Name (eg, city) :New York CityOrganization Name (eg, company) :Bouncy Castles, Inc.Organizational Unit Name (eg, section) :Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) :server_IP_addressEmail Address :admin@your_domain.com
ambos os arquivos criados serão colocados nos subdiretórios apropriados do diretório /etc/ssl
.
enquanto estamos usando OpenSSL, também devemos criar um forte grupo Diffie-Hellman, que é usado na negociação de sigilo perfeito para a frente com os clientes.
podemos fazer isso digitando:
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
isso pode levar alguns minutos, mas quando terminar, você terá um grupo DH forte em /etc/ssl/certs/dhparam.pem
que podemos usar em nossa configuração.Etapa 2: Configure 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 aproveitar isso.
faremos alguns ajustes em nossa configuração:
- criaremos um trecho de configuração para especificar configurações SSL padrão fortes.
- modificaremos o arquivo de Host virtual SSL Apache incluído para apontar para nossos certificados SSL gerados.
- (recomendado) modificaremos o arquivo de Host Virtual não criptografado para redirecionar automaticamente as solicitações para o Host virtual criptografado.
quando terminarmos, devemos ter uma configuração SSL segura.
crie um Snippet de configuração do Apache com configurações de criptografia fortes
primeiro, criaremos um snippet de configuração do Apache para definir algumas configurações SSL. Isso configurará o Apache com um pacote de criptografia SSL forte e habilitará alguns recursos avançados que ajudarão a manter nosso servidor seguro. Os parâmetros que definiremos podem ser usados por qualquer host Virtual que habilite o SSL.
crie um Novo snippet no diretório /etc/apache2/conf-available
. Nomearemos o arquivo ssl-params.conf
para tornar seu propósito claro:
- 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 Cipherli.st site. Este site foi projetado para fornecer configurações de criptografia fáceis de consumir para softwares populares. Você pode ler mais sobre suas decisões sobre as escolhas Apache aqui.
as configurações sugeridas no site vinculadas acima oferecem forte segurança. Às vezes, isso custa uma maior compatibilidade com o cliente. Se você precisar oferecer suporte a clientes mais antigos, há uma lista alternativa que pode ser acessada clicando no link na página rotulada “sim, me dê um ciphersuite que funciona com software legado / antigo.”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. Ambos proporcionarão grande segurança.
para nossos propósitos, podemos copiar as configurações fornecidas na íntegra. Faremos apenas duas pequenas mudanças.
defina a diretiva SSLOpenSSLConfCmd DHParameters
para apontar para o arquivo Diffie-Hellman que geramos anteriormente. Além disso, reserve um momento para ler sobre HTTP Strict Transport Security, ou HSTS, e especificamente sobre a funcionalidade “pré-carga”. O pré-carregamento do HSTS fornece maior segurança, mas pode ter consequências de longo alcance se acidentalmente ativado ou ativado incorretamente. Neste guia, não vamos pré-carregar as configurações, mas você pode modificar isso se tiver certeza de que entende as implicações:
# from https://cipherli.st/# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.htmlSSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol All -SSLv2 -SSLv3SSLHonorCipherOrder 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 Strict-Transport-Security "max-age=63072000; includeSubdomains"Header always set X-Frame-Options DENYHeader always set X-Content-Type-Options nosniff# Requires Apache >= 2.4SSLCompression off SSLSessionTickets OffSSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)"SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
Salve e feche o arquivo quando terminar.
modifique o arquivo de Host virtual Apache SSL padrão
em seguida, vamos modificar /etc/apache2/sites-available/default-ssl.conf
, o arquivo de Host virtual Apache SSL padrão. Se você estiver usando um arquivo de bloco de servidor diferente, substitua seu nome nos comandos abaixo.
Antes de irmos adiante, vamos voltar o original SSL Virtual Host do arquivo:
- sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
Agora, abra o SSL Virtual Host do arquivo para fazer ajustes:
- sudo nano /etc/apache2/sites-available/default-ssl.conf
no Interior, com a maioria dos comentários removidos, o Virtual Host do arquivo deve se parecer com algo como 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> # BrowserMatch "MSIE " \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>
faremos alguns pequenos ajustes no arquivo. Vamos definir as coisas normais que gostaríamos de ajustar em um arquivo de Host Virtual (ServerAdmin endereço de E-mail, ServerName, etc.), ajuste as diretivas SSL para apontar para nossos arquivos de certificado e chave e descomente uma seção que fornece compatibilidade para navegadores mais antigos.
depois de fazer essas alterações, seu bloco de servidor deve ser semelhante a este:
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin [email protected] 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> BrowserMatch "MSIE " \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>
Salve e feche o arquivo quando terminar.
(recomendado) modifique o arquivo de Host Virtual não criptografado para redirecionar para HTTPS
como está agora, o servidor fornecerá tráfego HTTP não criptografado e HTTPS criptografado. Para uma melhor segurança, recomenda-se, na maioria dos casos, redirecionar HTTP para HTTPS automaticamente. Se você não quiser ou precisar dessa funcionalidade, poderá pular esta seção com segurança.
para ajustar o arquivo de Host Virtual não criptografado para redirecionar todo o tráfego para ser criptografado por SSL, podemos abrir o arquivo /etc/apache2/sites-available/000-default.conf
:
- sudo nano /etc/apache2/sites-available/000-default.conf
dentro, dentro dos blocos de configuração VirtualHost
, só precisamos adicionar uma diretivaRedirect
, apontando 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 terminar.Etapa 3: Ajuste o Firewall
se você tiver o firewall ufw
ativado, conforme recomendado pelos guias de pré-requisito, talvez seja necessário ajustar as configurações para permitir o tráfego SSL. Felizmente, o Apache registra alguns perfis com ufw
após a instalação.
podemos ver os perfis disponíveis digitando:
- sudo ufw app list
Você deve ver uma lista como esta:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
Você pode ver a configuração atual digitando:
- sudo ufw status
Se você permitida somente regular o tráfego HTTP anterior, a saída pode ter esta aparência:
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)
Para além disso, deixe no tráfego de HTTPS, podemos permitir que o “Apache Completo” perfil e, em seguida, eliminar a redundância “Apache” perfil de subsídio de:
- sudo ufw allow 'Apache Full'
- sudo ufw delete allow 'Apache'
Seu estado deve olhar como este agora:
- sudo ufw status
OutputStatus: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
Passo 4: Agora que fizemos nossas alterações e ajustamos nosso firewall, podemos habilitar os módulos SSL e headers no Apache, habilitar nosso Host virtual pronto para SSL e reiniciar o Apache.
podemos habilitar mod_ssl
, o módulo Apache SSL, e mod_headers
, necessário por algumas das definições em nossa SSL trecho, com a a2enmod
comando:
- sudo a2enmod ssl
- sudo a2enmod headers
Junto, nós podemos permitir que nossos SSL Virtual Host com o a2ensite
comando:
- sudo a2ensite default-ssl
Nós também irá necessitar de activar o nosso ssl-params.conf
arquivo, para ler no conjunto de valores que:
- sudo a2enconf ssl-params
neste ponto, nosso site e os módulos necessários estão habilitados. Devemos verificar se não há erros de sintaxe em nossos arquivos. Podemos fazer isso digitando:
- sudo apache2ctl configtest
se tudo for bem sucedido, você obterá um resultado parecido 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 messageSyntax OK
a primeira linha é apenas uma mensagem informando que a diretiva ServerName
não está definida globalmente. Se você quiser se livrar dessa mensagem, você pode definir ServerName
para o nome de domínio ou endereço IP do seu servidor em /etc/apache2/apache2.conf
. Isso é opcional, pois a mensagem não fará mal.
se sua saída tiver Syntax OK
, seu arquivo de configuração não terá erros de sintaxe. Podemos reiniciar o Apache com segurança para implementar nossas alterações:
- sudo systemctl restart apache2
Etapa 5: Teste A criptografia
agora, estamos prontos para testar nosso servidor SSL.
abra seu navegador da web e digite https://
seguido pelo nome de domínio ou IP do seu servidor na barra de endereços:
https://server_domain_or_IP
como o certificado que criamos não é 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:
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, o link fornecido para prosseguir para o seu host de qualquer maneira:
você deve ser levado para o seu site. Se você olhar na barra de endereços do navegador, verá um bloqueio com um “x” sobre ele. 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, você também pode verificar se o redirecionamento funciona corretamente:
http://server_domain_or_IP
Se isso resulta no mesmo ícone, isto significa que sua redirecionar funcionou corretamente.
Etapa 6: mude para um redirecionamento permanente
se o redirecionamento funcionou corretamente e você tem certeza de que deseja permitir apenas tráfego criptografado, você deve modificar o Host virtual Apache não criptografado novamente para tornar o redirecionamento permanente.
abra o arquivo de configuração do bloco do 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 temporário 302 para um redirecionamento permanente 301:
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
Salve e feche o arquivo.
Verifique a sua configuração erros de sintaxe:
- sudo apache2ctl configtest
Quando você estiver pronto, reinicie o Apache para fazer o redirecionamento permanente:
- sudo systemctl restart apache2
Conclusão
Você tiver configurado o seu servidor Apache para usar a 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.