OpenSSL 1.1.1 and Qt 5.12.4

New in Qt 5.12.4 (and later versions) was the switch from OpenSSL 1.0 series to OpenSSL 1.1.1 LTS series in their binary builds. That is all very awesome and secure and all that but when you are for reason or another stuck on a distribution that only supplies OpenSSL 1.0 you are in a bit of a trouble when your perfectly fine Qt apps start to produce this

qt.network.ssl: QSslSocket: cannot resolve OPENSSL_init_ssl
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_init_crypto
qt.network.ssl: QSslSocket: cannot resolve ASN1_STRING_get0_data
qt.network.ssl: QSslSocket: cannot resolve EVP_CIPHER_CTX_reset
qt.network.ssl: QSslSocket: cannot resolve RSA_bits
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_new_null
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_push
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_free
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_num
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_pop_free
qt.network.ssl: QSslSocket: cannot resolve OPENSSL_sk_value
qt.network.ssl: QSslSocket: cannot resolve DH_get0_pqg
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_options
qt.network.ssl: QSslSocket: cannot resolve SSL_CTX_set_ciphersuites
qt.network.ssl: QSslSocket: cannot resolve SSL_set_psk_use_session_callback
qt.network.ssl: QSslSocket: cannot resolve SSL_get_client_random
qt.network.ssl: QSslSocket: cannot resolve SSL_SESSION_get_master_key
qt.network.ssl: QSslSocket: cannot resolve SSL_session_reused
qt.network.ssl: QSslSocket: cannot resolve SSL_set_options
qt.network.ssl: QSslSocket: cannot resolve TLS_method
qt.network.ssl: QSslSocket: cannot resolve TLS_client_method
qt.network.ssl: QSslSocket: cannot resolve TLS_server_method
qt.network.ssl: QSslSocket: cannot resolve X509_STORE_CTX_get0_chain
qt.network.ssl: QSslSocket: cannot resolve X509_getm_notBefore
qt.network.ssl: QSslSocket: cannot resolve X509_getm_notAfter
qt.network.ssl: QSslSocket: cannot resolve X509_get_version
qt.network.ssl: QSslSocket: cannot resolve OpenSSL_version_num
qt.network.ssl: QSslSocket: cannot resolve OpenSSL_version
qt.network.ssl: Incompatible version of OpenSSL

output and any https connections will fail to work in your application. Distributions where this might be and issue are for example on Ubuntu 16.04 or derivatives like Linux Mint 18.3.

So what we need to do is build OpenSSL 1.1.1 libraries ourselves to make Qt 5.12.4 happy. Fortunately that is quite easy, just follow these instructions.

Download latest version of OpenSSL 1.1.1 LTS

Next, download OpenSSL source archive from the 1.1.1 series, latest at time of writing was 1.1.1h (Always use the latest version and remember to update from time to time):

wget https://www.openssl.org/source/openssl-1.1.1h.tar.gz

Extract the source archive:

tar xf openssl-1.1.1h.tar.gz

And go into the source directory:

cd openssl-1.1.1h

Configure and build (assuming x86_64, adjust if you are using something else)

./Configure shared --prefix=/usr --openssldir=/usr/lib/ssl --libdir=lib no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-ec_nistp_64_gcc_128 linux-x86_64

Build it:

make -j4

Install the libssl.so and libcrypto.so libraries

If all goes well, copy the lib*.so.1.1 libraries into /usr/local/lib (or whereever you prefer to have them stored, even privately inside your Qt project)

sudo cp libssl.so.1.1 libcrypto.so.1.1 /usr/local/lib/

And update the library cache with ldconfig:

sudo ldconfig

And thats it, your copy Qt 5.12.4 should now work openssl 1.1.1 and https connections will work again.