Este guia orienta você na instalação de um certificado SSL no Apache HTTP Server usando mod_ssl — desde o upload dos arquivos até configurações TLS reforçadas e solução de erros comuns. Funciona com certificados do GetHTTPS, Certbot ou qualquer CA.
Se você ainda não tem um certificado, obtenha um gratuitamente em 5 minutos.
Pré-requisitos
- Apache 2.4+ instalado e servindo seu site em HTTP (porta 80)
- Acesso root/sudo ao servidor
- Arquivos do certificado — o Apache precisa de três arquivos separados:
cert.pem— seu certificado (apenas a entidade final)privkey.pem— sua chave privadachain.pem— cadeia de certificados CA intermediários
Por que três arquivos? Diferente do Nginx (que usa um único
fullchain.pem), o Apache tradicionalmente espera o certificado e a cadeia como arquivos separados. O Apache 2.4.8+ pode usarfullchain.pememSSLCertificateFilee pularSSLCertificateChainFile. Detalhes de formato →
Passo 1: Fazer upload dos arquivos do certificado
# Criar um diretório seguro
sudo mkdir -p /etc/ssl/gethttps
# Copiar os arquivos para o servidor
sudo cp cert.pem chain.pem privkey.pem /etc/ssl/gethttps/
# Proteger a chave privada
sudo chmod 600 /etc/ssl/gethttps/privkey.pem
sudo chmod 644 /etc/ssl/gethttps/cert.pem /etc/ssl/gethttps/chain.pem
sudo chown root:root /etc/ssl/gethttps/*
Se estiver transferindo via SCP:
scp cert.pem chain.pem privkey.pem user@your-server:/tmp/
# No servidor:
sudo mv /tmp/{cert,chain,privkey}.pem /etc/ssl/gethttps/
Passo 2: Habilitar os módulos necessários do Apache
# Debian/Ubuntu
sudo a2enmod ssl # Módulo SSL principal
sudo a2enmod headers # Para HSTS e cabeçalhos de segurança
sudo a2enmod rewrite # Para redirecionamento HTTP→HTTPS (se usar .htaccess)
sudo systemctl restart apache2
# CentOS/RHEL/Amazon Linux
sudo yum install mod_ssl # Geralmente instala e habilita em um passo
sudo systemctl restart httpd
Verificar se o mod_ssl está carregado:
apachectl -M | grep ssl
# Esperado: ssl_module (shared)
Passo 3: Configurar o VirtualHost HTTPS
Crie ou edite a configuração SSL do seu site. No Debian/Ubuntu, isso normalmente fica em /etc/apache2/sites-available/yourdomain-ssl.conf:
# ─── Servidor HTTPS ────────────────────────────
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
# Arquivos do certificado
SSLEngine on
SSLCertificateFile /etc/ssl/gethttps/cert.pem
SSLCertificateKeyFile /etc/ssl/gethttps/privkey.pem
SSLCertificateChainFile /etc/ssl/gethttps/chain.pem
# Protocolo TLS — apenas 1.2 e 1.3
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder off
SSLCompression off
# OCSP stapling (verificação de certificado mais rápida para clientes)
SSLUseStapling on
SSLStaplingCache "shmcb:/var/run/apache2/ssl_stapling(128000)"
# Cabeçalhos de segurança
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
# Seu site
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
</Directory>
</VirtualHost>
# ─── Redirecionamento HTTP ───────────────────────────
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
O que cada diretiva faz:
| Diretiva | Finalidade |
|---|---|
SSLEngine on | Habilita SSL/TLS para este VirtualHost |
SSLCertificateFile | Caminho para o seu certificado |
SSLCertificateKeyFile | Caminho para a sua chave privada |
SSLCertificateChainFile | Caminho para o certificado CA intermediário |
SSLProtocol | Apenas TLS 1.2/1.3 — versões antigas descontinuadas |
SSLHonorCipherOrder off | Permite que o cliente escolha o melhor cipher |
SSLCompression off | Previne ataque CRIME |
SSLUseStapling | O servidor busca antecipadamente a resposta OCSP |
Strict-Transport-Security | HSTS — navegadores lembram de sempre usar HTTPS |
Redirect permanent | Redirecionamento 301 HTTP → HTTPS |
Passo 4: Habilitar o site e testar
# Debian/Ubuntu
sudo a2ensite yourdomain-ssl.conf
sudo apachectl configtest # Deve dizer "Syntax OK"
sudo systemctl reload apache2
# CentOS/RHEL
sudo apachectl configtest
sudo systemctl reload httpd
Se o configtest reportar um erro, ele informa a linha exata — corrija antes de recarregar.
Passo 5: Verificar
Navegador: Visite https://yourdomain.com. Clique no cadeado → verifique “Let’s Encrypt” como emissor.
Linha de comando:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
Online: Use o SSL Labs Server Test para uma avaliação abrangente. Meta: A ou A+.
Apache vs Nginx: diferenças nos arquivos de certificado
| Apache | Nginx | |
|---|---|---|
| Certificado | SSLCertificateFile cert.pem | ssl_certificate fullchain.pem |
| Chave privada | SSLCertificateKeyFile privkey.pem | ssl_certificate_key privkey.pem |
| Cadeia | SSLCertificateChainFile chain.pem | Incluída em fullchain.pem |
| Arquivos necessários | 3 arquivos separados | 2 arquivos (cadeia combinada) |
O Apache 2.4.8+ também pode usar o fullchain.pem combinado em SSLCertificateFile — nesse caso, você pode omitir SSLCertificateChainFile.
Renovação
Quando seu certificado estiver próximo do vencimento (verifique aqui):
# Substituir os arquivos
sudo cp new-cert.pem /etc/ssl/gethttps/cert.pem
sudo cp new-chain.pem /etc/ssl/gethttps/chain.pem
sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem
# Recarregar (não reiniciar) — zero tempo de inatividade
sudo systemctl reload apache2 # Debian/Ubuntu
sudo systemctl reload httpd # CentOS/RHEL
Guia completo de renovação → | Automatizar com Certbot →
Solução de problemas
”AH02572: Failed to configure certificate” / chave incompatível
O certificado e a chave privada não correspondem. Verifique se eles combinam:
# Esses dois hashes devem ser idênticos
openssl x509 -noout -modulus -in /etc/ssl/gethttps/cert.pem | md5sum
openssl rsa -noout -modulus -in /etc/ssl/gethttps/privkey.pem | md5sum
Se forem diferentes, você está usando arquivos de sessões diferentes do GetHTTPS. Baixe ambos novamente da mesma sessão.
”AH01909: server certificate does NOT include an ID”
Seu ServerName não corresponde a nenhum domínio no campo SAN do certificado:
openssl x509 -noout -text -in /etc/ssl/gethttps/cert.pem | grep -A1 "Subject Alternative Name"
Certifique-se de que o ServerName do Apache corresponda exatamente a um dos nomes DNS listados.
Navegador mostra “certificado não confiável”
Cadeia intermediária ausente. Verifique se SSLCertificateChainFile aponta para chain.pem (o intermediário), não para cert.pem. Teste a cadeia:
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | grep "Verify return code"
# "Verify return code: 0 (ok)" = bom
# "Verify return code: 21 (unable to verify)" = cadeia incompleta
“AH00526: Syntax error on line X”
Erro de sintaxe na configuração do Apache. Causas comuns:
- Tag
</VirtualHost>de fechamento ausente SSLCertificateChainFileescrito incorretamente- Aspas ausentes em valores de cabeçalhos
- Caminho do arquivo não existe
HTTPS funciona mas mostra “Não Seguro”
Conteúdo misto — sua página carrega recursos via HTTP. Abra DevTools → Console → corrija as URLs com http://.
Perguntas frequentes
Posso usar fullchain.pem em vez de cert + chain separados?
Sim, no Apache 2.4.8+. Use SSLCertificateFile /path/to/fullchain.pem e remova a diretiva SSLCertificateChainFile completamente. Em versões mais antigas do Apache, você precisa de arquivos separados.
Como verificar qual versão do Apache eu tenho?
apachectl -v
# ou
httpd -v
Preciso reiniciar o Apache ou apenas recarregar?
Recarregar (systemctl reload) é suficiente e causa zero tempo de inatividade. Reiniciar (systemctl restart) interrompe todas as conexões ativas. Sempre recarregue para alterações de certificado.
O Apache pode servir certificados diferentes para domínios diferentes?
Sim. Crie blocos <VirtualHost *:443> separados com diferentes ServerName e diretivas SSLCertificate*. O Apache usa SNI (Server Name Indication) para selecionar o certificado correto.
O Apache suporta certificados ECDSA?
Sim. O Apache 2.4+ lida com ECDSA da mesma forma que RSA — mesmas diretivas, mesmo formato de arquivo. O GetHTTPS gera ECDSA P-256 por padrão.
Onde estão os logs de erro SSL do Apache?
# Debian/Ubuntu
tail -f /var/log/apache2/error.log
# CentOS/RHEL
tail -f /var/log/httpd/ssl_error_log