Сбой клиента SSL на SSL_connect с SSL_ERROR_SSL - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь подключиться к серверу Linux с моего компьютера с Windows. у которых работает SSL сервер. В Linux Machine SSL клиент и сервер работает нормально. Но тот же клиент, который я использую в Windows 7 VS 2010 из-за ошибки SSL_ERROR_SSL , в то время как SSL_Connect .

Ошибка сервера: "1112340720: ошибка: 1408A0C1: подпрограммы SSL: SSL3_GET_CLIENT_HELLO: нет общего шифра: s3_srvr.c: 1358:"

Ошибка клиента: Ошибка SSL_ERROR_SSL

Тот же сертификат и шифр, если я использую клиента в Linux. но это же дает мне ошибку в Windows.

Я добавил этот пример кода клиента VS2010.

// SSL_Client.cpp : Defines the entry point for the console application.
//
#include <atlstr.h>
#include "stdafx.h"
#include "bio.h"
#include "err.h"
#include "rand.h"
#include "ssl.h"
#include "x509v3.h"
//#pragma comment(lib, "Ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    if(!SSL_library_init(  ))
    {
        printf("Library Load\n");
        return 0;
    }

    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();
    WSADATA wData;
    WSAStartup(MAKEWORD(2,2),&wData);


    int iFlag = 1;
    struct sockaddr_in       sServerAddr;
    SSL_CTX  * pSslCtx;
    BIO      * pBIOConn;
    SSL      * pSSLConn;


    pSslCtx = SSL_CTX_new(SSLv23_method());

    // TODO: Add your control notification handler code here

    if(!pSslCtx)
    {
        printf("New CTX failed");
        return 0;
    }

    char                CertLoad[1024];


    sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_auth_certificate.cer");
    if (SSL_CTX_load_verify_locations(pSslCtx,CertLoad, NULL) != 1)
    {
        printf("SSL_CTX_load_verify_locations failed");
        return 0;
    }


    if (SSL_CTX_set_default_verify_paths(pSslCtx) != 1)
    {
        printf("SSL_CTX_set_default_verify_paths failed");
        return 0;
    }

    sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_client_certificate.cer");
    if (SSL_CTX_use_certificate_chain_file(pSslCtx, CertLoad) != 1)
    {
        printf("SSL_CTX_use_certificate_chain_file failed");
        return 0;
    }


    sprintf_s(CertLoad,1024,"C:\\VisualStudio\\SSL_sample\\ssl_client_private_key.key");
    if (SSL_CTX_use_PrivateKey_file(pSslCtx, CertLoad, SSL_FILETYPE_PEM) != 1)
    {
        printf("SSL_CTX_use_PrivateKey_file failed");
        return 0;
    }


    SSL_CTX_set_options(pSslCtx, SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);

    if (SSL_CTX_set_cipher_list(pSslCtx, "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH") != 1)
    {
        printf("SSL_CTX_set_default_verify_paths failed");
        return 0;
    }

    SSL_CTX_set_verify(pSslCtx, SSL_VERIFY_NONE, NULL);

    memset(&sServerAddr, 0, sizeof(sServerAddr));
    sServerAddr.sin_family      = AF_INET;
    unsigned long inaddr        = inet_addr("192.168.1.24");
    memcpy(&sServerAddr.sin_addr,&inaddr,sizeof(inaddr));
    sServerAddr.sin_port        = htons(54321);
    SOCKET iSocket = 0;
    iSocket = socket(AF_INET, SOCK_STREAM, 0);
    int lasterr = WSAGetLastError();
    if( iSocket == INVALID_SOCKET)
    {

        printf("Connection fialed");
        return 0;
    }
    setsockopt(iSocket,
               SOL_SOCKET,
               SO_KEEPALIVE,
               (char*)&iFlag,
               (int)sizeof(iFlag));
    u_long uMode = 0;
    if(ioctlsocket(iSocket, FIONBIO, &uMode) != 0 )
    {
        int lasterr = WSAGetLastError();
        printf("Connection fialed");
    }


    if(connect(iSocket,
               (struct sockaddr *) &sServerAddr,
               (int) sizeof(sServerAddr)) == -1)
    {
        int lasterr = WSAGetLastError();
        printf("Connection fialed");
        return 0;
    }



    pSSLConn          = SSL_new(pSslCtx);
    if(!pSSLConn)
    {
        printf("SSL_new failed");
        return 0;
    }

    SSL_set_fd(pSSLConn, iSocket);

    pBIOConn = BIO_new_socket(iSocket, BIO_NOCLOSE);

    SSL_set_bio(pSSLConn, pBIOConn, pBIOConn);

    SSL_set_connect_state(pSSLConn);
    int retssl = SSL_connect(pSSLConn);
    if (retssl <= 0)
    {
        switch(SSL_get_error(pSSLConn,retssl))
        {
        case SSL_ERROR_NONE:
            printf("SSL_ERROR_NONE failed");
            break;
        case SSL_ERROR_ZERO_RETURN:
            printf("SSL_ERROR_ZERO_RETURN failed");
            break;
        case SSL_ERROR_WANT_READ:
        case SSL_ERROR_WANT_WRITE:
            printf("SSL_ERROR_WANT_READ  SSL_ERROR_WANT_WRITE failed");
            break;
        case SSL_ERROR_WANT_CONNECT:
        case SSL_ERROR_WANT_ACCEPT:
            printf("SSL_ERROR_WANT_CONNECT  SSL_ERROR_WANT_ACCEPT failed");
            break;
        case SSL_ERROR_WANT_X509_LOOKUP:
            printf("SSL_ERROR_WANT_X509_LOOKUP failed");
            break;
        case SSL_ERROR_SYSCALL:
            printf("SSL_ERROR_SYSCALL failed");
            break;
        case SSL_ERROR_SSL:
            printf("SSL_ERROR_SSL failed");
            break;

        }

        return 0;
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...