SSL 使用自签名证书但不适用于 CA 签名证书

时间:2021-07-06 11:39:34

标签: linux ssl certificate

我正在尝试使用 c 语言在服务器(Linux)和客户端(POS 终端)之间建立 ssl 连接。我可以使用自签名证书连接到服务器,但不能使用 CA 签名证书。连接因 ssl 握手错误而终止。我在双方使用相同的文件集。我已经检查了证书的有效性及其可用性。 我也使用了不同类型的协议,例如 TLSv1_2_client_method 等,但没有运气。 谢谢。

client.c

SSL_load_error_strings();
SSL_library_init();
OPENSSL_add_all_algorithms_noconf();

sslContext = SSL_CTX_new(SSLv23_client_method());
if (sslContext == NULL ){
    ERR_print_errors_fp(stderr);
    return SSLERR;
}

SSL_CTX_set_options(sslContext, SSL_OP_ALL | SSL_OP_NO_SSLv2);
SSL_CTX_set_options(sslContext, SSL_OP_SINGLE_DH_USE);
SSL_CTX_set_cipher_list(sslContext, CIPHERS_LIMIT);//all ciphers used

iRet = SSL_CTX_load_verify_locations(sslContext, con->szCA, NULL);
SSL_CTX_set_verify(sslContext,SSL_VERIFY_PEER,NULL);
SSL_CTX_set_default_passwd_cb_userdata(sslContext, "1234");
SSL_CTX_use_certificate_file(sslContext, con->szCert, SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(sslContext, con->szKey,SSL_FILETYPE_PEM);
SSL_CTX_check_private_key(sslContext);

# define SSL_ERROR_WANT_READ             2
    # define SSL_ERROR_WANT_WRITE            3
    while ((r = SSL_do_handshake(con->sslHandle)) != 1 && OsTimerCheck(&timer) > 0) {
    int err = SSL_get_error(con->sslHandle, r);
    if (err == SSL_ERROR_WANT_WRITE) {
        events |= POLLOUT;
        events &= ~POLLIN;
        OsLog( LOG_ERROR, "return want write set events %d\n", events);
    }
    else if (err == SSL_ERROR_WANT_READ) {
        events |= EPOLLIN;
        events &= ~EPOLLOUT;
        OsLog( LOG_ERROR, "return want read set events %d\n", events);
    }
    else {
        OsLog( LOG_ERROR, "SSL_do_handshake return %d error %d errno %d 
    msg %s\n", r, err, errno, strerror(errno));
        ERR_print_errors_fp(stderr);
        check1(0, SSLERR_CONNECT, "do handshake error");
    }

日志:

返回想写设置事件 12 \n 返回想要读取设置事件 9 \n SSL_do_handshake 返回 -1 错误 1 ​​errno 0 msg 成功 \n 做握手错误\n

Server.c

SSL_library_init();
OpenSSL_add_all_algorithms();  /* load & register all cryptos, etc. */
SSL_load_error_strings();   /* load all error messages */
if ((ctx = SSL_CTX_new(SSLv23_server_method())) == NULL) 
if (SSL_CTX_use_certificate_file(ctx, CERT_FILE, SSL_FILETYPE_PEM)
if (SSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, SSL_FILETYPE_PEM)
{
    fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", KEY_FILE);
    slog_debug(0, "ERROR: failed to load %s, please check the file", KEY_FILE)
    return -1;
}
if ( SSL_CTX_check_private_key(ctx)!=SSL_SUCCESS )
if (!SSL_CTX_load_verify_locations (ctx, CA_FILE, NULL))

0 个答案:

没有答案