I upgraded some machines to Ubuntu 22.04(.1) this weekend, and hit the
failure in this bug in boxbackup-client; specifically, bbackupd aborts
on startup because it uses Blowfish, which openssl 3.x has now relegated
to the "legacy" provider.
I made the attached patch, which causes the package to build and run on
both openssl 3.x and pre-3.x systems.
Note, however, that on openssl 3.x systems, a number of the tests run at
build time still fail with:
FAILED: Exception caught: TLSServerWeakCertificate: Failed to load certificates
from testfiles/clientCerts.pem: hash too weak for current security level
but that is for a different reason: the pre-built certificates bundled
with the source package for running the tests use the
now-deemed-insecure SHA1 hash.
Nonetheless, the package builds, and works fine at runtime, assuming
you've upgraded your certs to sha256 as recommended here:
https://github.com/boxbackup/boxbackup/wiki/WeakSSLCertificates#replacing-certificates
This patch is against the version in Ubuntu 22.04.1:
oxbackup_0.13~~git20200326.g8e8b63c-1ubuntu2.dsc
--
Ian Goldberg
Canada Research Chair in Privacy Enhancing Technologies
Professor, Cheriton School of Computer Science
University of Waterloo
index 78b99f7..812f5d1 100644
--- a/infrastructure/m4/ax_check_ssl.m4
+++ b/infrastructure/m4/ax_check_ssl.m4
@@ -32,6 +32,7 @@ AC_DEFUN([AX_CHECK_SSL], [
if test "x$ax_check_ssl_found" = "xyes"; then
AC_DEFINE([HAVE_SSL], 1, [Define to 1 if SSL is available])
+ AC_CHECK_HEADERS([openssl/provider.h],,)
m4_ifvaln([$1],[$1],[:])dnl
m4_ifvaln([$2],[else $2])dnl
fi
diff --git a/lib/server/SSLLib.cpp b/lib/server/SSLLib.cpp
index 1bcadb0..ac8847c 100644
--- a/lib/server/SSLLib.cpp
+++ b/lib/server/SSLLib.cpp
@@ -13,6 +13,9 @@
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/rand.h>
+#ifdef HAVE_OPENSSL_PROVIDER_H
+#include <openssl/provider.h>
+#endif
#ifdef WIN32
#include <wincrypt.h>
@@ -49,6 +52,20 @@ void SSLLib::Initialise()
// More helpful error messages
::SSL_load_error_strings();
+#ifdef HAVE_OPENSSL_PROVIDER_H
+ // We use Blowfish, so in OpenSSL 3.x we need to explicitly load
+ // the legacy provider. Then if you explicitly load any provider
+ // the default provider is no longer loaded implicitly, so load
+ // that as well.
+ OSSL_PROVIDER *legacy = OSSL_PROVIDER_load(NULL, "legacy");
+ OSSL_PROVIDER *deflt = OSSL_PROVIDER_load(NULL, "default");
+ if (legacy == NULL || deflt == NULL) {
+ THROW_EXCEPTION_MESSAGE(ServerException,
+ SSLLibraryInitialisationError,
+ CryptoUtils::LogError("loading OpenSSL providers"));
+ }
+#endif
+
// Extra seeding over and above what's already done by the library
#ifdef WIN32
HCRYPTPROV provider;