Introduction
TLS certificate validation is time-sensitive: if the system clock is outside a certificate's validity window (Not Before / Not After), the connection is rejected. Clock drift of even a few minutes can cause cascading failures across HTTPS, API calls, package managers, container registries, and authentication systems. This is especially problematic in virtual machines, which are prone to time drift when the host is overloaded or during live migration.
Symptoms
curl https://example.comfails withSSL certificate problem: certificate is not yet validapt-get updatefails withRelease file is not yet valid- Docker pull fails with
x509: certificate has expired or is not yet valid openssl s_client -connect host:443showsVerify return code: 10 (certificate has expired)dateshows a time several minutes or hours off from actual time
Common Causes
- NTP daemon not running or misconfigured
- Virtual machine clock drift during host CPU contention or migration
- Hardware clock (RTC) battery depleted causing time reset on boot
- System running in a container without access to host clock
- Large time jump after suspend/resume cycle on laptops
Step-by-Step Fix
- 1.Check current system time against an authoritative source:
- 2.```bash
- 3.date
- 4.curl -sI https://google.com | grep Date
- 5.# Or compare with pool.ntp.org
- 6.ntpdate -q pool.ntp.org
- 7.
` - 8.Force immediate time synchronization:
- 9.```bash
- 10.# Using systemd-timesyncd
- 11.sudo systemctl restart systemd-timesyncd
- 12.timedatectl timesync-status
# Using chrony (more robust for VMs) sudo chronyc makestep sudo chronyc tracking
# Using ntpdate (quick one-shot) sudo systemctl stop ntp 2>/dev/null sudo ntpdate -b pool.ntp.org sudo systemctl start ntp 2>/dev/null ```
- 1.Set the hardware clock from system time:
- 2.```bash
- 3.sudo hwclock --systohc
- 4.sudo hwclock --show
- 5.
` - 6.Enable NTP synchronization via timedatectl:
- 7.```bash
- 8.sudo timedatectl set-ntp true
- 9.timedatectl status
- 10.# Verify NTP synchronized: yes
- 11.
` - 12.For VMs, configure the hypervisor time sync:
- 13.```bash
- 14.# VMware
- 15.sudo vmware-toolbox-cmd timesync enable
# Hyper-V sudo systemctl enable hv_kvp_daemon
# Check if KVM guest agent is running systemctl status qemu-guest-agent ```
- 1.Verify certificate validation after time fix:
- 2.```bash
- 3.openssl s_client -connect google.com:443 -brief 2>&1 | grep Verify
- 4.# Should show: Verification: OK
- 5.curl -vI https://google.com 2>&1 | grep -E "SSL|expire"
- 6.
`
Prevention
- Use
chronyinstead ofntpdfor VMs - it handles large time jumps and network interruptions better - Monitor clock offset with alerts when offset exceeds 5 seconds
- Configure multiple NTP sources from different strata and geographic regions
- In virtualized environments, enable both guest NTP and hypervisor time sync as redundant sources
- Replace motherboard CMOS batteries on physical servers showing time drift after power loss