Azure App Service is a service used to create and deploy scalable, mission-critical web apps.
I reproduced this with the official App Service Python image, and the cause turned out to be the opposite of what it looks like: Aspose.Words' embedded .NET runtime can't use OpenSSL 3 or ICU 72, and it needs OpenSSL 1.1.
What I tested
I ran aspose-words==26.2.0 in Docker and called License().set_license(...) with a dummy license file, which makes Aspose load its cryptography:
- Current App Service image
mcr.microsoft.com/appsvc/python:3.11_20261022.4.tuxprod(Debian 12, OpenSSL 3.0.22, ICU 72):Couldn't find a valid ICU package installed on the system
Same image with CLR_ICU_VERSION_OVERRIDE=72: No usable version of libssl was found, the same error you get
Debian 11 with OpenSSL 1.1.1w and ICU 67: works, and the license is checked normally
Debian 12 image with OpenSSL 1.1 added (steps below): works, and creating and saving a document works too
The latest version, aspose-words==26.10.0, behaves the same way.
So the error appears when the system only has OpenSSL 3, which is what the current App Service Python image ships. Please double-check what your app container runs with cat /etc/debian_version and openssl version from the portal's SSH session. Your error pattern matches the Debian 12 image.
Why the earlier attempts didn't help
Copying Debian 12's libssl.so.3 onto Debian 11 can't work: it fails to load with version `GLIBC_2.33' not found, because Debian 11 has glibc 2.31. Either way, this runtime doesn't use OpenSSL 3.
CLR_OPENSSL_VERSION_OVERRIDE=1.1 can only choose a version that's present, and the current image has no OpenSSL 1.1.
libicu-dev doesn't fix the ICU error on the Debian 12 image. The runtime doesn't find ICU 72 by itself, and CLR_ICU_VERSION_OVERRIDE=72 is what makes it use it.
Workaround that worked
Step 1. Open SSH to the app container and put Debian 11's OpenSSL 1.1 libraries in persistent storage. This uses the security-patched build from Debian's archive, with its published SHA-256:
mkdir -p /home/site/libs && cd /tmp
curl -fLO https://archive.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.1_1.1.1w-0+deb11u8_amd64.deb
echo "dcc68a543de6cb955a57077b66dcdb15f61d1e31e072f2c6cc4082c37da1b00d libssl1.1_1.1.1w-0+deb11u8_amd64.deb" | sha256sum -c
dpkg -x libssl1.1_1.1.1w-0+deb11u8_amd64.deb x
cp x/usr/lib/x86_64-linux-gnu/libssl.so.1.1 x/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 /home/site/libs/
Files under /home persist across restarts, so this is a one-time step.
Step 2. Add two App settings (Settings → Environment variables), then restart:
LD_LIBRARY_PATH = /home/site/libs
CLR_ICU_VERSION_OVERRIDE = 72
Step 3. Undo the earlier workarounds: the copied .so.3 files, CLR_OPENSSL_VERSION_OVERRIDE, and the apt-get install in the startup command.
In my test, Python's own ssl module still used OpenSSL 3.0.22 with this LD_LIBRARY_PATH, so the rest of your app isn't affected.
Caveats
OpenSSL 1.1 is end of life upstream, so treat this as a stopgap. I'd raise it with Aspose support and ask for a build whose embedded runtime supports OpenSSL 3 and newer ICU versions.
72 matches the ICU version in today's image. If a future image update moves to a newer ICU, update CLR_ICU_VERSION_OVERRIDE to match (ls /usr/lib/x86_64-linux-gnu | grep libicuuc shows the version).
Let me know what cat /etc/debian_version shows in SSH. If this solves it, please consider marking it as the accepted answer so others with the same problem can find it.