kubernetes/kops · error
attested document expiresOn %s is before createdOn %s
Error message
attested document expiresOn %s is before createdOn %s
What it means
Consistency guard on the attested document timestamps: expiresOn is before createdOn, which is impossible for a genuine Azure-issued document and indicates a malformed or forged payload.
Source
Thrown at upup/pkg/fi/cloudup/azure/attest.go:321
return nil, fmt.Errorf("parsing attested document creation: %w", err)
}
if createdOn.After(now.Add(attestedDocumentMaxClockSkew)) {
return nil, fmt.Errorf("attested document createdOn %s is too far in the future", data.TimeStamp.CreatedOn)
}
oldestAllowedCreatedOn := now.Add(-(attestedDocumentMaxAge + attestedDocumentMaxClockSkew))
if createdOn.Before(oldestAllowedCreatedOn) {
return nil, fmt.Errorf("attested document createdOn %s is older than allowed freshness window of %s plus %s clock skew", data.TimeStamp.CreatedOn, attestedDocumentMaxAge, attestedDocumentMaxClockSkew)
}
klog.V(4).Infof("Attested document createdOn is fresh (createdOn=%s now=%s)", createdOn.Format(time.RFC3339), now.Format(time.RFC3339))
// Verify the attested document has not expired and has a coherent lifetime.
if data.TimeStamp.ExpiresOn != "" {
expiresOn, err := time.Parse(attestedDocumentTimeFormat, data.TimeStamp.ExpiresOn)
if err != nil {
return nil, fmt.Errorf("parsing attested document expiration: %w", err)
}
if expiresOn.Before(createdOn) {
return nil, fmt.Errorf("attested document expiresOn %s is before createdOn %s", data.TimeStamp.ExpiresOn, data.TimeStamp.CreatedOn)
}
if expiresOn.Before(now.Add(-attestedDocumentMaxClockSkew)) {
return nil, fmt.Errorf("attested document expired at %s", data.TimeStamp.ExpiresOn)
}
klog.V(4).Infof("Attested document not expired (expiresOn=%s)", expiresOn.Format(time.RFC3339))
}
return &data, nil
}
// intermediateCertPoolWithCaches performs a cached lookup against the supplied positive and
// negative TTL caches, invoking fetch on a miss. Tests inject their own stores and fetchers.
func intermediateCertPoolWithCaches(signer *x509.Certificate, fetch func(*x509.Certificate) (*x509.CertPool, error), positive, negative expirationcache.Store) (*x509.CertPool, error) {
if signer == nil {
return nil, fmt.Errorf("signer certificate is required")
}
keyStr := intermediateCacheKeyForSigner(signer)View on GitHub (pinned to 4c8573c808)
Solutions
- Reject the attestation token
- Regenerate the token on the node; persistent failures indicate tampering or an Azure format change
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at upup/pkg/fi/cloudup/azure/attest.go:321 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/705f3fcc93e4409c.
Report an issue: GitHub.