diff --git a/include/opendht/dht_proxy_server.h b/include/opendht/dht_proxy_server.h
index da50bdea0f2f0f9340966176ee34fd1ba7d4efcb..2f1d6ecf7169e8c41d80dea30fe991f2b476665f 100644
--- a/include/opendht/dht_proxy_server.h
+++ b/include/opendht/dht_proxy_server.h
@@ -79,7 +79,7 @@ public:
      * it will fails silently
      */
     DhtProxyServer(
-       std::shared_ptr<dht::crypto::Identity> identity,
+       dht::crypto::Identity identity,
        std::shared_ptr<DhtRunner> dht, in_port_t port = 8000, const std::string& pushServer = "",
        std::shared_ptr<dht::Logger> logger = {});
 
@@ -327,7 +327,6 @@ private:
     std::unique_ptr<restinio::http_server_t<RestRouterTraits>> httpServer_;
     std::unique_ptr<asio::const_buffer> pk_;
     std::unique_ptr<asio::const_buffer> cc_;
-    std::shared_ptr<dht::crypto::Identity> serverIdentity_;
 
     // http client
     std::pair<std::string, std::string> pushHostPort_;
diff --git a/src/dht_proxy_server.cpp b/src/dht_proxy_server.cpp
index f42fdd2e84a33e536bd3d0bf7f6a494de9b71cb7..5494131bde9753f68e02e487e26c4dec86e009fb 100644
--- a/src/dht_proxy_server.cpp
+++ b/src/dht_proxy_server.cpp
@@ -88,11 +88,11 @@ struct RestRouterTraits : public restinio::default_traits_t
 };
 
 DhtProxyServer::DhtProxyServer(
-    std::shared_ptr<dht::crypto::Identity> identity,
+    dht::crypto::Identity identity,
     std::shared_ptr<DhtRunner> dht, in_port_t port, const std::string& pushServer,
     std::shared_ptr<dht::Logger> logger
 )
-    :   dht_(dht), serverIdentity_(identity), logger_(logger), lockListener_(std::make_shared<std::mutex>()),
+    :   dht_(dht), logger_(logger), lockListener_(std::make_shared<std::mutex>()),
         listeners_(std::make_shared<std::map<restinio::connection_id_t, http::ListenerSession>>()),
         connListener_(std::make_shared<http::ConnectionListener>(dht, listeners_, lockListener_, logger)),
         pushServer_(pushServer)
@@ -115,7 +115,7 @@ DhtProxyServer::DhtProxyServer(
     jsonBuilder_["commentStyle"] = "None";
     jsonBuilder_["indentation"] = "";
 
-    if (identity){
+    if (identity.first and identity.second) {
         // define tls context
         asio::ssl::context tls_context { asio::ssl::context::sslv23 };
         tls_context.set_options(asio::ssl::context::default_workarounds
@@ -124,13 +124,13 @@ DhtProxyServer::DhtProxyServer(
         // save keys in memory & set in tls context
         asio::error_code ec;
         // node private key
-        auto pk = identity->first->serialize(); // returns Blob
+        auto pk = identity.first->serialize(); // returns Blob
         pk_ = std::make_unique<asio::const_buffer>(static_cast<void*>(pk.data()), (std::size_t) pk.size());
         tls_context.use_private_key(*pk_, asio::ssl::context::file_format::pem, ec);
         if (ec)
             throw std::runtime_error("Error setting node's private key: " + ec.message());
         // certificate chain
-        auto cc = identity->second->toString(true/*chain*/);
+        auto cc = identity.second->toString(true/*chain*/);
         cc_ = std::make_unique<asio::const_buffer>(static_cast<const void*>(cc.data()), (std::size_t) cc.size());
         tls_context.use_certificate_chain(*cc_, ec);
         if (ec)
diff --git a/tests/dhtproxytester.cpp b/tests/dhtproxytester.cpp
index f9638b5d04f89b9b3104a7fdc1184fae11ca5ae9..d46434404355da2034d0d25322d43bd584580362 100644
--- a/tests/dhtproxytester.cpp
+++ b/tests/dhtproxytester.cpp
@@ -41,10 +41,8 @@ DhtProxyTester::setUp() {
     nodeProxy->run(0, /*identity*/{}, /*threaded*/true);
     nodeProxy->bootstrap(nodePeer.getBound());
 
-    serverCAIdentity = std::make_unique<dht::crypto::Identity>(
-        dht::crypto::generateEcIdentity("DHT Node CA"));
-    serverIdentity = std::make_shared<dht::crypto::Identity>(
-        dht::crypto::generateIdentity("DHT Node", *serverCAIdentity));
+    auto serverCAIdentity = dht::crypto::generateEcIdentity("DHT Node CA");
+    auto serverIdentity = dht::crypto::generateIdentity("DHT Node", serverCAIdentity);
 
     serverProxy = std::unique_ptr<dht::DhtProxyServer>(
         new dht::DhtProxyServer(
@@ -52,7 +50,7 @@ DhtProxyTester::setUp() {
             /*https*/serverIdentity,
             nodeProxy, 8080, /*pushServer*/"127.0.0.1:8090", logger));
 
-    clientConfig.client_cert = serverIdentity->second;
+    clientConfig.client_cert = serverIdentity.second;
     clientConfig.dht_config.node_config.maintain_storage = false;
     clientConfig.threaded = true;
     clientConfig.push_node_id = "dhtnode";
diff --git a/tests/dhtproxytester.h b/tests/dhtproxytester.h
index c20867f3b6e17cf81afec22102ebd757660d738a..691b9450a13c9a155166157a894ce04a68a7de18 100644
--- a/tests/dhtproxytester.h
+++ b/tests/dhtproxytester.h
@@ -66,11 +66,6 @@ class DhtProxyTester : public CppUnit::TestFixture {
 
     std::shared_ptr<dht::DhtRunner> nodeClient;
     std::shared_ptr<dht::DhtRunner> nodeProxy;
-
-#ifdef OPENDHT_PUSH_NOTIFICATIONS
-    std::shared_ptr<dht::crypto::Identity> serverIdentity;
-    std::unique_ptr<dht::crypto::Identity> serverCAIdentity;
-#endif
     std::unique_ptr<dht::DhtProxyServer> serverProxy;
 
     dht::DhtRunner::Context clientContext {};
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index 9de8ac815df3d0ef0403b073244f8886b328ab0f..bd99b1a47fa124e0bb013e7ae8332b7d7b8c8763 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -227,8 +227,7 @@ void cmd_loop(std::shared_ptr<DhtRunner>& node, dht_params& params
                 unsigned int port = std::stoi(idstr);
                 proxies.emplace(port, std::unique_ptr<DhtProxyServer>(
                     new DhtProxyServer(
-                        params.generate_identity ? std::make_shared<dht::crypto::Identity>(params.id) : nullptr,
-                        node, port
+                        params.generate_identity ? params.id : dht::crypto::Identity{}, node, port
 #ifdef OPENDHT_PUSH_NOTIFICATIONS
                         ,pushServer
 #endif
@@ -562,7 +561,7 @@ main(int argc, char **argv)
 #ifdef OPENDHT_PROXY_SERVER
             proxies.emplace(params.proxyserver, std::unique_ptr<DhtProxyServer>(
                 new DhtProxyServer(
-                    params.generate_identity ? std::make_shared<dht::crypto::Identity>(params.id) : nullptr,
+                    params.generate_identity ? params.id : dht::crypto::Identity{},
                     node, params.proxyserver, params.pushserver, context.logger)));
 #else
             std::cerr << "DHT proxy server requested but OpenDHT built without proxy server support." << std::endl;