Aspose.Words (embedded .NET) on Azure App Service Linux (Python) fails with "No usable version of libssl was found" — base image is bullseye/OpenSSL 1.1, .NET needs OpenSSL 3

Prasanna Sai Kommineni 90 Reputation points
2026-10-24T00:32:48.5333333+00:00

Environment

  • Azure App Service on Linux, code deploy (Oryx build, not a custom container).
  • Runtime stack: Python 3.11 (startup banner shows Python version : 3.11.15).
  • Base OS confirmed via SSH: Debian 11 (bullseye), OpenSSL 1.1.1w, only libssl.so.1.1 present (no libssl.so.3).
  • App: FastAPI + gunicorn/uvicorn. One dependency is aspose-words==26.2.0, which embeds a .NET runtime.

Problem When the app calls aspose.words.License().set_license(...), the worker is killed with SIGABRT and the log shows:

Process terminated. Couldn't find a valid ICU package installed on the system. ...

and, after resolving ICU, the next crash:

No usable version of libssl was found

   at Aspose.WrpGen.Interop.GenericMarshaler..cctor()

   at WrpNs_Aspose.WrpNs_Words.WrpCs_License_A6872448.call_000_SetLicense(...)

          • The worker then loops: Booting worker → No usable version of libssl was found → SIGABRT → repeat.

What I've already tried

ICU — installing libicu-dev via apt in the startup command fixed the ICU error (confirmed libicu in ldconfig -p). Error then moved to the libssl one above.

DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true app setting — ignored by Aspose's embedded .NET (ICU error persisted until I installed libicu).

CLR_OPENSSL_VERSION_OVERRIDE=1.1 app setting (confirmed present) — still No usable version of libssl was found. This suggests Aspose's bundled .NET requires OpenSSL 3, which the bullseye base image does not provide.

Provided OpenSSL 3 manually: in a startup script (running as root), downloaded libssl3_3.0.20-1~deb12u2_amd64.deb from the Debian bookworm pool into persistent /home/site/libs, dpkg -x extracted libssl.so.3 + libcrypto.so.3 (confirmed on disk), then:

  • export LD_LIBRARY_PATH=/home/site/libs/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH, and
    • cp the two .so.3 files into /usr/lib/x86_64-linux-gnu/ + ldconfig.
    Still No usable version of libssl was found. Changing the Python stack to 3.12 — the runtime still resolves to a bullseye/OpenSSL 1.1 base, so no OpenSSL 3.

Constraints

  • Cannot use a custom Docker container for this app.
  • Corporate network with SSL inspection (the Debian mirror download does succeed).
  • and, after resolving ICU, the next crash: No usable version of libssl was found    at Aspose.WrpGen.Interop.GenericMarshaler..cctor()    at WrpNs_Aspose.WrpNs_Words.WrpCs_License_A6872448.call_000_SetLicense(...) The worker then loops: Booting worker → No usable version of libssl was found → SIGABRT → repeat. What I've already tried
    1. ICU — installing libicu-dev via apt in the startup command fixed the ICU error (confirmed libicu in ldconfig -p). Error then moved to the libssl one above.
    2. DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true app setting — ignored by Aspose's embedded .NET (ICU error persisted until I installed libicu).
    3. CLR_OPENSSL_VERSION_OVERRIDE=1.1 app setting (confirmed present) — still No usable version of libssl was found. This suggests Aspose's bundled .NET requires OpenSSL 3, which the bullseye base image does not provide.
    4. Provided OpenSSL 3 manually: in a startup script (running as root), downloaded libssl3_3.0.20-1~deb12u2_amd64.deb from the Debian bookworm pool into persistent /home/site/libs, dpkg -x extracted libssl.so.3 + libcrypto.so.3 (confirmed on disk), then:
      • export LD_LIBRARY_PATH=/home/site/libs/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH, and
      • cp the two .so.3 files into /usr/lib/x86_64-linux-gnu/ + ldconfig.
      Still No usable version of libssl was found.
    5. Changing the Python stack to 3.12 — the runtime still resolves to a bullseye/OpenSSL 1.1 base, so no OpenSSL 3.
    Constraints
    • Cannot use a custom Docker container for this app.
    • Corporate network with SSL inspection (the Debian mirror download does succeed).
Azure App Service
Azure App Service

Azure App Service is a service used to create and deploy scalable, mission-critical web apps.


2 answers

