【问题标题】:libcrypto throwing error when compiling a shared library编译共享库时 libcrypto 抛出错误
【发布时间】:2018-03-15 15:24:12
【问题描述】:

我正在尝试将一个共享库放在一起,该库向远程服务器发出 HTTP GET 请求。我的库将由另一个应用程序加载,我想将一些统计数据发布到网络服务器 API。我的代码目前如下所示:

void connect_send(char *value)
{
char *toSend = (char *)malloc((strlen(value) + 2048) * sizeof(char));
char *host = "www.example.com";
struct hostent *server;
struct sockaddr_in serv_addr;
int sockfd;


sprintf(toSend, "GET api.php?key=1234&toggle=cpu&value=%s HTTP/1.0\r\nUser-Agent: API Client\r\n\r\n", value);

SSL_load_error_strings ();
SSL_library_init ();
SSL_CTX *ssl_ctx = SSL_CTX_new (SSLv23_client_method ());

sockfd = socket(AF_INET, SOCK_STREAM, 0);
server = gethostbyname(host);
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(443);
memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
{
    fflush(stdout);
    printf("connect failed");
}

SSL *conn = SSL_new(ssl_ctx);
SSL_set_fd(conn, sockfd);
SSL_connect(conn);
SSL_write(conn,toSend,strlen(toSend));
SSL_shutdown(conn);
close(sockfd);

return;
}

当我将它编译成一个独立的二进制文件时,它可以正常工作,但是当我通过以下方式编译它时:

gcc -fPIC -shared -m32 -ggdb -o api.so api.c -lc /usr/lib/i386-linux-gnu/libssl.a -ldl -lssl /usr/lib/i386-linux-gnu/libcrypto.a -lcrypto

它会因以下错误而崩溃:

0xa6ac36a7 in i2c_ASN1_INTEGER () from ./api.so

由于代码在编译为独立二进制文件时可以工作,我想我在将其编译为库时正在做一些事情。有什么想法吗?

免责声明:这是我第一次尝试使用 libssl/libcrypto,但我已经做了很多寻找答案。

【问题讨论】:

  • 只是为了跟进。我尝试使用 libcurl 执行 https 连接,编译为独立二进制文件时效果很好,但编译为库时也会崩溃
  • 最后跟进。在共享对象/模块中使用时,OpenSSL 似乎不起作用。我已经放弃了,会尝试寻找另一个有效的加密库。

标签: linux ubuntu gcc libssl libcrypto


【解决方案1】:

我花了大约 2 周的时间试图让 OpenSSL 正常工作。它不会。我花了 3 个小时试图让 MBED TLS (https://tls.mbed.org) 正常工作。

答案?不要使用 openssl,而是使用 mbed。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2015-06-15
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多