---- a/configure.ac
-+++ b/configure.ac
-@@ -368,8 +368,9 @@ if test "x$SSL" != "xno"; then
- AC_LINK_IFELSE([
- AC_LANG_PROGRAM([[
- #include <openssl/ssl.h>
-+ #include <openssl/dh.h>
- ]], [[
-- SSL_CTX* ctx = SSL_CTX_new(TLSv1_method());
-+ SSL_CTX* ctx = SSL_CTX_new(SSLv23_method());
- SSL* ssl = SSL_new(ctx);
- DH* dh = DH_new();
- DH_free(dh);
---- a/include/znc/Utils.h
-+++ b/include/znc/Utils.h
-@@ -219,6 +219,11 @@ class CTable : protected std::vector<std::vector<CString>> {
- #include <openssl/aes.h>
- #include <openssl/blowfish.h>
- #include <openssl/md5.h>
-+#if OPENSSL_VERSION_NUMBER < 0x10100000L
-+#define X509_getm_notBefore X509_get_notBefore
-+#define X509_getm_notAfter X509_get_notAfter
-+#endif
-+
- //! does Blowfish w/64 bit feedback, no padding
- class CBlowfish {
- public:
---- a/src/Utils.cpp
-+++ b/src/Utils.cpp
-@@ -27,6 +27,8 @@
- #include <znc/Message.h>
- #ifdef HAVE_LIBSSL
- #include <openssl/ssl.h>
-+#include <openssl/bn.h>
-+#include <openssl/rsa.h>
- #endif /* HAVE_LIBSSL */
- #include <memory>
- #include <unistd.h>
-@@ -93,8 +95,8 @@ void CUtils::GenerateCert(FILE* pOut, const CString& sHost) {
-
- X509_set_version(pCert.get(), 2);
- ASN1_INTEGER_set(X509_get_serialNumber(pCert.get()), serial);
-- X509_gmtime_adj(X509_get_notBefore(pCert.get()), 0);
-- X509_gmtime_adj(X509_get_notAfter(pCert.get()),
-+ X509_gmtime_adj(X509_getm_notBefore(pCert.get()), 0);
-+ X509_gmtime_adj(X509_getm_notAfter(pCert.get()),
- (long)60 * 60 * 24 * days * years);
- X509_set_pubkey(pCert.get(), pKey.get());
-
---- a/src/main.cpp
-+++ b/src/main.cpp
-@@ -46,8 +46,8 @@ static void locking_callback(int mode, int type, const char* file, int line) {
- }
- }
-
--static unsigned long thread_id_callback() {
-- return (unsigned long)pthread_self();
-+static void thread_id_callback(CRYPTO_THREADID *id) {
-+ CRYPTO_THREADID_set_numeric(id, (unsigned long)pthread_self());
- }
-
- static CRYPTO_dynlock_value* dyn_create_callback(const char* file, int line) {
-@@ -78,7 +78,7 @@ static void thread_setup() {
- for (std::unique_ptr<CMutex>& mtx : lock_cs)
- mtx = std::unique_ptr<CMutex>(new CMutex());
-
-- CRYPTO_set_id_callback(&thread_id_callback);
-+ CRYPTO_THREADID_set_callback(&thread_id_callback);
- CRYPTO_set_locking_callback(&locking_callback);
-
- CRYPTO_set_dynlock_create_callback(&dyn_create_callback);
--- a/third_party/Csocket/Csocket.cc
+++ b/third_party/Csocket/Csocket.cc
@@ -47,10 +47,16 @@