Corrigindo Clock Skew e erros de certificado
O que voce vai aprender
- Por que o aviso "Clock skew detected" do
makee o "certificate is not yet valid" do TLS compartilham uma causa raiz - Como determinar se um relogio errado e o responsavel usando
date/openssl - Como corrigir o relogio e restaurar tanto builds quanto verificacao de certificados
Conclusao (padrao de triagem)
- Por mais variados que sejam os sintomas, a raiz e uma so: o relogio do sistema desviou do horario real
- Primeiro confirme que o desvio e real com
timedatectledate -u - Se for, corrija o relogio com NTP, depois faca
touchnos arquivos com mtime futuro
Premissas (ambiente alvo)
- SO: Ubuntu / Debian / familia RHEL (systemd com chrony ou systemd-timesyncd)
- Principalmente ambientes onde o relogio desvia facilmente: VMs, containers, Raspberry Pi
O que e clock skew, e por que quebra certificados e builds?
Conclusao: Clock skew e o desvio do relogio do sistema em relacao ao horario real. Builds veem mtimes de arquivos no futuro, certificados veem uma janela de validade (notBefore) no futuro, entao ambos sao rejeitados como "do futuro".
Clock skew significa que o relogio do sistema de uma maquina esta desalinhado do horario correto. A direcao do desvio muda o sintoma.
- Relogio atrasado (no passado) -> um certificado recem-emitido e julgado "not yet valid"
- Relogio adiantado (no futuro) -> arquivos gerados recebem mtime futuro, e ferramentas de build alertam
A essencia deste problema e que um erro de build aparentemente nao relacionado e um erro de certificado vem ambos da mesma incompatibilidade de horario. Um certificado tem uma janela de tempo -- notBefore (valido a partir de) e notAfter (valido ate) -- e make compara a atualidade dos arquivos por mtime. Ambos dependem do "horario atual", entao quando essa referencia esta errada, as coisas quebram em cadeia.
Fontes comuns
- Suspensao/retomada de VM ou restauracao de snapshot retrocede o relogio
- O relogio do host ja esta errado quando um container inicia
- Uma bateria de RTC (relogio de hardware) morta reseta o horario a cada reinicializacao
- Um servidor NFS e cliente discordam do horario (mtimes de arquivo parecem do futuro)
Como verifico se o relogio esta errado?
Conclusao: Verifique o status de sincronizacao com
timedatectle o UTC atual comdate -u, depois compare com um horario externo confiavel. Uma diferenca de dezenas de segundos ou mais aponta para clock skew.
Comece verificando o status de sincronizacao e o horario 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 e o indicador. Em seguida, compare com um horario externo confiavel. O header Date de uma resposta HTTP e uma referencia conveniente.
$ date -u $ curl -sI https://www.google.com | grep -i '^date:'
Se os dois horarios diferirem por dezenas de segundos a minutos ou mais, clock skew e a causa. Para evitar confundir com diferenca de fuso horario, sempre compare em UTC com date -u.
Um fuso horario errado (Time zone) nao e clock skew. Se o valor UTC de date -u esta correto, uma diferenca no horario local exibido e um problema de fuso horario e nao afeta certificados ou builds.
Como corrijo o aviso "Clock skew detected" no build?
Conclusao: Apos corrigir o relogio, liste arquivos com mtime futuro via
find . -newermt nowe resete-os comtouch. Reconstruir commake cleane a correcao mais confiavel.
Um aviso tipico 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 esta no futuro em relacao ao relogio atual do sistema. Como make decide o que reconstruir comparando mtimes, arquivos com data futura quebram a resolucao de dependencias e o build pode ficar incompleto.
A ordem e "1) corrigir o relogio, depois 2) corrigir os mtimes futuros". Se voce nao corrigir o relogio primeiro, touch apenas estampa o horario 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 confiavel e descartar intermediarios e reconstruir.
$ make clean && make
Se isso acontece com fontes em NFS, sincronize o relogio 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?
Conclusao: Verifique notBefore/notAfter com
openssl x509 -noout -dates. Se o horario atual esta fora da janela, suspeite do relogio. Corrigir o relogio geralmente resolve sem reemitir o certificado.
Quando o relogio esta errado, a verificacao falha mesmo para um certificado valido. Mensagens tipicas 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" e evidencia 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 -datesnotBefore=Jun 5 00:00:00 2026 GMT notAfter=Sep 3 23:59:59 2026 GMT
Se o UTC atual (date -u) esta antes de notBefore, voce recebe "not yet valid"; se depois de notAfter, "expired". Em ambos os casos o certificado em si esta correto, e corrigir o relogio resolve.
Antes de reemitir um certificado ou desabilitar verificacao com --insecure, sempre verifique o relogio. Se a causa e clock skew, trocar o certificado e inutil, e desabilitar verificacao apenas enfraquece a seguranca. Se o problema e um bundle de CA ou cadeia incompleta, veja Corrigindo "certificate verify failed".
Como corrigir o relogio corretamente?
Conclusao: Habilite NTP com
timedatectl set-ntp truee corrija imediatamente comchronyc makestep. Salve o horario no RTC comhwclock --systohcpara sobreviver a reinicializacoes.
Habilitar sincronizacao NTP e a base.
$ sudo timedatectl set-ntp true $ timedatectl # confirmar: System clock synchronized: yes
Quando o desvio e grande, chrony corrige gradualmente por seguranca. Para saltar imediatamente, use makestep.
$ sudo chronyc makestep $ chronyc tracking # confirmar que o offset converge proximo de 0
Se o horario continua resetando apos reinicializacao (ex: bateria de RTC morta), salve o relogio do sistema corrigido no relogio de hardware.
$ sudo hwclock --systohc
Para entender como a sincronizacao NTP funciona e quando escolher systemd-timesyncd vs chrony, veja Corrigindo desvio de horario do servidor (sincronizacao NTP).
Notas sobre VM / container
- Um container compartilha o relogio do kernel do host. Voce nao pode rodar NTP dentro do container, entao corrija o relogio no host
- Uma VM pode saltar no tempo ao retomar ou restaurar snapshot. Habilite a sincronizacao de horario do guest pelo hypervisor, ou rode NTP dentro do guest
Checklist para prevenir recorrencia
Conclusao: Torne o NTP persistente, salve o RTC, e sincronize o horario entre VMs e pares NFS, e erros de build e certificado por clock skew se tornam amplamente evitaveis.
| Medida | Comando / configuracao | Efeito |
|---|---|---|
| Manter sincronizacao NTP sempre ativa | timedatectl set-ntp true |
Corrige desvio do relogio automaticamente |
| Salvar horario correto no RTC | hwclock --systohc |
Evita reset apos reinicializacao |
| 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 recorrencia de mtime futuro |
Copiar e colar: diagnostico 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:'