我有一个简单的C应用程序,可以在支持HTTPS的Web服务器上下载一些文件。我使用的是Visual Studio 2017,它在所有Windows平台上运行良好,除了Windows XP。
据我所知,在Windows XP上SSL / TLS支持完全过时了。我甚至无法在Internet Explorer上使用HTTPS访问某些网站。但是,OpenSSL仍然可以工作,对吗?
该程序似乎一直有效,直到调用BIO_read。我尝试了很多东西,不同的VS工具集等等。我仍然无法在没有崩溃的情况下下载。
以下是发生崩溃的应用程序中的基本代码:
SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());
SSL * ssl;
BIO * bio = BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio, "www.myhostname:443");
if (BIO_do_connect(bio) <= 0)
{
printf("BIO: couln't connect.\n");
}
char request[500];
strcpy(request, "GET /myfile.zip HTTP/1.0\r\nHost: ");
strcat(request, myhostname);
strcat(request, "\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0\r\nConnection: Keep-Alive\r\n\r\n");
int len = BIO_write(bio, request, (int) strlen(request) );
char buffer2[32];
while ((len = BIO_read(bio, buffer2, 32)) > 0) {
fwrite(buffer2, sizeof(char), len, archive);
fflush(archive);
}
我使用here预编译的OpenSSL二进制文件。