C++ Openssl X509证书获取字符串人类可读

C++ Openssl X509证书获取字符串人类可读,c++,openssl,x509certificate,tls1.2,pem,C++,Openssl,X509certificate,Tls1.2,Pem,我有一个客户机/服务器体系结构,其中我使用openssl库实现加密通信(TLSv1.2)。 由于我使用的是“自签名”证书,为了验证服务器的身份,我的想法是在客户端放入服务器公钥的物理副本(server_public_key.pem),然后验证它是否等于在TLS的握手阶段接收到的公钥 在客户端上,我可以通过以下方式检索后者: X509 *cert = SSL_get_peer_certificate(ssl); 现在,我将提取此对象中包含的公钥的可读字符串 我知道我可以这样打印: EVP_PKE

我有一个客户机/服务器体系结构,其中我使用openssl库实现加密通信(TLSv1.2)。 由于我使用的是“自签名”证书,为了验证服务器的身份,我的想法是在客户端放入服务器公钥的物理副本(server_public_key.pem),然后验证它是否等于在TLS的握手阶段接收到的公钥

在客户端上,我可以通过以下方式检索后者:

X509 *cert = SSL_get_peer_certificate(ssl);
现在,我将提取此对象中包含的公钥的可读字符串

我知道我可以这样打印:

EVP_PKEY *pkey = X509_get_pubkey(cert);
PEM_write_PUBKEY(stdout, pkey);
但我需要将其作为字符串保存(而不是将其发送到stdout)。如何执行此操作?

用于创建由内部内存缓冲区(最初为空)支持的新
BIO

然后使用
PEM\u write\u bio\u PUBKEY()
将公钥写入bio,此时使用
bio
手册页面中记录的函数检索公钥


请参阅引用的文档,了解创建
BIO
、写入然后读取的简单示例。用
PEM\u write\u bio\u PUBKEY()
替换示例写入操作就足够了。

我还有一个问题。如果我先执行“char buff[size];”然后执行“BIO_read(mem,buff,size)”,其中mem是BIO对象,“size”是要读取的字节数,在buff的末尾有一些奇怪的字符。我想我在内存分配上犯了一些错误。有什么建议吗?请注意,如果我以“char buff[]=”的方式初始化buff,我将获得以下错误:***检测到堆栈崩溃***:”已解决。我忘了在buff的末尾插入0;)