无法使用OpenSSL库连接到站点

时间:2014-08-16 19:01:09

标签: network-programming openssl client

我写了一个简单的代码来说明基本连接。这是:

#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <windows.h>
#include <iostream>

using namespace std;

void ErrorToString(int error);
char errorstring[32];

int _tmain(int argc, _TCHAR* argv[])
{
SSL_load_error_strings();
SSL_library_init();
SSL_CTX* ssl_context = SSL_CTX_new(SSLv23_client_method());
if (ssl_context == NULL)
{
    cout << "Failed to create SSL_CTX object" << endl;
    system("PAUSE");
    return -1;
}
cout << "Created SSL Context" << endl;
SSL_CTX_set_verify(ssl_context, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_verify_depth(ssl_context, 4);
SSL* ssl_struct = NULL;
cout << "Created SSL Struct" << endl;
char address[] = "localhost:505";                  //ADDRESS
BIO* bio_sock = BIO_new_ssl_connect(ssl_context);
if (bio_sock == NULL)
{
    cout << "Failed to create BIO" << endl;
    system("PAUSE");
    return -1;
}
cout << "Created BIO" << endl;
BIO_get_ssl(bio_sock, &ssl_struct);
if (!ssl_struct)
{
    cout << "Can't locate SSL pointer" << endl;
}
SSL_set_mode(ssl_struct, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio_sock, address);
int err = BIO_do_connect(bio_sock);
Sleep(10000); //wait while connecting
if (err != 1)
{
    cout << "Error in connecting to " << address << endl;
    system("PAUSE");
    return -1;
}
cout << "Connected with BIO socket: " << address << endl;
err = BIO_do_handshake(bio_sock);
if (err != 1)
{
    cout << "Handshake error" << endl;
    ErrorToString(SSL_get_error(ssl_struct, err));
    cout << SSL_get_error(ssl_struct, err) << " : " << errorstring << endl;
    system("PAUSE");
    return -1;
}
/* Step 1: verify a server certificate was presented during the negotiation */
X509* cert = SSL_get_peer_certificate(ssl_struct);
if (cert)
{
    X509_free(cert); //Free immidiatly
    cout << "Ok in step 1" << endl;
}
if (cert == NULL)
{
    cout << "Error. Certificate couldn't be verified.";
}

/* Step 2: verify the result of chain verification */
err = SSL_get_verify_result(ssl_struct);
if (err != X509_V_OK)
{
    cout << "Failed in step 2" << endl;
}

}

它会创建 ssl_context,ssl struct,bio, 它找到指针,但它在连接时出现错误 我在localhost上用端口505创建了一个简单的TCP服务器来尝试这个客户端,服务器指示客户端已连接,但客户端在 BIO_do_connect(bio_sock)中没有返回1 它给了我错误5 - SSL_ERROR_SYSCALL。但我不明白原因。 我还用 BIO_do_connect 制作了一个循环。但没有达到任何结果 这有什么问题? 请帮忙。 提前致谢

0 个答案:

没有答案