RAUC Certificate Validation Time: Review the Security Cost Before Accepting Old Signed Bundles

Using a bundle’s signing time changes the time at which its certificate chain is evaluated; it does not prove when the signature was actually created. Review that distinction before treating an expired signing certificate as an operational nuisance that a configuration switch can solve.

This analysis pins RAUC 1.14 and uses OpenSSL 3.0.18 source for the detailed CRL cases. A vendor build with another library, patches or verification callbacks needs its own qualification. No keyring, configuration, certificate or device was changed, and no cryptographic test was executed.

1. Identify which clock the verifier uses

The RAUC 1.14 keyring reference describes use-bundle-signing-time: when enabled, bundle signing time replaces current system time for certificate validation. The tagged configuration parser defaults this option to false when it is absent.

In the tagged verification implementation, the enabled branch extracts the CMS signing-time attribute and sets the OpenSSL verification time before signature verification. It does not set the system clock or convert the attribute into an independent timestamp authority.

Record the effective setting, linked library version, trust-store generation and device-time source. Do not diagnose certificate expiry using the release filename, filesystem timestamp or dashboard upload date; none identifies the verifier’s chosen time.

RAUC chooses current system time or signer-asserted CMS time, then applies certificate and enabled CRL checks followed by remaining acceptance checks; historical time is not proof of pre-compromise signing.
Original validation-time decision model, scoped to RAUC 1.14 with OpenSSL 3.0.18 details. It does not authorize changing verification policy.

2. Separate signed time from independently established time

RFC 5652 section 11.3 defines the signing-time attribute as the signer’s claimed time and imposes no guarantee that it is correct. Protecting the attribute with the signature prevents an unrelated party from editing it undetected, but the signer chooses its value.

The security consequence is important: if someone obtains the signing key, a claimed earlier date is not evidence that the signature predates that compromise. A historical-time policy therefore needs an incident analysis beyond certificate expiry. Do not describe this setting as trusted timestamp validation or as proof that an old bundle was authorized before a breach.

Keep this question separate from rollback authorization. A certificate valid at the selected time does not make an obsolete firmware version compatible, safe or permitted by independent anti-rollback policy.

3. Build a certificate-time matrix first

For this simplified matrix, assume a correctly formed signature, accepted chain and algorithms, and that all other certificate checks pass. CRLs are considered separately below. “Pass” means only that the stated certificate-time condition passes.

Certificate/time condition Current-time evaluation Signing-time evaluation
Current and claimed signing times both within validity Pass this gate Pass this gate
Expired now; claimed signing time within validity Reject for expiry Can pass this gate
Claimed signing time before certificate validity begins Depends on current time Reject for not-yet-valid certificate
Claimed signing time after certificate validity ends Depends on current time Reject for expiry
Incorrect device clock; otherwise genuine old bundle May produce an incorrect time decision Uses claimed time, with its separate trust limitation

Apply the matrix to the actual chain, not only the leaf signer. Keep trust-anchor and chain-building behavior within the chosen OpenSSL configuration. A test that changes several certificates and clocks simultaneously cannot isolate which condition caused rejection.

4. Add revocation and CRL freshness explicitly

RAUC’s check-crl is a separate setting. Merely storing a CRL does not mean checking is enabled. The OpenSSL 3.0 verification documentation also explains that this mechanism does not automatically download CRLs from certificate distribution-point URLs.

In OpenSSL 3.0.18’s CRL checks, the selected verification time is used for CRL date validation too. A CRL current today may be not yet valid relative to a much older claimed signing time. A historical CRL may pass its time check while lacking later revocation information.

CRL fixture with checking enabled Expected review point
No suitable required CRL available Verification must not silently become a successful no-CRL check
CRL starts after selected verification time Not-yet-valid CRL can block verification
CRL expired at selected verification time Expiry can block verification; qualify any delta-CRL configuration separately
Usable CRL lists signer as revoked Ordinary revoked entry is rejected
Historical CRL omits a later-compromised signer No current revocation knowledge is established

Do not assume that selecting a time before a listed revocation date makes the signer acceptable. In the pinned ordinary CRL lookup, a matching revoked entry is reported without comparing that entry’s revocation date to verification time; removeFromCRL is a distinct case. This is implementation-specific evidence, not a universal historical-validation model.

5. Qualify the policy in an isolated fixture

  1. Freeze the verifier binary, library, configuration and public trust metadata.
  2. Create a controlled test corpus through the organization’s approved test-PKI process; exclude production private material.
  3. Vary current time, claimed signing time and certificate validity independently.
  4. Repeat with missing, current, historical and revoked-entry CRLs.
  5. Include malformed or missing signing-time attributes and require bounded failure without installation; do not assume the documented happy path proves parser robustness.
  6. Record verification result and error category before testing any installation path.

Keep the fixture isolated from production time services and active devices. This checklist is a proposed qualification method, not a certificate-generation or trust-change command sequence.

Hypothetical long-offline controller

A controller returns after its release-signing certificate expired. Its archived bundle claims a date inside certificate validity. Current-time validation rejects the expired chain; historical-time validation may pass that condition.

The security review then discovers that the available recent CRL begins after the claimed date, while the older CRL predates a compromise report. Neither “the signature verifies” nor “the old CRL was valid then” resolves today’s authorization decision.

Escalate to the approved recovery and incident policy, preserving the failing evidence. Close the review with the selected time model, compromise assumptions, CRL distribution/freshness plan and exact acceptance matrix. Do not change verification policy merely to make the stranded unit’s error disappear.

Similar Posts