【问题标题】:X509_NAME - how to get the actual buffer?X509_NAME - 如何获取实际缓冲区?
【发布时间】:2015-03-29 17:02:11
【问题描述】:

我正在将 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 放在缓冲区中,它会在另一端正确接收。

【问题讨论】:

    标签: ssl openssl x509


    【解决方案1】:

    你很接近。但是 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 西字符集域名之类的简单事物来说很好。

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多