Corrigindo Clock Skew e erros de certificado

Corrigindo Clock Skew e erros de certificado

O que você vai aprender

  • Por que o aviso "Clock skew detected" do make e o "certificate is not yet valid" do TLS compartilham uma causa raiz
  • Como determinar se um relógio errado é o responsável usando date / openssl
  • Como corrigir o relógio e restaurar tanto builds quanto verificação de certificados

Conclusão (padrão de triagem)

  • Por mais variados que sejam os sintomas, a raiz é uma só: o relógio do sistema desviou do horário real
  • Primeiro confirme que o desvio é real com timedatectl e date -u
  • Se for, corrija o relógio com NTP, depois faça touch nos arquivos com mtime futuro

Premissas (ambiente alvo)

  • SO: Ubuntu / Debian / família RHEL (systemd com chrony ou systemd-timesyncd)
  • Principalmente ambientes onde o relógio desvia facilmente: VMs, containers, Raspberry Pi

O que é clock skew, e por que quebra certificados e builds?

Conclusão: Clock skew é o desvio do relógio do sistema em relação ao horário real. Builds veem mtimes de arquivos no futuro, certificados veem uma janela de validade (notBefore) no futuro, então ambos são rejeitados como "do futuro".

Clock skew significa que o relógio do sistema de uma máquina está desalinhado do horário correto. A direção do desvio muda o sintoma.

  • Relógio atrasado (no passado) -> um certificado recem-emitido é julgado "not yet valid"
  • Relógio adiantado (no futuro) -> arquivos gerados recebem mtime futuro, e ferramentas de build alertam

A essência deste problema é que um erro de build aparentemente não relacionado e um erro de certificado vêm ambos da mesma incompatibilidade de horário. Um certificado tem uma janela de tempo -- notBefore (válido a partir de) e notAfter (válido até) -- e make compara a atualidade dos arquivos por mtime. Ambos dependem do "horário atual", então quando essa referência está errada, as coisas quebram em cadeia.

Fontes comuns

  • Suspensão/retomada de VM ou restauração de snapshot retrocede o relógio
  • O relógio do host já está errado quando um container inicia
  • Uma bateria de RTC (relógio de hardware) morta reseta o horário a cada reinicialização
  • Um servidor NFS e cliente discordam do horário (mtimes de arquivo parecem do futuro)

Como verifico se o relógio está errado?

Conclusão: Verifique o status de sincronização com timedatectl e o UTC atual com date -u, depois compare com um horário externo confiável. Uma diferença de dezenas de segundos ou mais aponta para clock skew.

Comece verificando o status de sincronização e o horário atual.

$ timedatectl
               Local time: Sat 2026-06-06 12:00:00 UTC
           Universal time: Sat 2026-06-06 12:00:00 UTC
                 RTC time: Sat 2026-06-06 12:00:00
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: no
              NTP service: active

System clock synchronized: no é o indicador. Em seguida, compare com um horário externo confiável. O header Date de uma resposta HTTP é uma referência conveniente.

$ date -u
$ curl -sI https://www.google.com | grep -i '^date:'

Se os dois horários diferirem por dezenas de segundos a minutos ou mais, clock skew é a causa. Para evitar confundir com diferença de fuso horário, sempre compare em UTC com date -u.

Um fuso horário errado (Time zone) não é clock skew. Se o valor UTC de date -u está correto, uma diferença no horário local exibido é um problema de fuso horário e não afeta certificados ou builds.

Como corrijo o aviso "Clock skew detected" no build?

Conclusão: Após corrigir o relógio, liste arquivos com mtime futuro via find . -newermt now e resete-os com touch. Reconstruir com make clean é a correção mais confiável.

Um aviso típico durante make:

make: Warning: File 'main.o' has modification time 9876 s in the future
make: warning:  Clock skew detected.  Your build may be incomplete.

Isso acontece porque o mtime de um arquivo fonte ou objeto está no futuro em relação ao relógio atual do sistema. Como make decide o que reconstruir comparando mtimes, arquivos com data futura quebram a resolução de dependências e o build pode ficar incompleto.

A ordem é "1) corrigir o relógio, depois 2) corrigir os mtimes futuros". Se você não corrigir o relógio primeiro, touch apenas estampa o horário atual ainda errado novamente.

# 1. Corrigir o relogio (detalhes em #fix-clock abaixo)
$ sudo timedatectl set-ntp true

