[
https://issues.apache.org/jira/browse/IGNITE-29211?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Anton Vinogradov updated IGNITE-29211:
--------------------------------------
Description:
Automatically load certificates delivered by an external system before the
current chain expires. That system issues and publishes replacements; Ignite
loads them at scheduled attempts. Manual file replacement and trust-store-only
changes still use {{--ssl reload}}: renewal does not watch files for changes.
h3. How renewal works
Add opt-in settings to AbstractSslContextFactory, disabled by default. Use the
current {{SslBundle}} to schedule from the earliest expiry across all
private-key chains, including CA certificates. When expiry dates tie, use the
earliest leaf validity start to determine the renewal window. Require at least
one private key and a known, nonempty X.509 chain for every alias at startup
and on every replacement. Reject loads that do not supply them because the
renewal time cannot be determined.
Request a fresh bundle through the same factory path as manual reload and reuse
IGNITE-29210's validation and replacement. Install the whole bundle only when
every chain is currently valid and the minimum expiry across all chains
increases. Aliases may be renamed, added or removed; no match with the previous
alias names is required. If the minimum expiry does not advance, loading fails
or validation rejects the replacement, retain the current bundle and retry with
bounded backoff and jitter, including after expiry. Show the next attempt in
{{--ssl status}} and log the cause.
Serialize renewal and manual reload for each factory, replan after a successful
reload and prevent an obsolete automatic attempt from installing its result.
Use the node's operation context so scheduled work is attributed to the node.
Shutdown interrupts and finishes renewal work; cancellation must neither count
as failure nor overwrite the last reload result.
h3. Monitoring and acceptance
Publish one node metric, {{ssl.ConsecutiveRenewalFailures}}, so monitoring can
detect unsuccessful delivery or loading. Sum consecutive unsuccessful automatic
attempts across distinct factories and count a shared factory once. An
unchanged minimum expiry counts as unsuccessful. Reset only the affected
factory's count when renewal or manual reload installs a bundle whose minimum
expiry across all chains is later. Failed manual reloads do not increment this
metric.
Test scheduling across all private-key chains, CA expiry, retries after expiry,
unchanged material, alias changes, metric aggregation and reset, reload races
and shutdown. Verify default-off behavior, including manual reload with unknown
metadata and no renewal messages. Explain delivery prerequisites, enabling
renewal, inspecting failures and recovering with reload.
h3. Dependencies and remaining work
Implementation, tests and documentation are prepared on {{ignite-29211}}. Open
its PR after IGNITE-29210 is merged and run CI on the updated branch. HTTP REST
integration in IGNITE-29212 is independent.
Once both features are present, include the [prepared integration
commit|https://github.com/anton-vinogradov/ignite/commit/048985910a08fc148373975132e10ad34cfce291]
in whichever PR merges second. It supplies HTTP renewal documentation, Javadoc
and an HTTPS test for automatic replacement with a later-expiring chain. Re-run
the test on the updated branch.
was:
Automatically load certificates delivered by an external system before the
current chain expires. That system issues and publishes replacements; Ignite
loads them at scheduled attempts. Manual file replacement and trust-store-only
changes still use {{--ssl reload}}: renewal does not watch files for changes.
h3. How renewal works
Add opt-in settings to AbstractSslContextFactory, disabled by default. Use the
certificate lifetime and earliest chain expiry to schedule attempts, including
an expiring CA certificate. Enabling renewal without chain metadata must
prevent startup because its due time cannot be determined. Metadata remains
required on later loads.
Reuse IGNITE-29210's validation and context replacement. Install only a valid
chain that expires later, so a successful renewal extends the time the node can
use its certificate. If material is unchanged, loading fails or validation
rejects it, retain the current context and retry with bounded backoff and
jitter, including after expiry. Show the next attempt in {{--ssl status}} and
log the cause.
Serialize renewal and manual reload for each factory, replan after a successful
reload and prevent an obsolete automatic attempt from installing its result.
Use the node's operation context so scheduled work is attributed to the node.
Shutdown interrupts and finishes renewal work; cancellation must neither count
as failure nor overwrite the last reload result.
h3. Monitoring and acceptance
Publish one node metric, {{ssl.ConsecutiveRenewalFailures}}, so monitoring can
detect unsuccessful delivery or loading. Sum consecutive unsuccessful automatic
attempts across distinct factories and count a shared factory once. An
unchanged chain counts as unsuccessful. Reset only the affected factory's count
when renewal or manual reload installs a later-expiring chain. Failed manual
reloads do not increment this metric.
Test scheduling, chain expiry, retries after expiry, unchanged material, metric
aggregation and reset, reload races and shutdown. Verify default-off behavior,
including manual reload with unknown metadata and no renewal messages. Explain
delivery prerequisites, enabling renewal, inspecting failures and recovering
with reload.
h3. Dependencies and remaining work
Implementation, tests and documentation are prepared on {{ignite-29211}}. Open
its PR after IGNITE-29210 is merged and run CI on the updated branch. HTTP REST
integration in IGNITE-29212 is independent.
Once both features are present, include the [prepared integration
commit|https://github.com/anton-vinogradov/ignite/commit/40876edca74c523ec43efd2ef634b27a9fe6f34d]
in whichever PR merges second. It supplies HTTP renewal documentation, Javadoc
and an HTTPS test for automatic replacement with a later-expiring chain. Re-run
the test on the updated branch.
> Renew TLS certificates automatically before expiry
> --------------------------------------------------
>
> Key: IGNITE-29211
> URL: https://issues.apache.org/jira/browse/IGNITE-29211
> Project: Ignite
> Issue Type: Sub-task
> Reporter: Anton Vinogradov
> Assignee: Anton Vinogradov
> Priority: Major
> Labels: ise
>
> Automatically load certificates delivered by an external system before the
> current chain expires. That system issues and publishes replacements; Ignite
> loads them at scheduled attempts. Manual file replacement and
> trust-store-only changes still use {{--ssl reload}}: renewal does not watch
> files for changes.
> h3. How renewal works
> Add opt-in settings to AbstractSslContextFactory, disabled by default. Use
> the current {{SslBundle}} to schedule from the earliest expiry across all
> private-key chains, including CA certificates. When expiry dates tie, use the
> earliest leaf validity start to determine the renewal window. Require at
> least one private key and a known, nonempty X.509 chain for every alias at
> startup and on every replacement. Reject loads that do not supply them
> because the renewal time cannot be determined.
> Request a fresh bundle through the same factory path as manual reload and
> reuse IGNITE-29210's validation and replacement. Install the whole bundle
> only when every chain is currently valid and the minimum expiry across all
> chains increases. Aliases may be renamed, added or removed; no match with the
> previous alias names is required. If the minimum expiry does not advance,
> loading fails or validation rejects the replacement, retain the current
> bundle and retry with bounded backoff and jitter, including after expiry.
> Show the next attempt in {{--ssl status}} and log the cause.
> Serialize renewal and manual reload for each factory, replan after a
> successful reload and prevent an obsolete automatic attempt from installing
> its result. Use the node's operation context so scheduled work is attributed
> to the node. Shutdown interrupts and finishes renewal work; cancellation must
> neither count as failure nor overwrite the last reload result.
> h3. Monitoring and acceptance
> Publish one node metric, {{ssl.ConsecutiveRenewalFailures}}, so monitoring
> can detect unsuccessful delivery or loading. Sum consecutive unsuccessful
> automatic attempts across distinct factories and count a shared factory once.
> An unchanged minimum expiry counts as unsuccessful. Reset only the affected
> factory's count when renewal or manual reload installs a bundle whose minimum
> expiry across all chains is later. Failed manual reloads do not increment
> this metric.
> Test scheduling across all private-key chains, CA expiry, retries after
> expiry, unchanged material, alias changes, metric aggregation and reset,
> reload races and shutdown. Verify default-off behavior, including manual
> reload with unknown metadata and no renewal messages. Explain delivery
> prerequisites, enabling renewal, inspecting failures and recovering with
> reload.
> h3. Dependencies and remaining work
> Implementation, tests and documentation are prepared on {{ignite-29211}}.
> Open its PR after IGNITE-29210 is merged and run CI on the updated branch.
> HTTP REST integration in IGNITE-29212 is independent.
> Once both features are present, include the [prepared integration
> commit|https://github.com/anton-vinogradov/ignite/commit/048985910a08fc148373975132e10ad34cfce291]
> in whichever PR merges second. It supplies HTTP renewal documentation,
> Javadoc and an HTTPS test for automatic replacement with a later-expiring
> chain. Re-run the test on the updated branch.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)