Sort by: Oldest
  1. AI answer

    2026-10-24T00:33:59.93+00:00

    Installing OpenSSL 3 is not the supported fix for this Aspose package: Aspose.Words for Python via .NET identifies libssl1.1 as its Linux dependency, so the next action is to have Aspose provide or identify a build compatible with the Azure App Service built-in Python image—or move the Aspose operation to hosting where its native runtime can be controlled.^1^^2^

    What the current evidence means

    Your conclusion that Aspose 26.2.0 necessarily requires OpenSSL 3 is not established. The publisher’s documented dependency points in the opposite direction—toward OpenSSL 1.1—and Aspose has a matching report for this exact error.^3^

    Because Bullseye already exposes libssl.so.1.1, the error can mean more than “the SONAME is absent.” The embedded runtime may be:

    • loading a different native library than expected;
    • finding libssl.so.1.1 but failing to resolve one of its dependencies or symbols;
    • shipping a native component built for a different ABI;
    • rejecting the loaded OpenSSL implementation during initialization.

    Consequently, extracting Bookworm’s libssl.so.3 into Bullseye does not resolve the documented Aspose dependency. Mixing shared libraries from different Debian releases can also leave unresolved transitive dependencies even when the .so files exist.

    Capture the precise loader failure for Aspose

    Run this from the app’s SSH session before Gunicorn starts, replacing the package path only if necessary:

    ASPOSE_DIR="$(python -c 'import aspose,os; print(os.path.dirname(aspose.__file__))')"
    
    find "$ASPOSE_DIR" -type f -name '*.so' -print \
      -exec sh -c 'echo "== $1"; ldd "$1" | grep -E "ssl|crypto|not found"' _ {} \;
    
    ldconfig -p | grep -E 'libssl|libcrypto'
    readelf -d /usr/lib/x86_64-linux-gnu/libssl.so.1.1 | grep SONAME
    

    Then reproduce the smallest failing call under the dynamic loader’s diagnostics:

    LD_DEBUG=libs,versions \
    python -c '
    import aspose.words as aw
    lic = aw.License()
    lic.set_license("/home/site/wwwroot/license.lic")
    ' 2>/home/LogFiles/aspose-loader.log
    

    The log should distinguish:

    • libssl.so.1.1 => not found: library search/visibility problem.
    • version 'OPENSSL_…' not found or undefined symbol: binary or symbol-version incompatibility.
    • The correct library loads, followed by the same Aspose abort: escalate to Aspose with the loader log and package version.

    .NET native loading uses platform library-name variations and the operating system’s native-library search behavior.^4^

    Do not repeat the OpenSSL 3 extraction or copy Bookworm libraries into /usr/lib; it does not match Aspose’s stated dependency and is not a durable deployment model.

    Supported paths under your constraints

    Azure controls the OS and application stack of built-in App Service images. Applications that require control over native OS components must use a custom image or another hosting model.^5^

    Since a custom container is prohibited, the practical options are:

    1. Open an Aspose support case with:
      • aspose-words==26.2.0;
      • Python 3.11.15;
      • Debian 11 and x86-64;
      • output from ldd, ldconfig, and aspose-loader.log;
      • the minimal License.set_license() reproduction.
      Ask specifically which OpenSSL SONAME/ABI 26.2.0 targets and whether a compatible wheel or corrected build is available for this App Service image.
    2. Use an Aspose version explicitly confirmed by Aspose to support this exact image. Do not downgrade speculatively; verify the version and security/support implications with the publisher first.
    3. Move only document processing to a separately hosted service whose OS dependencies you can control, while leaving FastAPI on the existing code-deployed App Service.

    Changing Python 3.11 to 3.12 is not expected to solve an embedded native-runtime ABI conflict when both selected built-in images remain Bullseye. App Service’s documented route for an unsupported runtime or OS requirement is a custom container.^6^

    Also, CLR_OPENSSL_VERSION_OVERRIDE does not install or convert OpenSSL libraries; it only selects a preferred version. It was renamed to DOTNET_OPENSSL_VERSION_OVERRIDE starting with .NET 10, so changing the variable name is relevant only if Aspose confirms its embedded runtime is .NET 10.^7^


    References

    1. System Requirements|Aspose.Words for Python via .NET
    2. Dependency of libssl1.1 for Aspose.words for Python via .Net
    3. Python error: No usable version of libssl was found
    4. Native library loading
    5. Azure App Service OS and runtime patching
    6. Configure a Linux Python app for Azure App Service
    7. Environment variable renamed to DOTNET_OPENSSL_VERSION_OVERRIDE
    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

  2. Paul Thomas 80 Reputation points
    2026-10-28T14:57:37.9866667+00:00

    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.

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.