HTTPS certs are missing trust roots

Server Version#: 11.43.4.10903-e5521bd8c
Player Version#: 4.16.

PMS serves an incomplete plex.direct certificate chain under Let’s Encrypt “Generation Y” (ISRG Root YR) — Remote Access permanently “Not Reachable”

Since my plex.direct wildcard certificate was renewed on 2026-09-20, it is issued under Let’s Encrypt’s new “Generation Y” hierarchy (Let's Encrypt YR2 → ISRG Root YR).

PMS serves only the leaf + the YR2 intermediate. It does not serve the cross-signed ISRG Root YR certificate (the one signed by the universally-trusted ISRG Root X1) that Let’s Encrypt publishes specifically for this transition.

ISRG Root YR is not yet in any shipping trust store — Let’s Encrypt lists it as “pending inclusion”. The result is that any client validating strictly (OpenSSL/GnuTLS, i.e. no AIA chasing) cannot build a path to a trusted root and aborts the handshake with unknown ca.

This includes Plex’s own reachability checker, so Remote Access is permanently stuck at Mapped - Not Published (Not Reachable) even though the port forward is open and verified reachable from the internet.

PMS version 1.43.4.10903-e5521bd8c
Platform Linux x86_64, plexinc/pms-docker:latest
Cert validity notBefore=Sep 20 10:01:11 2026 GMT / notAfter=Dec 19 10:01:10 2026 GMT
Remote Access manual port map, TCP/UDP 32400 → 32400, verified open externally

1. The served chain stops at an untrusted root

$ openssl s_client -connect 174-21-45-20.31564bb9326f4034a92f04c7a0f0016e.plex.direct:32400 \
    -servername 174-21-45-20.31564bb9326f4034a92f04c7a0f0016e.plex.direct -showcerts

 0 s:CN=*.31564bb9326f4034a92f04c7a0f0016e.plex.direct
   i:C=US, O=Let's Encrypt, CN=YR2
 1 s:C=US, O=Let's Encrypt, CN=YR2
   i:C=US, O=ISRG, CN=Root YR          <-- chain ends here; Root YR is not in trust stores
Verify return code: 20 (unable to get local issuer certificate)

Identical chain is served on the LAN path (192-168-1-3.<uuid>.plex.direct), so this is not a network/interception artifact.

2. Adding the published cross-sign resolves it — against the existing ISRG Root X1

Using the system trust store (which contains ISRG Root X1 and X2, but not Root YR):

# as served today
$ openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt -untrusted int-yr2.pem leaf.pem
error 20 at 1 depth lookup: unable to get local issuer certificate     FAIL

# with the cross-signed Root YR added to the chain (letsencrypt.org/certs/gen-y/root-yr-by-x1.pem)
$ openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt \
      -untrusted int-yr2.pem -untrusted root-yr-by-x1.pem leaf.pem
leaf.pem: OK                                                           PASS

# or by trusting the new root directly (letsencrypt.org/certs/gen-y/root-yr.pem)
$ openssl verify -CAfile root-yr.pem -untrusted int-yr2.pem leaf.pem
leaf.pem: OK                                                           PASS

So shipping the cross-signed Root YR in the served chain is sufficient and requires no trust-store changes anywhere.

3. Plex’s own infrastructure rejects the certificate

From Plex Media Server.log — note 34.202.97.122, which is Plex’s reachability checker:

CERT: incomplete TLS handshake from [::ffff:34.202.97.122]:31278: tlsv1 alert unknown ca (SSL routines)
[EventSourceClient/pubsub/pubsub04.pop.fmt.plex.bz:443] MyPlex: mapping state set to 'Mapped - Not Published (Not Reachable)'.

Many other clients on the network do the same:

CERT: incomplete TLS handshake from [::ffff:192.168.1.1]:48696:  tlsv1 alert unknown ca (SSL routines)
CERT: incomplete TLS handshake from [::ffff:192.168.1.240]:60744: tlsv1 alert unknown ca (SSL routines)
CERT: incomplete TLS handshake from 127.0.0.1:51768:              tlsv1 alert unknown ca (SSL routines)

4. Secondary issue: PMS’s bundled CA store also lacks Root YR

/usr/lib/plexmediaserver/Resources/cacert.pem (dated Aug 16 2026, 138 certificates) contains ISRG Root X1 but not ISRG Root YR. Because of this, PMS cannot validate its own certificate during the self-reachability check:

WARN - [HttpClient] HTTP error requesting GET https://174-21-45-20.<uuid>.plex.direct:32400/identity
       (60, SSL peer certificate or SSH remote key was not OK)
       (SSL certificate problem: unable to get local issuer certificate)
DEBUG - MyPlex: mapping state set to 'Mapped - Not Published'.

I confirmed this by appending root-yr.pem + root-yr-by-x1.pem to that bundle (140 certs) and restarting: the outbound self-check now returns http=200 ssl_verify=0 and the log error is gone. The inbound unknown ca rejections continue, because those depend on the chain PMS serves.

Impact

  • Remote Access is permanently unavailable; the UI reports the server as offline/indirect.
  • Strict-validating clients cannot connect over plex.direct at all.
  • LAN playback still works only because local clients fall back to plain HTTP (httpsRequired=0), which masks the problem for the owner while remote users are locked out.
  • Clients that perform AIA chasing (Apple, Windows/Schannel) can recover via the leaf’s CA Issuers - URI:``http://yr2.i.lencr.org/, which is likely why this is reported as intermittent/inconsistent across client platforms rather than a clean total failure.

Expected behaviour

PMS should serve the full chain for Gen-Y certificates:

leaf  *.<uuid>.plex.direct
  └─ Let's Encrypt YR2
       └─ ISRG Root YR  (cross-signed by ISRG Root X1)   <-- currently missing

References

Stop plex, remove the certificate.p12 file from the Cache directory in the Plex Media Server folder and start plex back up. It will download a new certificate, cert-v2.p12.

y’all that fixed it.

but man, what a stupid problem!

Independent confirmation of this on 1.43.4.10903 (Linux LXC), and your AIA-chasing point explains something that had me chasing my own tail for an hour — worth spelling out for anyone else debugging this:

curl on Windows/macOS will tell you the certificate is fine. Schannel and Secure Transport chase the leaf’s CA Issuers URI and fetch the missing cross-sign, so they validate happily. OpenSSL with a normal bundle does not, and neither does plex.tv’s checker:

openssl s_client -connect <server-ip>:32400 -servername <name>.plex.direct -CAfile /etc/ssl/certs/ca-certificates.crt </dev/null 2>/dev/null | grep 'Verify return code'
Verify return code: 20 (unable to get local issuer certificate)

I retracted a correct diagnosis on the strength of a passing curl before spotting that. Test with OpenSSL, not the OS stack.

On my side the inbound half looked exactly as you describe — every probe from plex.tv’s checkers (34.239.73.157, 34.202.97.122, 44.207.218.81) arrived, was NATed, reached the server and got answered, and the server logged:

CERT: incomplete TLS handshake from [::ffff:34.239.73.157]: tlsv1 alert unknown ca (SSL routines)
MyPlex: mapping state set to 'Mapped - Not Published (Not Reachable)'

A workaround that doesn’t need Plex to change anything: force an ECDSA certificate instead of the RSA Gen-Y one. Tick Settings → Network → Strict TLS configuration (it “switches to ECDSA certificates when renewing”), then stop the server, move Cache/certificate.p12 aside, and start it again — a restart alone won’t do it, since the server logs CERT: Certificate will not expire soon; we'll check again in a week.

The ECDSA chain is cross-signed the whole way down, so no AIA chasing is required:

 0 s:CN=*.<hash>.plex.direct            (ECDSA, NIST P-256)
   i:C=US, O=Let's Encrypt, CN=YE2
 1 s:C=US, O=Let's Encrypt, CN=YE2
   i:C=US, O=ISRG, CN=Root YE
 2 s:C=US, O=ISRG, CN=Root YE
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X2
 3 s:C=US, O=Internet Security Research Group, CN=ISRG Root X2
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1

Verify return code: 0 (ok)

Remote Access went green on the next probe. Caveat: Strict TLS also drops legacy ciphers, so old clients may fail (one local client here immediately logged no suitable signature algorithm) — that makes it a workaround rather than a fix, and your “PMS should serve the full chain” request is still the right ask.

My write-up of the same issue from the network side (firewall state, checker byte counts, the openssl output): Remote Access not reachable: plex.tv checker rejects our plex.direct cert (unknown ca)

Adding a Windows 11 occurrence from October 10, 2026.

Plex Media Server: 1.43.4.10903-e5521bd8c. Client: Plex for iOS on cellular data.

The phone initially reported unavailable libraries after signing out and back in. Local library reads and existing sharing permissions remained intact.

After fixing a separate connection-publication failure, the resources API now advertises the server’s current HTTPS addresses. Direct authenticated HTTPS requests using Python requests with normal certificate verification still fail with:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

The current served leaf certificate has issuer Let’s Encrypt YR1 and validity October 9, 2026 to January 7, 2027. An earlier certificate inspected during the same incident had issuer YR2. The cache contains certificate.p12; no cert-v2.p12 is present.

Redacted server-log excerpts, America/Chicago time:

Oct 10, 2026 05:48:15.219 ERROR - [CERT] Failed to parse intermediate certificate.
Oct 10, 2026 05:51:47.623 DEBUG - CERT: incomplete TLS handshake from [::ffff:<address>]:58629: tlsv1 alert unknown ca (SSL routines)

Remote Access still reports Not available outside your network. The iOS client can now browse and play over cellular, but the live session is secure and relayed, not a verified direct connection.

I have not completed full-chain analysis or replaced the cached certificate yet, so I am reporting the observed validation failure rather than asserting which exact chain certificate is missing. Please confirm whether this matches the Gen-Y chain issue and advise how to restore a complete trusted chain while preserving compatibility with older clients.

The separate publication issue and successful Ethernet-interface workaround are documented here: Servers.plex.tv Cloudflare WAF returns 403 "Sorry, you have been blocked" for any device - #2 by Alex_Stork