diff --git a/include/opendht/crypto.h b/include/opendht/crypto.h
index 6f66db26ca870af24f4a0ea05f62fc0cd39d26d1..208c1e57513358a2704411b8fafc5c8ea8577db6 100644
--- a/include/opendht/crypto.h
+++ b/include/opendht/crypto.h
@@ -283,6 +283,7 @@ public:
     bool verify() const;
 
     Blob pack() const;
+    std::string toString() const;
 
     gnutls_x509_crq_t get() const { return request; }
 private:
diff --git a/src/crypto.cpp b/src/crypto.cpp
index 5e0e92e9f17567ad55b890abfaf060dafcbd2141..cad426b26d820abc4916b48ad72f805bee51ed80 100644
--- a/src/crypto.cpp
+++ b/src/crypto.cpp
@@ -703,6 +703,17 @@ CertificateRequest::pack() const
     return ret;
 }
 
+std::string
+CertificateRequest::toString() const 
+{
+    gnutls_datum_t dat {nullptr, 0};
+    if (auto err = gnutls_x509_crq_export2(request, GNUTLS_X509_FMT_PEM, &dat))
+        throw CryptoException(std::string("Can't export certificate request: ") + gnutls_strerror(err));
+    std::string ret(dat.data, dat.data + dat.size);
+    gnutls_free(dat.data);
+    return ret;
+}
+
 // Certificate
 
 static std::string