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.


1 answer

Sort by: Most helpful
  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?

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.