Skip to main content
Version: 10.0

TLS troubleshooting

If TLS is enabled but clients cannot connect, use this checklist to verify the effective server setup and client compatibility.

1. Verify webPDF configuration and startup logs​

Check the HTTPS connector in conf/server.xml:

<connector enabled="true" port="8443" address="">
<ssl ...>
<protocols>
<protocol>TLSv1.2</protocol>
<protocol>TLSv1.3</protocol>
</protocols>
<ciphers forceOrder="false">
<cipher>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</cipher>
</ciphers>
</ssl>
</connector>

After restart, verify startup log entries for the HTTPS connector:

  • Starting SSL connector '...'
  • Using SSL protocols '...' for '...'
  • Using SSL ciphers ... '...' for '...'
  • Using '...' keystore '...' for '...'

If these entries are missing, the connector is usually disabled, not loaded, or failed during startup.

2. Verify negotiated TLS version and cipher​

Use OpenSSL from a client system and always send SNI (-servername):

openssl s_client -connect <host>:8443 -servername <host> < /dev/null

In the output, check:

  • Protocol : ...
  • Cipher : ...
  • certificate subject / issuer

Test specific TLS versions​

# force TLS 1.2
openssl s_client -connect <host>:8443 -servername <host> -tls1_2 < /dev/null

# force TLS 1.3
openssl s_client -connect <host>:8443 -servername <host> -tls1_3 < /dev/null

If one command fails and the other succeeds, there is a protocol mismatch between client and server policy.

Test specific ciphers​

For TLS 1.2 and older:

openssl s_client -connect <host>:8443 -servername <host> -tls1_2 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' < /dev/null

For TLS 1.3:

openssl s_client -connect <host>:8443 -servername <host> -tls1_3 -ciphersuites 'TLS_AES_128_GCM_SHA256' < /dev/null
tip

OpenSSL uses -cipher for TLS 1.2 and -ciphersuites for TLS 1.3.

For deeper cipher matching checks (server offers vs client supports), see Ciphers.

3. Verify certificate chain presented by server​

openssl s_client -connect <host>:8443 -servername <host> -showcerts < /dev/null

Check that:

  • server certificate is correct for hostname (CN/SAN)
  • intermediate certificates are present
  • certificate is not expired

4. Verify whether the client supports your policy​

A handshake works only if both sides share at least one protocol and one cipher.

Check local OpenSSL capabilities:

openssl version
openssl ciphers -v | grep -E 'TLS_AES_128_GCM_SHA256|TLS_AES_256_GCM_SHA384|ECDHE'

For Java clients, check runtime and disabled algorithms (can remove old/weak options):

java -version
java -XshowSettings:security -version 2>&1 | grep -i 'jdk.tls.disabledAlgorithms'

If needed, test from the exact client environment (same JRE/container/OS image), not only from an admin workstation.

5. Provider-specific environments (Azure, AWS, SAP)​

In cloud and enterprise setups, TLS is often terminated or filtered before webPDF. Always test both paths:

  • external path: client -> public endpoint (for example App Gateway, ALB, reverse proxy)
  • internal path: client (or bastion) -> webPDF directly (<host>:8443)

If external fails but internal works, the issue is usually in the gateway/proxy TLS policy.

Azure​

  • Check TLS policy and SNI handling on Application Gateway / Front Door.
  • Test using the real FQDN:
openssl s_client -connect <fqdn>:443 -servername <fqdn> -tls1_2 < /dev/null
  • If backend TLS is enabled, also test direct access to webPDF (:8443) from the same network.

AWS​

  • ALB usually terminates TLS, NLB can pass TLS through.
  • Test public endpoint and internal webPDF endpoint separately.
  • Compare negotiated protocol/cipher and presented certificate on both hops.

SAP environments​

  • Test from the real SAP runtime host (same network, same runtime).
  • Verify Java/runtime crypto policy and trust configuration.
  • Typical client-side issue: trust chain not available in SAP/JRE trust store.
  • On ABAP systems, TLS capabilities depend on SAP Kernel patch level (disp+work) and CommonCryptoLib.
  • NetWeaver stack matters: ABAP and Java stacks can have different TLS behavior and trust handling.
  • Deployment model matters:
    • On-premise: TLS behavior is strongly influenced by kernel and crypto library level.
    • S/4HANA Cloud: TLS behavior is mainly governed by platform-managed communication setup and tenant configuration.
  • For analysis, always capture landscape context (On-Prem / S/4HANA Cloud, ABAP / Java stack, and runtime generation) before comparing failures.

6. Client runtimes (programming languages)​

Different runtimes use different TLS defaults. Test from the exact runtime/container used in production.

Java​

java -version
java -XshowSettings:security -version 2>&1 | grep -i 'jdk.tls.disabledAlgorithms'

.NET​

dotnet --info

In code, use HttpClientHandler.SslProtocols if you must pin protocol versions.

Node.js​

node -v
node -p "process.versions.openssl"

In code, set minVersion / maxVersion in https options if needed.

Python​

python -c "import ssl; print(ssl.OPENSSL_VERSION)"

In code, use ssl.SSLContext and set minimum_version / maximum_version.

Go​

go version

In code, configure tls.Config (MinVersion, MaxVersion; CipherSuites for TLS 1.2).

PHP​

php -i | grep -i -E 'OpenSSL|SSL Version'

For client calls, verify TLS settings in cURL or stream context options.

7. Quick matrix (first checks)​

EnvironmentTypical issueFirst check
Direct client -> webPDFProtocol/cipher mismatchopenssl s_client -connect <host>:8443 -servername <host> -tls1_2 and -tls1_3
Azure App Gateway / Front DoorTLS policy mismatch, SNI/routingopenssl s_client -connect <fqdn>:443 -servername <fqdn> plus internal :8443 test
AWS ALB/NLBTLS termination vs pass-through confusionCompare public endpoint handshake vs internal webPDF handshake
SAP NetWeaver ABAPKernel/crypto library limitationsCheck disp+work -version, then test from SAP host with openssl s_client
SAP NetWeaver JavaJRE trust/protocol policyjava -version and jdk.tls.disabledAlgorithms; test from same runtime host
Containerized clientsDifferent runtime/OpenSSL than workstationRun checks inside container image (not only on admin machine)

8. Common error patterns​

  • alert protocol version Server and client do not share an enabled TLS protocol.
  • no shared cipher or handshake_failure No common cipher (or cipher restricted by TLS version / JDK policy).
  • PKIX path building failed (Java client) Client does not trust the issuing CA chain.
  • Certificate shown by s_client is unexpected Missing -servername (SNI), wrong virtual host binding, or wrong certificate alias.

9. Fast fallback for isolation​

For quick isolation, temporarily use:

  • protocols: TLSv1.2 and TLSv1.3
  • ciphers: default (JDK default)

If this works, reintroduce custom cipher restrictions step by step until the failing entry is identified.