diff --git a/spec/hash_spec.lua b/spec/hash_spec.lua
index 9deab39..cc392b9 100644
--- a/spec/hash_spec.lua
+++ b/spec/hash_spec.lua
@@ -15,7 +15,7 @@
 -- limitations under the License.
 
 local ffi = require "ffi"
-if pcall(ffi.load, "ssl") then
+if pcall(ffi.load, "/usr/lib/libssl.so.3") then
 	_G.TURBO_SSL = true
 	local turbo = require "turbo"
 
diff --git a/turbo/cdef.lua b/turbo/cdef.lua
index 62895de..62830e7 100755
--- a/turbo/cdef.lua
+++ b/turbo/cdef.lua
@@ -611,6 +611,7 @@ if _G.TURBO_SSL then
         typedef void ASN1_STRING;
         typedef unsigned int SHA_LONG;
         typedef void EVP_MD;
+	typedef void OPENSSL_INIT_SETTINGS;
         typedef struct SHAstate_st{
             SHA_LONG h0,h1,h2,h3,h4;
             SHA_LONG Nl,Nh;
@@ -618,11 +619,9 @@ if _G.TURBO_SSL then
             unsigned int num;
         } SHA_CTX;
 
-        const SSL_METHOD *SSLv3_server_method(void);
-        const SSL_METHOD *SSLv3_client_method(void);
-        const SSL_METHOD *SSLv23_method(void);
-        const SSL_METHOD *SSLv23_server_method(void);
-        const SSL_METHOD *SSLv23_client_method(void);
+        const SSL_METHOD *TLS_method(void);
+        const SSL_METHOD *TLS_server_method(void);
+        const SSL_METHOD *TLS_client_method(void);
         const SSL_METHOD *TLSv1_method(void);
         const SSL_METHOD *TLSv1_server_method(void);
         const SSL_METHOD *TLSv1_client_method(void);
@@ -632,10 +631,8 @@ if _G.TURBO_SSL then
         const SSL_METHOD *TLSv1_2_method(void);
         const SSL_METHOD *TLSv1_2_server_method(void);
         const SSL_METHOD *TLSv1_2_client_method(void);
-        void OPENSSL_add_all_algorithms_noconf(void);
-        void SSL_load_error_strings(void);
         void ERR_free_strings(void);
-        int SSL_library_init(void);
+	int OPENSSL_init_ssl(uint64_t opts, const OPENSSL_INIT_SETTINGS *settings);
         void EVP_cleanup(void);
         SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
         void SSL_CTX_free(SSL_CTX *);
@@ -656,8 +653,13 @@ if _G.TURBO_SSL then
             const char *CApath);
         int SSL_CTX_check_private_key(const SSL_CTX *ctx);
         SSL *SSL_new(SSL_CTX *ctx);
+	int SSL_set1_host(SSL *s, const char *hostname);
+	int SSL_add1_host(SSL *s, const char *hostname);
+	void SSL_set_hostflags(SSL *s, unsigned int flags);
+	const char *SSL_get0_peername(SSL *s);
         void SSL_set_connect_state(SSL *s);
         void SSL_set_accept_state(SSL *s);
+	long SSL_ctrl(SSL *ssl, int cmd, long larg, void *parg);
         int SSL_do_handshake(SSL *s);
         int SSL_set_fd(SSL *s, int fd);
         int SSL_accept(SSL *ssl);
diff --git a/turbo/crypto_linux.lua b/turbo/crypto_linux.lua
index 1473022..b3ac229 100644
--- a/turbo/crypto_linux.lua
+++ b/turbo/crypto_linux.lua
@@ -23,7 +23,7 @@ require "turbo.cdef"
 
 local crypto = {} -- crypto namespace
 
-local lssl = ffi.load(os.getenv("TURBO_LIBSSL") or "ssl")
+local lssl = ffi.load(os.getenv("TURBO_LIBSSL") or "/usr/lib/libssl.so.3")
 local libtffi = util.load_libtffi()
 
 local EWOULDBLOCK, EINPROGRESS, ECONNRESET =
@@ -32,6 +32,7 @@ local EWOULDBLOCK, EINPROGRESS, ECONNRESET =
 crypto.X509_FILETYPE_PEM =          1
 crypto.X509_FILETYPE_ASN1 =         2
 crypto.X509_FILETYPE_DEFAULT =      3
