【问题标题】:Segmentation Fault whenever i try to cast unsigned char* to a X509* [closed]每当我尝试将 unsigned char* 转换为 X509* 时出现分段错误 [关闭]
【发布时间】:2020-03-28 21:12:34
【问题描述】:

我正在尝试通过 ssl 套接字向客户端发送证书。证书作为 blob 存储在数据库中。

每当我尝试将接收数据的 unsigned char* 指针转换为 X509* 并访问 X509 时,即使服务器执行相同操作,我的客户端也会出现段错误,但它工作得很好。我打印了以十六进制传递的数据,它们匹配,所以我不确定是什么问题。

服务器:

//returns the blob containing the cert from db.
unsigned char *cert = get_cert(name);
X509* certt = (X509 *) cert;
//gets size of certificate to send over socket
int cert_size = i2d_X509(certt, NULL);

//prints cert common name and binary data as hex
setvbuf(stdout, NULL, _IONBF, 0);
unsigned char *user = X509_NAME_oneline(X509_get_subject_name(certt), 0, 0);
printf("%s\n", user);
for (int i = 0; i < cert_size; i++){
    printf("%X", cert[i]);
}

//sends cert size then the cert.
char message[64];
snprintf(message, 64, "/cert %d", cert_size);
ssl_block_write(ssl, serverfd, message, strlen(message));
ssl_block_write(ssl, serverfd, cert, cert_size);

客户:

//allocates enough memory to receive cert
unsigned char *data = malloc(size);
printf("%d\n", ssl_block_read(ssl, serverfd, data, size));

for (int i = 0; i < size; i++)
    printf("%X", data[i]);

X509 *cert = (X509 *) data;
unsigned char *user = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
printf("%s\n", user);

【问题讨论】:

  • 我觉得你没有提供足够的信息,例如我们想知道你正在打印的十六进制数据和X509结构定义(我无法在网上找到)。
  • 只是一个观察:在服务器中,您没有使用类型转换的certt访问数据
  • 你如何避免程序因为强制转换而崩溃?这实际上听起来不合理,因为强制转换本身没有指针取消引用。
  • i2d_X509(certt, NULL); 可能会取消引用数据,因此这可能是严格的别名违规。虽然我怀疑这个错误与对齐/填充有关。提供的信息很少,无法说。
  • 你不能这样做! X509 结构不能以这种方式直接序列化。它包含不会像这样正确序列化的指针等。如果您需要将其存储为 blob,则应首先使用 i2d_x509() 将其转换为 DER,然后当您再次读回它时,您需要使用 d2i_x509() 再次将其转换回来。我不知道为什么它在服务器上对你有用。它不应该。

标签: c openssl x509


【解决方案1】:

你不能这样做! X509 结构不能以这种方式直接序列化。它包含不会像这样正确序列化的指针等。如果您需要将其存储为 blob,则应首先使用 i2d_X509() 将其转换为 DER,然后当您再次读回它时,您需要使用 d2i_X509() 再次将其转换回来。我不知道为什么它在服务器上对你有用。它不应该。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多