HTTPS no WordPress: corrigir conteúdo misto e redirecionamentos
HTTPS no WordPress sem erros: certificado gratuito, substituição segura de URL com WP-CLI, um só redirecionamento 301, ciclos de proxy, conteúdo misto e validade.
Também em: English Deutsch Français Español Italiano Polski Türkçe
A maioria dos problemas de HTTPS no WordPress resulta de uma migração a meio, não de um certificado em falta. O certificado está instalado e a página inicial mostra o cadeado. Mas os artigos do blogue têm um ícone de aviso, ainda há ligações http:// antigas no conteúdo e quem escreve example.com passa por dois ou três redirecionamentos até chegar à página real. Este guia corrige esse estado, por uma ordem segura.
HTTPS no WordPress: o certificado é só o primeiro passo
Comece por medir. Estes dois comandos mostram o caminho que o navegador de um visitante percorre:
curl -sI http://example.com
curl -sIL http://example.com | grep -iE '^(HTTP|location)'
O primeiro comando mostra o código de estado e o cabeçalho Location da primeira resposta. O segundo segue todos os redirecionamentos. Se vir mais do que um 301 antes do 200 final, tem uma cadeia de redirecionamentos. Depois abra o site no navegador, prima F12 e consulte a Consola. É aí que aparecem os avisos de conteúdo misto.
Convém também ter claro o que o HTTPS faz. Cifra o tráfego entre o navegador e o servidor e protege-o de alterações durante o trajeto. É uma das medidas referidas no RGPD, artigo 32.º, n.º 1, alínea a), a cifragem, aplicável a palavras-passe de início de sessão, formulários de contacto e dados de pagamento. Não diz nada sobre a segurança do próprio site. Um site com certificado válido pode continuar a ter um plugin vulnerável, malware ou uma conta de administrador protegida por password123. Como a cifragem se enquadra nas restantes medidas de segurança é tratado em Artigo 32.º do RGPD para WordPress.
Obtenha um certificado gratuito do alojamento ou via ACME
A maioria dos painéis de alojamento na UE oferece um certificado gratuito Let's Encrypt com um único interruptor, muitas vezes em «SSL/TLS» ou «Segurança». Ative-o e confirme que cobre example.com e www.example.com. Um certificado para apenas um dos nomes provoca erros no navegador no outro, mesmo que esse só faça redirecionamento.
No seu próprio servidor, use um cliente ACME. O Certbot é a escolha habitual e configura a renovação automática:
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run
Use --apache em vez de --nginx se tiver Apache. A simulação verifica se a renovação vai mesmo funcionar. Se falhar agora, falhará também na próxima renovação real.
Não precisa de pagar por um certificado com validação de domínio para ter o cadeado. Os certificados pagos fazem sentido para contratos de suporte ou necessidades de validação específicas. Para a cifragem, um certificado gratuito é igualmente forte.
Faça uma cópia de segurança e altere o endereço do WordPress e do site
Faça uma cópia de segurança da base de dados antes de mudar seja o que for. Os passos seguintes reescrevem milhares de linhas, e a cópia é o seu botão de anular. Cópias de segurança do WordPress que realmente se restauram explica como fazer cópias em que pode confiar. Com o WP-CLI basta uma linha:
wp db export before-https.sql
Depois vá a Definições > Geral e altere tanto o Endereço do WordPress (URL) como o Endereço do site (URL) de http:// para https://. Se o WordPress estiver instalado num subdiretório, mantenha o caminho. Também pode fazê-lo na linha de comandos:
wp option update home 'https://example.com'
wp option update siteurl 'https://example.com'
Se os dois campos estiverem desativados, WP_HOME e WP_SITEURL estão definidos no wp-config.php. Altere os valores aí. As definições do painel não os conseguem substituir.
Se ficar sem sessão e não conseguir voltar a entrar, por exemplo porque o certificado ainda não funciona, defina temporariamente WP_HOME e WP_SITEURL no wp-config.php com o endereço antigo http:// (ou reponha-os, se já lá estiverem), ou execute os dois comandos wp option update com os valores antigos. Corrija primeiro o certificado e tente de novo.
Substitua os URL http:// antigos em segurança com wp search-replace
Os seus artigos, menus, widgets e opções do tema ainda contêm centenas de ligações http://example.com. Não as corrija com um REPLACE de SQL puro. O WordPress e muitos plugins guardam definições como PHP serializado, que regista o comprimento de cada string, por exemplo s:22:"http://example.com/img". Ao acrescentar o «s», a string fica um carácter mais comprida. O comprimento guardado deixa de coincidir, o PHP não consegue ler o valor e widgets, layouts de construtores de páginas ou definições do tema desaparecem sem aviso.
O [wp search-replace](https://developer.wordpress.org/cli/commands/search-replace/) desserializa os dados, substitui o texto e volta a serializar com os comprimentos corretos. Faça sempre primeiro uma simulação:
wp search-replace 'http://example.com' 'https://example.com' --all-tables --skip-columns=guid --dry-run
Leia as contagens por tabela. Se parecerem plausíveis, execute o mesmo comando sem --dry-run. Algumas notas:
--skip-columns=guiddeixa os GUID dos artigos em paz. São identificadores, não ligações, e por convenção não se alteram.--all-tablesmexe em todas as tabelas da base de dados. Se a base de dados for partilhada com outro site ou aplicação, use antes--all-tables-with-prefix.- Se o seu anfitrião canónico for sem www, faça uma segunda substituição de
http://www.example.comparahttps://example.com. - Alguns construtores de páginas guardam JSON com barras escapadas (
http:\/\/example.com), que uma pesquisa simples não encontra. Faça uma simulação para essa forma ou use a ferramenta de substituição de URL do próprio construtor.
Depois, esvazie todas as caches: wp cache flush, o plugin de cache de páginas, qualquer cache do servidor e a CDN. Se o seu construtor o permitir, regenere os ficheiros CSS. Sem SSH, um plugin de pesquisa e substituição que trate dados serializados, como o Better Search Replace, faz o mesmo trabalho. Elimine-o quando terminar.
Um único redirecionamento 301 para o anfitrião HTTPS canónico
Escolha um endereço canónico, com ou sem www, e mantenha-o. Todas as outras variantes devem ir diretamente para esse endereço, num único redirecionamento 301. Uma cadeia como http → https → www → final atrasa cada primeira visita, desperdiça rastreios dos motores de pesquisa e torna os erros difíceis de localizar.
Apache, colocado acima do bloco # BEGIN WordPress no .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
nginx:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
return 301 https://example.com$request_uri;
}
Mantenha o redirecionamento num único sítio. Se um plugin, o .htaccess e a CDN redirecionarem todos, obtém cadeias ou ciclos. Escolha o servidor ou a CDN e retire os outros.
Ciclos de redirecionamento atrás de uma CDN ou proxy inverso
O ciclo clássico é o modo SSL «Flexible» da Cloudflare. O navegador comunica em HTTPS com a Cloudflare, mas a Cloudflare comunica em HTTP simples com o seu servidor. O servidor vê HTTP, redireciona para HTTPS, e o ciclo repete-se. Instale um certificado no servidor e defina o modo Full (strict) nas definições SSL/TLS da Cloudflare. O tráfego para o servidor fica então cifrado e o certificado do servidor é validado.
Outros proxies e balanceadores de carga transmitem o esquema original num cabeçalho X-Forwarded-Proto. O WordPress não o lê por predefinição. Acrescente isto acima da linha «stop editing» no wp-config.php:
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
$_SERVER['HTTPS'] = 'on';
}
FORCE_SSL_ADMIN e a página de início de sessão
define( 'FORCE_SSL_ADMIN', true );
Isto faz com que o WordPress sirva a página de início de sessão e o painel apenas por HTTPS. As palavras-passe e os cookies de administração nunca são enviados sem cifragem, mesmo que alguém abra um favorito http:// antigo. É uma rede de segurança, não a sua solução de redirecionamento. Não faz nada pelas páginas públicas. Outras definições do wp-config.php são tratadas em Endurecimento do wp-config.php: 10 definições a verificar.
Encontre o conteúdo misto restante nas ferramentas de programador
Conteúdo misto significa que uma página HTTPS carrega um recurso por HTTP. Os navegadores bloqueiam scripts e frames inseguros e avisam sobre imagens ou atualizam-nas, e é por isso que o cadeado desaparece. Abra as ferramentas de programador numa página afetada. A Consola lista cada pedido inseguro com o respetivo URL. Em navegadores baseados em Chromium, escreva scheme:http no filtro do separador Rede (Network) para os ver todos de uma vez.
Depois de uma substituição limpa, as causas restantes costumam estar fora da base de dados. As fontes típicas são URL escritos diretamente nos ficheiros do tema, widgets de HTML personalizado, CSS personalizado (background: url(http://...)), ficheiros CSS de construtores de páginas e antigos conteúdos incorporados de terceiros. Para os encontrar no tema:
grep -rn "http://" wp-content/themes/your-theme/
wp db search 'http://example.com'
Corrija o problema na origem. Os plugins que reescrevem URL em cada carregamento de página escondem o problema sem o resolver, e deixam de funcionar quando são desativados. A diretiva CSP upgrade-insecure-requests pode servir de ponte temporária enquanto faz a limpeza. Está explicada em cabeçalhos de segurança do WordPress.
Verifique mais do que a página inicial. Teste o checkout, o formulário de contacto, a página de início de sessão, um artigo do blogue, um arquivo de categoria e qualquer página de destino criada com um modelo diferente.
Monitorize a validade do certificado e só depois ative o HSTS
A renovação automática pode falhar sem que ninguém repare. As causas habituais são uma alteração de DNS, a mudança para uma nova CDN, ou uma regra de firewall ou de redirecionamento que bloqueia /.well-known/acme-challenge/. Configure um monitor externo que verifique o certificado e o avise pelo menos duas semanas antes de expirar. Muitos serviços de monitorização de disponibilidade incluem esta verificação. Para ler a data de validade por si:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
O HSTS (RFC 6797) vem por último. Diz aos navegadores para usarem apenas HTTPS, pelo que um certificado avariado passa a ser um erro bloqueante para os visitantes, e com includeSubDomains o mesmo acontece com qualquer subdomínio esquecido que só funcione em HTTP. Ative-o apenas quando todos os subdomínios e redirecionamentos funcionarem, e comece com um max-age curto. Os valores e o aviso sobre o preload estão em cabeçalhos de segurança do WordPress.
O plugin de auditoria do secaudit.eu verifica as definições de endurecimento e de configuração, a integridade dos ficheiros e os plugins desatualizados. Depois da migração, fica com um registo do estado do site que pode guardar na sua documentação. → secaudit.eu
Próximo passo: execute a verificação de saltos com curl -sIL nas quatro variantes (http, http://www, https://www, https). Depois abra as suas cinco páginas mais importantes com a Consola das ferramentas de programador aberta. No máximo um 301 por variante, um 200 direto no URL HTTPS canónico e nenhuma mensagem de conteúdo misto significam que a migração está concluída.
FAQ
Um certificado gratuito é suficiente para uma loja online?
Sim. Um certificado gratuito com validação de domínio cifra o tráfego tão bem como um pago. A segurança da loja depende dos plugins, das atualizações, dos inícios de sessão e da configuração de pagamentos, não do preço do certificado.
Porque é que o cadeado desaparece apenas em algumas páginas?
Essas páginas carregam pelo menos um recurso por HTTP. Normalmente é uma imagem, um script ou um conteúdo incorporado de um widget, modelo ou secção de construtor de páginas que as outras páginas não usam. A Consola das ferramentas de programador nessa página mostra o URL exato.
O HTTPS torna o meu site conforme com o RGPD?
Não. O HTTPS é uma medida técnica ao abrigo do artigo 32.º, a cifragem em trânsito. O RGPD espera também que proteja os próprios sistemas, restabeleça os dados após incidentes, teste regularmente as suas medidas e documente tudo isto.
Este artigo é informação geral e não constitui aconselhamento jurídico.
Verifique o seu site
O Security Audit & Compliance é o plugin WordPress da secaudit.eu: procura malware, spam oculto, ficheiros do núcleo alterados e código vulnerável, e associa as conclusões ao art. 32.º do RGPD, ao art. 21.º da NIS2 e ao OWASP Top 10.
Ver o que o plugin verifica