X509_NAME - 如何获取实际缓冲区?

时间:2015-01-30 08:47:15

标签: ssl openssl x509

我正在向我的应用程序添加openssl,我可以发送和接收数据,但到目前为止它没有加密或检查证书。

我获得了服务器证书:

X509 *gCert = NULL;
X509_NAME *gCertName = NULL;

gCert = SSL_get_peer_certificate(sslConnection.ssl);

gCertName = X509_NAME_new();
gCertName = X509_get_subject_name(gCert);

certNameLen = strlen(gCertName);
memcpy(write_buffer, gCertName, certNameLen);

然后我将write_buffer写入SSL套接字,但我在另一端收到的只是乱码。

如何使用X509_NAME? strlen看起来不起作用吗?我得到长度4这是我认为的指针大小,而不是缓冲区大小... X509_NAME的编码是什么?它看起来不像是utf-8 ......

我知道发送下游工作,如果我只是将0xAA或0XBB放在缓冲区中,则在另一端正确接收。

1 个答案:

答案 0 :(得分:2)

你很亲密。但是X509_get_name会返回一个X509_NAME结构,您需要将其转换为人类可读的字符串(或者使用' as-is'进行详细和更安全的比较;因为解析/比较普通的ascii有点冒险 - 一个聪明的对手可以在实际文本中添加' C ='等等。

最简单的是

    X509 * gCertName  =SSL_get_peer_certificate(con);
    // if null - error out
    const char * buf = X509_NAME_oneline(gCertName, 0, 0);
    // if null - release memory and error out
    printf("Client\t: %s\n", buf);
    OpenSSL_free(buf);
    X509_free(gCertName);

它将一行近似值作为C \ 0终止字符串。请注意_oneline函数已被删除 - 请参阅openssl的手册页,以获取更精细的方法来获取UTF8和多行安全的文本再现。但是对于简单的东西,例如纯ASCII的westerncharset域名,没有像替代品/变种这样的东西,上面就可以了。