[pve-devel] [PATCH manager v2 1/1] renew pve-ssl.pem when it nearly expires
Dominik Csapak
d.csapak at proxmox.com
Tue Nov 26 11:01:22 CET 2019
but only if the cert is issued by the ca in /etc/pve/pve-root-ca.pem
(by checking the issuer and openssl verify)
this way we can reduce the lifetime of the certs without having
to worry that they ran out
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v1:
* only make checks if the cert expires soon (to avoid noise)
* do not check if ca is issued by pve (just try it and log if it fails)
* better comments
PVE/CertHelpers.pm | 6 ++++++
bin/pveupdate | 32 ++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git a/PVE/CertHelpers.pm b/PVE/CertHelpers.pm
index 52316aa0..7e088cb9 100644
--- a/PVE/CertHelpers.pm
+++ b/PVE/CertHelpers.pm
@@ -38,6 +38,12 @@ sub cert_path_prefix {
return "/etc/pve/nodes/${node}/pveproxy-ssl";
}
+sub default_cert_path_prefix {
+ my ($node) = @_;
+
+ return "/etc/pve/nodes/${node}/pve-ssl";
+}
+
sub cert_lock {
my ($timeout, $code, @param) = @_;
diff --git a/bin/pveupdate b/bin/pveupdate
index d131673e..4ab4d79e 100755
--- a/bin/pveupdate
+++ b/bin/pveupdate
@@ -12,10 +12,12 @@ use PVE::Certificate;
use PVE::NodeConfig;
use PVE::INotify;
use PVE::Cluster;
+use PVE::Cluster::Setup;
use PVE::DataCenterConfig;
use PVE::APLInfo;
use PVE::SafeSyslog;
use PVE::RPCEnvironment;
+use PVE::Tools;
use PVE::API2::Subscription;
use PVE::API2::APT;
use PVE::API2::ACME;
@@ -73,6 +75,36 @@ eval {
};
syslog ('err', "Renewing ACME certificate failed: $@") if $@;
+eval {
+ my $certpath = PVE::CertHelpers::default_cert_path_prefix($nodename).".pem";
+ my $capath = "/etc/pve/pve-root-ca.pem";
+
+ # check if expiry is < 2W
+ if (PVE::Certificate::check_expiry($certpath, time() + 14*24*60*60)) {
+ # get CA info
+ my $cainfo = PVE::Certificate::get_certificate_info($capath);
+
+ # get cert and check issuer and chain metadata
+ my $certinfo = PVE::Certificate::get_certificate_info($certpath);
+ if ($certinfo->{issuer} ne $cainfo->{subject}) {
+ die "SSL Certificate is not issued by root CA";
+ }
+
+ # check if cert is really signed by the ca
+
+ # TODO
+ # replace by low level interface in ssleay if version 1.86 is available
+ PVE::Tools::run_command(['/usr/bin/openssl', 'verify', '-CAfile', $capath, $certpath]);
+
+ # create new certificate
+ my $ip = PVE::Cluster::remote_node_ip($nodename);
+ PVE::Cluster::Setup::gen_pve_ssl_cert(1, $nodename, $ip);
+ print "Restarting pveproxy after renewing certificate\n";
+ PVE::Tools::run_command(['systemctl', 'reload-or-restart', 'pveproxy']);
+ }
+};
+syslog ('err', "Checking/Renewing SSL certificate failed: $@") if $@;
+
sub cleanup_tasks {
my $taskdir = "/var/log/pve/tasks";
--
2.20.1
More information about the pve-devel
mailing list