Skip to main content

    How to Install an SSL Certificate on Proxmox VE

    Replace the self-signed certificate on Proxmox VE without breaking the cluster: which file is yours, the pvenode command, and what repeats per node.

    MS
    My-SSL Team
    ·
    14 min read
    ·
    Published August 28, 2026
    ·
    Last updated August 28, 2026

    The short answer

    Proxmox VE warns in every browser because it serves a certificate from a CA it generated for itself. Replacing it means creating two files, pveproxy-ssl.pem and pveproxy-ssl.key under /etc/pve/local, and leaving the node’s pve-ssl.pem exactly where it is, because that one is what the cluster uses to talk to itself. On a cluster the job repeats per node: /etc/pve/local resolves to a different directory on every machine even though the filesystem underneath is shared.

    The three certificate files on a Proxmox VE node and which one an administrator may replaceA Proxmox VE node holds three certificate artefacts. The first, pve-root-ca.pem in /etc/pve, is the certificate authority the cluster generated for itself and signs every node certificate; it must not be touched. The second, pve-ssl.pem and pve-ssl.key under /etc/pve/nodes/NODENAME, is the node certificate that CA signed, and nodes present it to each other for cluster and API traffic; overwriting it breaks cluster communication. The third, highlighted, pveproxy-ssl.pem and pveproxy-ssl.key under /etc/pve/local, does not exist until an administrator creates it, and once it does the pveproxy service serves it to browsers on port 8006 instead of the self-signed node certificate. This third pair is the only one a commercial certificate should ever be written to.Three certificate files. One of them is yours./etc/pve/pve-root-ca.pemThe CA the cluster generated for itself when it was created.Signs every node certificate below it.Leave alone/etc/pve/nodes/NODENAME/pve-ssl.pem + .keyThe node certificate, signed by the cluster CA.Nodes present it to each other. Overwrite it and the cluster stops trusting itself.Leave alone/etc/pve/local/pveproxy-ssl.pem + .keyDoes not exist until you create it.Once it does, pveproxy serves it to browsers on port 8006.Your certificate
    Every Proxmox certificate disaster starts one row too high. The commercial certificate goes in the gold row and nowhere else.

    Which certificate file does Proxmox actually use?

    A Proxmox VE node keeps three certificate artefacts and only one of them is yours to write. /etc/pve/pve-root-ca.pem is the certificate authority the cluster generated for itself. /etc/pve/nodes/NODENAME/pve-ssl.pem is the node certificate that CA signed, and node-to-node traffic depends on it. /etc/pve/local/pveproxy-ssl.pem does not exist until you create it; once it does, pveproxy serves it to browsers instead.

    That third file is an override rather than a replacement, which is the design decision worth understanding before you touch anything. Proxmox never stops using its internal PKI. You are not swapping the cluster’s identity for a commercial one; you are adding a second certificate that only the web proxy on port 8006 knows about, and leaving everything underneath as it was.

    The upstream documentation is unusually blunt about this: “Do not replace or manually modify the automatically generated node certificate files in /etc/pve/local/pve-ssl.pem and /etc/pve/local/pve-ssl.key or the cluster CA files.” The names differ by seven characters, which is most of the reason people get this wrong.

    FileWhat it doesYours to change?
    /etc/pve/pve-root-ca.pemThe cluster’s own CA, created with the cluster and signing every node certificate.No
    /etc/pve/nodes/NODENAME/pve-ssl.pem
    /etc/pve/nodes/NODENAME/pve-ssl.key
    The node certificate. Nodes present it to each other for cluster and API traffic.No
    /etc/pve/local/pveproxy-ssl.pem
    /etc/pve/local/pveproxy-ssl.key
    Optional override. When present, this is what browsers and API clients on port 8006 are shown.Yes, this is the one

    What you need before you start

    Four things, and the install takes about a minute once you have them: a hostname the certificate covers and DNS that resolves it, the issued certificate in PEM form with its intermediates, the matching private key with no passphrase on it, and root access to the node either over SSH or through the shell in the web interface. Nothing here needs the host to be reachable from the public internet.

    The passphrase point is worth taking seriously because it causes more failed installs than anything else. Proxmox does not prompt for one, so an encrypted key simply fails to parse and you get an unhelpful error about the key being invalid. If you generated the key yourself and chose a password, strip it first, the file is going onto a root-only filesystem on a machine that already has your hypervisor on it, and a passphrase nobody can type at boot buys nothing.

    Remove a passphrase, and check the key matches the certificate
    # strip the passphrase (asks for the old one once)
    openssl pkey -in privkey-encrypted.pem -out privkey.pem
    
    # these two hashes must be identical
    openssl x509 -noout -modulus -in cert.pem | openssl sha256
    openssl pkey  -noout -modulus -in privkey.pem | openssl sha256

    If you have not generated the request yet, the guide to generating a CSR covers the openssl side, and certificate formats and conversions is the one to read if your CA sent you a .p7b or .pfx and Proxmox will not take it.

    Which certificate to buy for a Proxmox host

    The host needs a name a public CA is allowed to sign, and a great many Proxmox hosts do not have one. Since 11 November 2015 the CA/Browser Forum has prohibited publicly trusted certificates for internal server names and reserved IP addresses, so pve.lan, proxmox.local and 192.168.1.50 are all refused. Give the machine a name under a domain you own and the problem disappears.

    This trips people up because the instinct is that a public certificate needs a public server. It does not. Point pve.example.com at 192.168.1.50 in whatever DNS your network uses, prove control of example.com to the CA with a DNS record, and you get a certificate for a host that has never accepted a connection from outside your building. If renaming the node is off the table, the options for internal server names are worth reading before you buy anything, because the answer there is usually a private CA rather than a public one.

    Then it comes down to how many hosts you are covering. A single node needs a single-name certificate. Three nodes plus a backup server is where a wildcard certificate covering every subdomain usually wins, because you install the same file everywhere and adding a fourth node later needs no new certificate at all. If your hosts sit under different domains, a multi-domain certificate is the shape that fits instead, the comparison of wildcard and multi-domain coverage sets out which is which. Validation level barely matters for a management interface nobody outside the company sees, so a domain-validated certificate is usually the sensible purchase unless an auditor has asked for organisation details in the subject.

    Installing it from the web interface

    Select the node in the left-hand tree, open System then Certificates, and click Upload Custom Certificate. Paste the private key into the top box and the certificate chain into the bottom one, leaf first, then confirm. Proxmox writes the pveproxy-ssl pair, restarts pveproxy, and your browser session drops for a couple of seconds while it comes back on the new certificate.

    Two details decide whether this works first time. The chain box wants the leaf certificate at the top and any intermediates underneath it, in order, with the root left out, a chain built the other way round loads in a desktop browser and then fails on anything with a stricter verifier, which is a miserable way to discover the mistake a week later. And the key box wants the decrypted key, for the reason covered above.

    The same screen is where the existing certificates are listed, and it is worth a look before you upload anything. You will see the pve-ssl pair issued by the cluster CA and, once you have uploaded, the pveproxy-ssl pair alongside it. Both being present is the correct end state.

    Installing it from the command line

    pvenode cert set does the same job and is the one to use if you intend to script renewals. It takes the certificate and the key as file arguments, writes them to the pveproxy-ssl pair for the node you run it on, and with --restart reloads the proxy so the change takes effect immediately. --force is what lets it overwrite a custom certificate that is already there, so every run after the first one needs it.

    Build the chain and install it
    # leaf first, then intermediates. No root.
    cat cert.pem intermediate.pem > fullchain.pem
    
    # install on THIS node and reload the web proxy
    pvenode cert set fullchain.pem privkey.pem --force --restart

    Verify from somewhere else rather than trusting the absence of an error. The check below asks the node what it is actually serving on port 8006 and prints the subject and the dates, which also tells you whether the chain arrived intact, a verify error: unable to get local issuer certificate in the output means an intermediate is missing from the file you installed.

    Check what the node is serving
    openssl s_client -connect pve.example.com:8006 \
      -servername pve.example.com -showcerts </dev/null 2>/dev/null \
      | openssl x509 -noout -subject -issuer -dates

    What changes when you have a cluster

    The certificate is shared and the installation is not. /etc/pve is the Proxmox cluster filesystem, so every node sees every other node’s directory under /etc/pve/nodes/. But /etc/pve/local is a runtime symlink that resolves to the directory named after the machine you are standing on, which means pvenode cert set writes somewhere different depending on where you run it. Run it on each node.

    How one certificate is installed across a three-node Proxmox clusterOne wildcard certificate covering pve1, pve2 and pve3 under the same domain is issued once. Below it, the Proxmox cluster filesystem mounted at /etc/pve is shared by all three nodes, so the directories /etc/pve/nodes/pve1, /etc/pve/nodes/pve2 and /etc/pve/nodes/pve3 are visible from every machine. On each node, the path /etc/pve/local is a runtime symlink pointing at that node's own directory, which is why the pvenode cert set command writes to a different destination depending on where it is run. The conclusion, highlighted at the bottom, is that the certificate is bought once and the install command is run three times, once per node.One certificate, three installs*.example.com/etc/pve, one filesystem, replicated to every nodeevery node can see every other node’s directorypve1/etc/pve/localresolves to/etc/pve/nodes/pve1pve2/etc/pve/localresolves to/etc/pve/nodes/pve2pve3/etc/pve/localresolves to/etc/pve/nodes/pve3Buy the certificate once. Run pvenode cert set once per node.A shared filesystem does not mean a shared web certificate
    The shared filesystem is what fools people into installing once and wondering why the other two nodes still warn.

    The consequence people find counterintuitive is that you can watch the certificate appear in /etc/pve/nodes/pve1/ from a shell on pve2, conclude the job is done, and still get a warning when you browse to pve2. It is genuinely the same filesystem. The node just only ever serves the file in its own directory.

    Order matters in one situation. If you are building a new cluster and installing certificates at the same time, create the cluster and join the nodes first, then install certificates. Joining a node causes it to be issued a fresh pve-ssl certificate by the cluster CA, and doing that work in the other order means doing it twice.

    Three nodes, one wildcard, from an admin workstation
    for node in pve1 pve2 pve3; do
      scp fullchain.pem privkey.pem root@"$node".example.com:/root/
      ssh root@"$node".example.com \
        'pvenode cert set /root/fullchain.pem /root/privkey.pem --force --restart'
    done

    Leave a gap between nodes if anyone is using the interface, since each --restart drops sessions on that node for a second or two. Guests are unaffected either way, pveproxy serves the web interface and the API, and has nothing to do with whether a virtual machine is running.

    Proxmox Backup Server is a separate job

    Proxmox Backup Server has its own paths, its own service and its own port. The certificate and key go to /etc/proxmox-backup/proxy.pem and /etc/proxmox-backup/proxy.key, owned by root:backup with mode 0640, and proxmox-backup-proxy.service has to be restarted before anything changes on port 8007. None of the pvenode commands apply here.

    Why replacing the Proxmox Backup Server certificate stops backups until the stored fingerprint is updatedOn the left, a Proxmox VE node holds a storage entry for the backup server that records the server’s certificate fingerprint. On the right, the Proxmox Backup Server presents its certificate on port 8007. Before the swap, the two fingerprints agree and the backup job connects. After a new certificate is installed on the backup server, its fingerprint changes while the value saved in the Proxmox VE storage entry does not, so the connection is refused and backup jobs fail. The highlighted note at the bottom states the fix: update the fingerprint in the storage configuration in the same maintenance window as the certificate.The backup server keeps a second copy of the problemProxmox VE storage entryholds the fingerprint it wasgiven when the datastorewas first addedProxmox Backup Serverpresents its certificate onport 8007new certificate, new fingerprintResult: backup jobs fail on connection, and nothing in the certificate install said they wouldFix: update the fingerprint in the storage entry in the same window as the certificate
    This one usually surfaces at 2am, because that is when the backup job runs and not when the certificate was swapped.

    The part that catches people is what happens on the other side. When you added the datastore to Proxmox VE, the storage entry recorded the backup server’s certificate fingerprint, and that stored value does not update itself when the certificate changes. The web interface stays perfectly happy; the backup job fails on connection at whatever hour it runs. Update the fingerprint under Datacenter then Storage then your PBS entry in the same maintenance window as the certificate and the problem never happens.

    Install on the backup server, then read the new fingerprint
    install -o root -g backup -m 0640 fullchain.pem /etc/proxmox-backup/proxy.pem
    install -o root -g backup -m 0640 privkey.pem   /etc/proxmox-backup/proxy.key
    systemctl restart proxmox-backup-proxy.service
    
    # the value to paste into the Proxmox VE storage entry
    openssl x509 -in /etc/proxmox-backup/proxy.pem -noout -fingerprint -sha256

    Renewal after the 2026 lifetime cuts

    Since 15 March 2026, publicly trusted TLS certificates max out at 200 days under CA/Browser Forum ballot SC-081v3, and the ceiling falls to 100 days in March 2027 and 47 days in March 2029. A three-node cluster that used to need one manual install round a year now needs two, then four, then eight. The install did not get harder. It got frequent.

    How many manual certificate installs a three-node Proxmox cluster needs per year under the SC-081v3 scheduleFour bands along a timeline. Before 15 March 2026, a certificate could last 398 days, so a three-node cluster needed about three manual installs a year. From 15 March 2026, highlighted as the period in force today, the maximum is 200 days and the same cluster needs about six. From 15 March 2027 the maximum falls to 100 days and the figure roughly doubles again to about eleven. From 15 March 2029 the maximum is 47 days, which works out at roughly twenty-three installs a year for three nodes. The chart makes the point that manual installation stops being viable somewhere between the second and third band.Manual installs per year, three-node clusterbefore 15 Mar 2026398 days3installs a yearfrom 15 Mar 2026200 days6in force todayfrom 15 Mar 2027100 days11installs a yearfrom 15 Mar 202947 days23installs a yearSomewhere in the second band, remembering to do it stops being a plan
    The certificate did not get harder to install. It just started needing installing far more often, and per node.

    Proxmox has an answer built in, and it is better known for Let’s Encrypt than it deserves to be. Version 8.2 added support for custom ACME directories with external account binding, so if your certificate authority publishes an ACME endpoint you can register against it with the key ID and HMAC key the CA issues you, and pve-daily-update.service will renew anything within 30 days of expiry without anyone logging in. The external account binding fields live in pvenode on the command line rather than in the web interface, which is why the feature is easy to miss.

    Register against a commercial ACME endpoint
    # choose "Custom" at the directory prompt, paste your CA's ACME URL,
    # then supply the EAB key id and HMAC key the CA gave you
    pvenode acme account register default admin@example.com
    
    # attach the name this node should be issued, then order
    pvenode config set --acme domains=pve1.example.com
    pvenode acme cert order

    DNS-01 is the challenge type to use here, since it needs no inbound port 80 and works for a host that is not exposed at all; the comparison of ACME challenge types covers what each one proves. Where no ACME endpoint exists, the fallback is a short script that fetches the renewed files and ends in pvenode cert set --force --restart. Either way, the direction of travel is fixed, why automation stops being optional in 2027 and the full SC-081v3 timeline both set out what the calendar looks like from here.

    When it goes wrong

    Most Proxmox certificate failures are one of five things, and none of them locks you out permanently. SSH and the physical console never depend on the web certificate, so however badly the upload goes, you always have a way back in. That is worth remembering before the first attempt rather than during it.

    What you seeCauseFix
    The key is rejected as invalidIt is passphrase protected, or it does not match the certificateopenssl pkey to decrypt; compare moduli to confirm the pair
    Browser is fine, other clients complainIncomplete or wrongly ordered chainRebuild leaf-first with intermediates, reinstall
    Old certificate still servedpveproxy was never reloadedsystemctl restart pveproxy
    One node still warns after installInstalled on one node onlyRun pvenode cert set on that node too
    Nodes unreachable, consoles will not openpve-ssl was overwritten instead of pveproxy-sslRegenerate from the cluster CA, then restart the proxy

    The last row is the one that feels like a disaster and is not. Delete whatever you wrote over the node certificate, ask the cluster CA to reissue it, and restart the proxy. The cluster CA still exists. That is the whole reason the guidance is to leave it alone.

    Undo an overwritten node certificate
    # remove the custom override if it is part of the mess
    rm -f /etc/pve/local/pveproxy-ssl.pem /etc/pve/local/pveproxy-ssl.key
    
    # reissue this node's pve-ssl pair from the cluster CA
    pvecm updatecerts --force
    systemctl restart pveproxy

    That returns the node to the self-signed state it shipped in, warning and all, which is the right place to start again from. If a broken chain was the problem rather than a broken node certificate, how certificate chains break and how to repair them goes through the diagnosis properly.

    FAQ

    Frequently Asked Questions

    Get instant answers to common questions about SSL certificates and our services.

    Still Have Questions?

    Our SSL experts are available 24/7 to help with any questions about certificates, installation, or technical issues.

    Working out what a cluster actually needs

    Count the hostnames rather than the machines. One node is a single-name certificate; several nodes under one domain, plus a backup server and whatever else lives on that domain, is usually a wildcard. Both options list what they cover and what validation involves, which is enough to size the purchase before committing to it.

    Compare SSL certificate options for server and appliance hostnames