Reference

OpenSSL 3 vs 1.1 on Windows — what changed

OpenSSL 3.0 introduced the provider model, deprecated many legacy algorithms, and changed the DLL filenames. If you are upgrading from 1.1.1 to 3.x or 4.x on Windows, this guide covers the key differences that affect Windows users.

OpenSSL 1.1.1 reached end-of-life in September 2023 and no longer receives security updates. Upgrading to 3.x or 4.x is strongly recommended.

Changed DLL names on Windows

This is the most common Windows-specific breaking change. Apps that bundle or link against OpenSSL DLLs by name will break:

File OpenSSL 1.1.1 OpenSSL 3.x / 4.x
Crypto DLLlibcrypto-1_1-x64.dlllibcrypto-3-x64.dll
SSL DLLlibssl-1_1-x64.dlllibssl-3-x64.dll
Import liblibcrypto.lib / libssl.liblibcrypto.lib / libssl.lib (same)

If you bundle DLLs next to your application: replace the 1.x DLLs with the 3.x versions. See Fix libcrypto.dll if you get errors.

New provider model in 3.x

OpenSSL 3.0 replaced the old ENGINE system with a provider model. This is the biggest architectural change:

  • Algorithms are now implemented in loadable providers: default, legacy, fips, base.
  • FIPS_mode_set(1) no longer exists. FIPS now requires loading the FIPS provider via config. See FIPS Notes.
  • The old ENGINE API is deprecated and may be removed in a future release.
  • Some older algorithms (MD4, RC4, DES, Blowfish) moved to the legacy provider and are not available by default.
cmd.exe
# Check loaded providers:
C:\> openssl list -providers
Providers:
default
name: OpenSSL Default Provider
status: active

Algorithms removed from default in 3.x

These algorithms still exist in the legacy provider but are not loaded by default. Code that uses them will fail with errors like unknown message digest algorithm:

  • MD4 — legacy provider only
  • RC4 — legacy provider only
  • DES / 3DES — legacy provider only
  • Blowfish, CAST, SEED, IDEA — legacy provider only
  • MDC2, RIPEMD-160 — legacy provider only

To enable legacy algorithms, load the legacy provider in your openssl.cnf or programmatically via OSSL_PROVIDER_load(NULL, "legacy").

Key API changes for developers

EVP functions are now mandatory
Many low-level algorithm APIs (RSA_*, DSA_*, EC_KEY_*) are deprecated in 3.x and removed in 4.x. Use the high-level EVP functions (EVP_PKEY_*, EVP_DigestSign*) instead. The EVP API has been available since OpenSSL 1.0 so code using it already works across versions.
X509 and ASN.1 struct members are now opaque
Direct struct member access (e.g. cert->cert_info) no longer compiles. Use the accessor functions instead. This was already recommended practice in 1.1.x but is now enforced.
RAND_pseudo_bytes() removed
RAND_pseudo_bytes() is removed. Replace all calls with RAND_bytes() which is cryptographically secure.
SSL_CTX_set_tmp_rsa_callback() removed
This callback for ephemeral RSA key exchange is removed — ephemeral RSA is no longer supported in TLS. Remove the callback and ensure your server is configured for ECDHE or DHE key exchange instead.

Migrating from 1.1.1 to 3.x or 4.x on Windows

  • 1

    Update the DLL files

    Replace libcrypto-1_1-x64.dll and libssl-1_1-x64.dll with libcrypto-3-x64.dll and libssl-3-x64.dll from the new installer. See Update OpenSSL on Windows.

  • 2

    Test for deprecated API usage

    Build your project with OpenSSL 3.x. Compiler warnings about deprecated functions indicate code that needs updating. Focus on low-level RSA/EC/DSA direct struct access first.

  • 3

    Check for legacy algorithm usage

    If your code uses MD4, RC4, DES or other legacy algorithms, either migrate to modern equivalents (SHA-256, AES) or explicitly load the legacy provider in your OpenSSL config.

  • 4

    Test FIPS configuration if applicable

    The old FIPS_mode_set(1) is gone. See FIPS Notes for the new provider-based approach.

Ready to upgrade?

Download OpenSSL 4.0.0 Win64 and follow the update guide.

Update OpenSSL guide →

Related guides