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

标签 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 放入缓冲区,它就会在另一端正确接收。

最佳答案

你很接近。但是 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 域名,没有替代品/变体之类的东西。

关于ssl - X509_NAME - 如何获取实际缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232181/

相关文章:

openssl - 为 MitmProxy 生成根证书

java - 使用 BouncyCaSTLe 接受过期的 CRL

javascript - 使用 wsHttpbinding 和使用 javascript 或 Jquery 的 x509 证书调用 WCF web 服务

android - AsyncHttpClient 和 org.apache.http.client 在 SSL 站点上失败,而标准 Android 方法运行良好

javascript - 在 Web 浏览器中,JavaScript 是否可以获取有关当前页面使用的 HTTPS 证书的信息?

node.js - 错误 : read ECONNRESET when connecting from mqtt node. js

certificate - 使用 paro smalltalk 进行 x.509 证书操作

ruby-on-rails - 如何为指定路径提供单独的 SSL 证书

openssl - 将 RSA 公钥转换为 RSA DER

Java解密电子邮件附件(.p7m文件)