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 DLL | libcrypto-1_1-x64.dll | libcrypto-3-x64.dll |
| SSL DLL | libssl-1_1-x64.dll | libssl-3-x64.dll |
| Import lib | libcrypto.lib / libssl.lib | libcrypto.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.
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
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
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
Migrating from 1.1.1 to 3.x or 4.x on Windows
- 1
Update the DLL files
Replace
libcrypto-1_1-x64.dllandlibssl-1_1-x64.dllwithlibcrypto-3-x64.dllandlibssl-3-x64.dllfrom 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.
Related guides