+crypto.X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS = 0x4
 crypto.SSL_FILETYPE_ASN1 =          crypto.X509_FILETYPE_ASN1
 crypto.SSL_FILETYPE_PEM =           crypto.X509_FILETYPE_PEM
 crypto.SSL_ERROR_NONE =             0
@@ -77,9 +78,7 @@ end
 function crypto.ssl_init()
     if not _G._TURBO_SSL_INITED then
        _TURBO_SSL_INITED = true
-        lssl.SSL_load_error_strings()
-        lssl.SSL_library_init()
-        lssl.OPENSSL_add_all_algorithms_noconf()
+       lssl.OPENSSL_init_ssl(0, nil)
     end
 end
 if _G.TURBO_SSL then
@@ -107,7 +106,7 @@ function crypto.ssl_create_client_context(
     -- Use standardish path to ca-certificates if not specified by user.
     -- May not be present on all Unix systems.
     ca_cert_path = ca_cert_path or "/etc/ssl/certs/ca-certificates.crt"
-    meth = sslv or lssl.SSLv23_client_method()
+    meth = sslv or lssl.TLS_client_method()
     if meth == nil then
         err = lssl.ERR_peek_error()
         lssl.ERR_clear_error()
@@ -142,7 +141,7 @@ function crypto.ssl_create_client_context(
     end
     if verify == true then
         if lssl.SSL_CTX_load_verify_locations(ctx,
-                ca_cert_path, nil) ~= 1 then
+                ca_cert_path, "/etc/ssl/certs/") ~= 1 then
             err = lssl.ERR_peek_error()
             lssl.ERR_clear_error()
             return err, crypto.ERR_error_string(err)
@@ -172,7 +171,7 @@ function crypto.ssl_create_server_context(cert_file, prv_file, ca_cert_path, ssl
     elseif not prv_file then
         return -1, "No priv file given in arguments";
     end
-    meth = sslv or lssl.SSLv23_server_method()
+    meth = sslv or lssl.TLS_server_method()
     if meth == nil then
         err = lssl.ERR_peek_error()
         lssl.ERR_clear_error()
@@ -249,6 +248,18 @@ function crypto.ssl_do_handshake(SSLIOStream)
     -- EINPROGRESS or equaivalent on prior calls. The OpenSSL
     -- documentation states that SSL_do_handshake should be called again
     -- when its needs are satisfied.
+    if SSLIOStream._ssl_verify then
+        lssl.SSL_set_hostflags(ssl, crypto.X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS)
+	if lssl.SSL_set1_host(ssl, SSLIOStream._ssl_hostname) <= 0 then
+            err = crypto.lib.ERR_peek_error()
+            crypto.lib.ERR_clear_error()
+            error(string.format(
+                "Could not do SSL handshake. \
+                     Failed to set SSL hostname: %s",
+                crypto.ERR_error_string(err)))
+	end
+	print("DEBUG!!!: set ssl hostname", SSLIOStream._ssl_hostname)
+    end
     rc = crypto.lib.SSL_do_handshake(ssl)
     if rc <= 0 then
         if client and SSLIOStream._ssl_verify then
@@ -308,14 +319,6 @@ function crypto.ssl_do_handshake(SSLIOStream)
                 "Could not do SSL handshake. SSL_do_hanshake returned %d",
                 err))
         end
-    else
-        if client and SSLIOStream._ssl_verify then
-            rc = libtffi.validate_hostname(SSLIOStream._ssl_hostname, ssl)
-            if rc ~= crypto.validate.MatchFound then
-                error("SSL certficate hostname validation failed, rc " ..
-                tonumber(rc))
-            end
-        end
     end
     return true
 end
diff --git a/turbo/hash.lua b/turbo/hash.lua
index fdbd63b..c2b0493 100644
--- a/turbo/hash.lua
+++ b/turbo/hash.lua
@@ -31,7 +31,7 @@ local ffi = require "ffi"
 local buffer = require "turbo.structs.buffer"
 require "turbo.cdef"
 
-local lssl = ffi.load(os.getenv("TURBO_LIBSSL") or "ssl")
+local lssl = ffi.load(os.getenv("TURBO_LIBSSL") or "/usr/lib/libssl.so.3")
 
 -- Buffers
 local hexstr = buffer()
