public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pbs-devel@lists.proxmox.com, Shannon Sterz <s.sterz@proxmox.com>
Subject: applied: [PATCH datacenter-manager v3 13/16] cli: expose certificate management endpoints via the cli
Date: Thu, 06 Aug 2026 15:53:11 +0200	[thread overview]
Message-ID: <1786024383.mlfu794p79.astroid@yuna.none> (raw)
In-Reply-To: <20260805155308.519896-15-s.sterz@proxmox.com>

On August 5, 2026 5:53 pm, Shannon Sterz wrote:
> analogous to how this is handled in proxmox-backup-server.
> 
> Signed-off-by: Shannon Sterz <s.sterz@proxmox.com>
> ---
>  cli/admin/Cargo.toml  |  1 +
>  cli/admin/src/cert.rs | 86 +++++++++++++++++++++++++++++++++++++++++++
>  cli/admin/src/main.rs |  2 +
>  3 files changed, 89 insertions(+)
>  create mode 100644 cli/admin/src/cert.rs
> 
> diff --git a/cli/admin/Cargo.toml b/cli/admin/Cargo.toml
> index 01afc88d..db522696 100644
> --- a/cli/admin/Cargo.toml
> +++ b/cli/admin/Cargo.toml
> @@ -29,3 +29,4 @@ pdm-api-types.workspace = true
>  pdm-config.workspace = true
>  pdm-buildcfg.workspace = true
>  server.workspace = true
> +proxmox-time.workspace = true
> diff --git a/cli/admin/src/cert.rs b/cli/admin/src/cert.rs
> new file mode 100644
> index 00000000..6877c998
> --- /dev/null
> +++ b/cli/admin/src/cert.rs
> @@ -0,0 +1,86 @@
> +use anyhow::{Error, bail};
> +
> +use proxmox_router::cli::*;
> +use proxmox_schema::api;
> +use server::api;
> +use server::auth::certs::update_self_signed_cert;
> +use server::auth::csrf::generate_csrf_key;
> +use server::auth::key::generate_auth_key;
> +
> +#[api]
> +/// Display node certificate information.
> +fn cert_info() -> Result<(), Error> {
> +    let Some(cert) = api::nodes::certificates::get_info()?.pop() else {
> +        return Ok(());
> +    };
> +
> +    println!("Subject: {}", cert.subject);
> +
> +    for name in cert.san {
> +        println!("    {name}");
> +    }
> +
> +    let not_before = cert
> +        .notbefore
> +        .and_then(|e| proxmox_time::strftime_utc("%b %e %T %Y %Z", e).ok());
> +
> +    let not_after = cert
> +        .notafter
> +        .and_then(|e| proxmox_time::strftime_utc("%b %e %T %Y %Z", e).ok());
> +
> +    println!("Issuer: {}", cert.issuer);
> +    println!("Validity:");
> +    println!("    Not Before: {}", not_before.unwrap_or_default());
> +    println!("    Not After : {}", not_after.unwrap_or_default());
> +
> +    println!(
> +        "Fingerprint (sha256): {}",
> +        cert.fingerprint.unwrap_or_default()
> +    );
> +
> +    println!("Public key type: {}", cert.public_key_type);
> +    println!(
> +        "Public key bits: {}",
> +        cert.public_key_bits.unwrap_or_default()
> +    );
> +
> +    Ok(())
> +}
> +
> +#[api(
> +    input: {
> +        properties: {
> +            force: {
> +                description: "Force generation of new SSL certificate.",
> +                type:  Boolean,
> +                optional:true,
> +            },
> +        }
> +    },
> +)]
> +/// Update node certificates and generate all needed files/directories. If no authentication key or
> +/// CSRF secret key exists, this will also generate new ones. These two keys will go into effect the
> +/// next time the `proxmox-datacenter-api.service` is started.
> +fn update_certs(force: Option<bool>) -> Result<(), Error> {
> +    pdm_config::setup::create_configdir()?;
> +
> +    if let Err(err) = generate_auth_key() {
> +        bail!("unable to generate auth key - {err}");
> +    }
> +
> +    if let Err(err) = generate_csrf_key() {
> +        bail!("unable to generate csrf key - {err}");
> +    }
> +
> +    update_self_signed_cert(force.unwrap_or(false))?;
> +
> +    Ok(())
> +}
> +
> +pub fn cert_mgmt_cli() -> CommandLineInterface {
> +    let cmd_def = CliCommandMap::new()
> +        .insert("info", CliCommand::new(&API_METHOD_CERT_INFO))
> +        .insert("update", CliCommand::new(&API_METHOD_UPDATE_CERTS));
> +
> +    cmd_def.into()
> +}
> diff --git a/cli/admin/src/main.rs b/cli/admin/src/main.rs
> index 3102694e..a2c5c623 100644
> --- a/cli/admin/src/main.rs
> +++ b/cli/admin/src/main.rs
> @@ -13,6 +13,7 @@ use proxmox_schema::api;
>  use proxmox_sys::fs::CreateOptions;
>  
>  mod acme;
> +mod cert;
>  mod remotes;
>  mod support_status;
>  
> @@ -39,6 +40,7 @@ async fn run() -> Result<(), Error> {
>  
>      let cmd_def = CliCommandMap::new()
>          .insert("acme", acme::acme_mgmt_cli())
> +        .insert("cert", cert::cert_mgmt_cli())
>          .insert("remote", remotes::cli())
>          .insert(
>              "report",
> -- 
> 2.47.3
> 
> 
> 
> 
> 
> 




  reply	other threads:[~2026-08-06 13:53 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-05 15:52 [PATCH datacenter-manager/proxmox{,-backup} v3 00/16] TLS Certificate Rotation Shannon Sterz
2026-08-05 15:52 ` [PATCH proxmox v3 01/16] acme-api/tls-certificates: add new crate collecting tls related helpers Shannon Sterz
2026-08-05 15:52 ` [PATCH proxmox v3 02/16] tls-certificates: add days_valid parameter to create_self_signed_cert Shannon Sterz
2026-08-06 13:09   ` Fabian Grünbichler
2026-08-06 13:49     ` Shannon Sterz
2026-08-05 15:52 ` [PATCH proxmox v3 03/16] tls-certificates: add self_signed_cert_expires_in to check certificates Shannon Sterz
2026-08-06 13:09   ` Fabian Grünbichler
2026-08-06 13:49     ` Fabian Grünbichler
2026-08-05 15:52 ` [PATCH proxmox v3 04/16] acme-api: stop re-exporting create_self_signed_cert Shannon Sterz
2026-08-05 15:52 ` [PATCH proxmox-backup v3 05/16] config: use proxmox_tls_certificates for generating self-signed certificates Shannon Sterz
2026-08-06 13:09   ` Fabian Grünbichler
2026-08-06 13:49     ` Shannon Sterz
2026-08-05 15:52 ` [PATCH proxmox-backup v3 06/16] config/server/api: add certificate renewal logic including notifications Shannon Sterz
2026-08-06 13:09   ` Fabian Grünbichler
2026-08-05 15:53 ` [PATCH proxmox-backup v3 07/16] daily update: warn about excessive self-signed certificate lifetime Shannon Sterz
2026-08-05 15:53 ` [PATCH proxmox-backup v3 08/16] docs: document force refreshing long-lived certificates Shannon Sterz
2026-08-05 15:53 ` [PATCH proxmox-backup v3 09/16] backup-manager cli: `cert update` can create auth and csrf key Shannon Sterz
2026-08-06 13:27   ` applied: " Fabian Grünbichler
2026-08-05 15:53 ` [PATCH proxmox-backup v3 10/16] notifications: use `Severity::Error` for acme renewal failures Shannon Sterz
2026-08-06 13:27   ` applied: " Fabian Grünbichler
2026-08-05 15:53 ` [PATCH datacenter-manager v3 11/16] certs: use proxmox-tls-certificates directly, add days_valid parameter Shannon Sterz
2026-08-05 15:53 ` [PATCH datacenter-manager v3 12/16] api/auth/bin: add certificate renewal logic Shannon Sterz
2026-08-05 15:53 ` [PATCH datacenter-manager v3 13/16] cli: expose certificate management endpoints via the cli Shannon Sterz
2026-08-06 13:53   ` Fabian Grünbichler [this message]
2026-08-05 15:53 ` [PATCH datacenter-manager v3 14/16] daily-update: warn about certificates with excessive lifetimes Shannon Sterz
2026-08-05 15:53 ` [PATCH datacenter-manager v3 15/16] docs: add section on forcing a new self-signed certificate Shannon Sterz
2026-08-05 15:53 ` [PATCH datacenter-manager v3 16/16] docs/certificates: use correct certificate file name Shannon Sterz
2026-08-06 13:54   ` partially-applied: " Fabian Grünbichler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1786024383.mlfu794p79.astroid@yuna.none \
    --to=f.gruenbichler@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    --cc=s.sterz@proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal