diff --git a/src/lib/core/CMakeLists.txt b/src/lib/core/CMakeLists.txt
index f17ae163d87a69f57cdd1857572cf0286817c994..d6646fe23e3cbea3fcfa22fc711c5584074fd760 100644
--- a/src/lib/core/CMakeLists.txt
+++ b/src/lib/core/CMakeLists.txt
@@ -39,6 +39,7 @@ set(core_sources
     mp_interval.c
     prbuf.c
     clock_lowres.c
+    ssl_init.c
 )
 
 if(ENABLE_TUPLE_COMPRESSION)
diff --git a/src/lib/core/ssl.c b/src/lib/core/ssl.c
index 57989ea99d4545a7c1701a8744ae2adf02dfac97..e8eb667f13f18134d9189db3867862f1c165930d 100644
--- a/src/lib/core/ssl.c
+++ b/src/lib/core/ssl.c
@@ -5,14 +5,11 @@
  */
 #include "ssl.h"
 
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-#include <openssl/evp.h>
-#include <openssl/ssl.h>
 #include <stddef.h>
 
 #include "diag.h"
 #include "iostream.h"
+#include "ssl_init.h"
 #include "trivia/config.h"
 
 #if defined(ENABLE_SSL)
@@ -22,22 +19,13 @@
 void
 ssl_init(void)
 {
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
-	OpenSSL_add_all_digests();
-	OpenSSL_add_all_ciphers();
-	ERR_load_crypto_strings();
-#else
-	OPENSSL_init_crypto(0, NULL);
-	OPENSSL_init_ssl(0, NULL);
-#endif
+	ssl_init_impl();
 }
 
 void
 ssl_free(void)
 {
-#ifdef OPENSSL_cleanup
-	OPENSSL_cleanup();
-#endif
+	ssl_free_impl();
 }
 
 struct ssl_iostream_ctx *
diff --git a/src/lib/core/ssl_init.c b/src/lib/core/ssl_init.c
new file mode 100644
index 0000000000000000000000000000000000000000..dbfcec07ba9c3eb017bc87816baa95a991caabe4
--- /dev/null
+++ b/src/lib/core/ssl_init.c
@@ -0,0 +1,33 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2010-2022, Tarantool AUTHORS, please see AUTHORS file.
+ */
+#include "ssl_init.h"
+
+#include <openssl/crypto.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/ssl.h>
+#include <stddef.h>
+
+void
+ssl_init_impl(void)
+{
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
+	OpenSSL_add_all_digests();
+	OpenSSL_add_all_ciphers();
+	ERR_load_crypto_strings();
+#else
+	OPENSSL_init_crypto(0, NULL);
+	OPENSSL_init_ssl(0, NULL);
+#endif
+}
+
+void
+ssl_free_impl(void)
+{
+#ifdef OPENSSL_cleanup
+	OPENSSL_cleanup();
+#endif
+}
diff --git a/src/lib/core/ssl_init.h b/src/lib/core/ssl_init.h
new file mode 100644
index 0000000000000000000000000000000000000000..006b66419fb2a774b5fb28f8c01a295a2d025228
--- /dev/null
+++ b/src/lib/core/ssl_init.h
@@ -0,0 +1,18 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright 2010-2022, Tarantool AUTHORS, please see AUTHORS file.
+ */
+#pragma once
+
+/**
+ * Initializes OpenSSL library. Internal method. Use ssl_init() instead.
+ */
+void
+ssl_init_impl(void);
+
+/**
+ * Frees OpenSSL library. Internal method. Use ssl_free() instead.
+ */
+void
+ssl_free_impl(void);