返回

提问 添加收藏

OpenSSL的SSL_accept返回:SSLv2/v3 read client hello A

lxdfigo 发布于 2017年06月19日 (共有0个回帖)

首先,我的证书server.pem在使用openssl s_server 与 openssl s_client测试时是没有问题的,然后我使用openssl s_client对我写的服务端进行连接时,在SSL_accept这一步服务端报了如下的错误:

error:00000000:lib(0):func(0):reason(0)

查看了SSL_state_string_long为:SSLv2/v3 read client hello A

代码基本如下:

    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();
    pSSLctx_ = SSL_CTX_new (SSLv23_server_method());

    if (!pSSLctx_) {
        ERR_print_errors_fp(stderr);
        exit(2);
    }
    std::string fileName1 = path + "pem/cacert.pem";//"SSL_SERVER_CERTIFICATE"
    std::string fileName2 = path + "pem/prvtkey.pem";//"SSL_SERVER_CERTIFICATE"

    if (SSL_CTX_use_certificate_file(pSSLctx_, fileName1.c_str(), SSL_FILETYPE_PEM) <= 0) {
        ERR_print_errors_fp(stderr);
        exit(3);
    }
    if (SSL_CTX_use_PrivateKey_file(pSSLctx_, fileName2.c_str(), SSL_FILETYPE_PEM) <= 0) {
        ERR_print_errors_fp(stderr);
        exit(4);
    }

    if (!SSL_CTX_check_private_key(pSSLctx_)) {
        fprintf(stderr,"Private key does not match the certificate public key\n");
        exit(5);
    }


        /* 基于 ctx 产生一个新的 SSL */  
        ssl = SSL_new(pSSLctx_);  
        if (ssl == NULL) {
            return NULL;
        }
        /* 将连接用户的 socket 加入到 SSL */  
        SSL_set_fd(ssl, pNew->socket());

        /* 建立 SSL 连接 */  
        if (SSL_accept(ssl) == -1) {
            char szErrMsg[1024] = {0};
            char *pTmp = NULL;

            pTmp = ERR_error_string(ERR_get_error(),szErrMsg); // 格式:error:errId:库:函数:原因
            ERROR_MSG(fmt::format("SSL_accept ERROR: {}\n", pTmp));
            ERROR_MSG(fmt::format("SSL_accept SSL ERROR: {}\n", SSL_state_string_long(ssl)));

              delete pNew;
            return NULL;
        }

请问是什么原因啊?各位大神救命啊!!!

OpenSSL
文明上网,理性发言
客户端 Android iPhone WP7