# 2. Encontrar arquivos com mtime futuro
$ find . -newermt now -type f

# 3. Resetar para o horario atual
$ find . -newermt now -type f -exec touch {} +

A abordagem mais confiável é descartar intermediários e reconstruir.

$ make clean && make

Se isso acontece com fontes em NFS, sincronize o relógio tanto no servidor NFS quanto no cliente. Corrigir apenas um lado deixa mtimes futuros estampados pelo outro, e o problema recorre.

Como corrijo erros "not yet valid / expired" de certificados?

Conclusão: Verifique notBefore/notAfter com openssl x509 -noout -dates. Se o horário atual está fora da janela, suspeite do relógio. Corrigir o relógio geralmente resolve sem reemitir o certificado.

Quando o relógio está errado, a verificação falha mesmo para um certificado válido. Mensagens típicas por ferramenta:

# curl
curl: (60) SSL certificate problem: certificate is not yet valid

# git clone (https)
fatal: unable to access '...': server certificate verification failed

# Ferramentas baseadas em Go
x509: certificate has expired or is not yet valid

# apt update
E: Release file for ... is not valid yet (invalid for another 5h 30min ...)

A mensagem do apt "is not valid yet" é evidência clara de clock skew. Verifique a janela de validade do certificado com openssl.

# Um arquivo de certificado local
$ openssl x509 -in cert.pem -noout -dates

# O certificado de um servidor remoto
$ echo | openssl s_client -connect example.com:443 2>/dev/null \
    | openssl x509 -noout -dates
notBefore=Jun  5 00:00:00 2026 GMT
notAfter=Sep  3 23:59:59 2026 GMT

Se o UTC atual (date -u) está antes de notBefore, você recebe "not yet valid"; se depois de notAfter, "expired". Em ambos os casos o certificado em si está correto, e corrigir o relógio resolve.

Antes de reemitir um certificado ou desabilitar verificação com --insecure, sempre verifique o relógio. Se a causa é clock skew, trocar o certificado é inútil, e desabilitar verificação apenas enfraquece a segurança. Se o problema é um bundle de CA ou cadeia incompleta, veja Corrigindo "certificate verify failed".

Como corrigir o relógio corretamente?

Conclusão: Habilite NTP com timedatectl set-ntp true e corrija imediatamente com chronyc makestep. Salve o horário no RTC com hwclock --systohc para sobreviver a reinicializações.

Habilitar sincronização NTP é a base.

$ sudo timedatectl set-ntp true
$ timedatectl   # confirmar: System clock synchronized: yes

Quando o desvio é grande, chrony corrige gradualmente por segurança. Para saltar imediatamente, use makestep.

$ sudo chronyc makestep
$ chronyc tracking   # confirmar que o offset converge proximo de 0

Se o horário continua resetando após reinicialização (ex: bateria de RTC morta), salve o relógio do sistema corrigido no relógio de hardware.

$ sudo hwclock --systohc

Para entender como a sincronização NTP funciona e quando escolher systemd-timesyncd vs chrony, veja Corrigindo desvio de horário do servidor (sincronização NTP).

Notas sobre VM / container

  • Um container compartilha o relógio do kernel do host. Você não pode rodar NTP dentro do container, então corrija o relógio no host
  • Uma VM pode saltar no tempo ao retomar ou restaurar snapshot. Habilite a sincronização de horário do guest pelo hypervisor, ou rode NTP dentro do guest

Checklist para prevenir recorrência

Conclusão: Torne o NTP persistente, salve o RTC, e sincronize o horário entre VMs e pares NFS, e erros de build e certificado por clock skew se tornam amplamente evitáveis.

Medida Comando / configuração Efeito
Manter sincronização NTP sempre ativa timedatectl set-ntp true Corrige desvio do relógio automaticamente
Salvar horário correto no RTC hwclock --systohc Evita reset após reinicialização
Detectar cedo com monitoramento Acompanhar offset de chronyc tracking Captura desvio antes do incidente
Sincronizar servidor e cliente NFS Habilitar NTP em ambos os hosts Previne recorrência de mtime futuro

Copiar e colar: diagnóstico de clock skew em uma linha

# Verificar status de sincronizacao, UTC local e horario externo de uma vez
timedatectl; echo "--- local UTC ---"; date -u; \
  echo "--- remote ---"; curl -sI https://www.google.com | grep -i '^date:'

Próximas leituras