如果使用SSL_set_bio(),则SSL_free()崩溃

时间:2015-01-29 14:12:52

标签: c++ windows https openssl

我尝试过简单的https客户端。以下是我的代码

WSADATA wsaData = {0};
int res = WSAStartup(MAKEWORD(2,2), &wsaData);
if(NO_ERROR != res) 
{
    return false;
}
SOCKET client = WSASocket(AF_INET, SOCK_STREAM, 0/*IPPROTO_IP*/, NULL, 0, WSA_FLAG_OVERLAPPED);

struct hostent *pHost = NULL;
pHost = gethostbyname("www.google.com");

if (pHost == NULL)
{
    return -1;
}

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(443);
CopyMemory(&address.sin_addr, pHost->h_addr_list[0], pHost->h_length);

int ret = 0;

ret = connect(client, (struct sockaddr*)&address, sizeof(address));
if ((SOCKET_ERROR == ret) && (WSA_IO_PENDING != WSAGetLastError())) 
{
    return -1;
}

CRYPTO_malloc_init(); // Initialize malloc, free, etc for OpenSSL's use
if(SSL_library_init())
{
    // Initialize OpenSSL's SSL libraries
    SSL_load_error_strings(); // Load SSL error strings
    ERR_load_crypto_strings();
    ERR_load_SSL_strings();
    ERR_load_BIO_strings(); // Load BIO error strings

    OpenSSL_add_all_algorithms();
}

SSL_CTX *clientCtx = SSL_CTX_new(TLSv1_client_method());
SSL_CTX_set_verify(clientCtx, SSL_VERIFY_NONE, NULL);
SSL* clientSSL = SSL_new(clientCtx);
SSL_set_fd(clientSSL, client);
SSL_set_cipher_list(clientSSL, "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL");
SSL_set_tlsext_host_name(clientSSL, "www.google.com");

ret = SSL_connect(clientSSL);
if(ret != 1)
{
    char buf[120];
    int res = SSL_get_error(clientSSL, ret);
    ERR_error_string(res, buf);
    return -1;
}
else
{
    BIO *inBio = BIO_new(BIO_s_mem());
    BIO *outBio = BIO_new(BIO_s_mem());
    SSL_set_bio(clientSSL, inBio, outBio);

    SSL_shutdown(clientSSL);
    SSL_free(clientSSL); //Code crashes here.
    if(clientCtx)
    {
        SSL_CTX_free(clientCtx);
        clientCtx = NULL;
    }   
    return 0;
}

这里,如果在SSL_set_Bio()之前调用SSL_shutdown(clientSSL)和SSL_free(clientSSL),它不会崩溃。为什么SSL_free会崩溃?在调用SSL_free()之前我们还做了什么吗?我在Windows中使用Openssl 1.0.1L。

1 个答案:

答案 0 :(得分:0)

我为visual studio 2010构建了openssl 1.0.1L,并将其包含在静态库中,现在这段代码可以运行。

PS:我使用的是openssl中预先构建的.lib文件。