Https SSL服务器证书验证在代码中失败,但在openssl中未失败

Https SSL服务器证书验证在代码中失败,但在openssl中未失败,https,openssl,ssl-certificate,axis2c,Https,Openssl,Ssl Certificate,Axis2c,我正在尝试在RHEL 4系统(openssl 0.9.8b)中编写web服务客户端代码(升级不是选项)。我得到了要使用的CA证书文件,有两个证书,一个是自签名根证书。它可以与“openssl s_客户端”一起使用,但不能从代码中使用。在那里,我从SSL获取验证结果中得到错误7(SSL证书验证失败) 我做了一个测试程序,下面是基本部分: SSL_library_init(); SSL_load_error_strings(); ctx = SSL_CTX_new(SSLv23_method());

我正在尝试在RHEL 4系统(openssl 0.9.8b)中编写web服务客户端代码(升级不是选项)。我得到了要使用的CA证书文件,有两个证书,一个是自签名根证书。它可以与“openssl s_客户端”一起使用,但不能从代码中使用。在那里,我从SSL获取验证结果中得到错误7(SSL证书验证失败)

我做了一个测试程序,下面是基本部分:

SSL_library_init();
SSL_load_error_strings();
ctx = SSL_CTX_new(SSLv23_method());
SSL_CTX_load_verify_locations(ctx, "/etc/pki/mycert/cacert.pem", 0);
ssl = SSL_new(ctx);
sbio = BIO_new_socket(sock, BIO_NOCLOSE); /* The socket is already connected */
SSL_set_bio(ssl, sbio, sbio);
SSL_connect(ssl);
err = SSL_get_verify_result(ssl);
连接正常,服务器发送证书;我已经用PEM_write_X509将其转储,并验证它是否被“openssl验证”接受

我用过

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);
要在回调函数中写出验证步骤,请执行以下操作:

static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
{
    char    buf[256];
    X509   *err_cert;
    int     err, depth;

    err_cert = X509_STORE_CTX_get_current_cert(ctx);
    err = X509_STORE_CTX_get_error(ctx);
    depth = X509_STORE_CTX_get_error_depth(ctx);

    X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256);

if (!preverify_ok)
    printf("verify error:num=%d:%s:depth=%d:%s\n", err,
             X509_verify_cert_error_string(err), depth, buf);
else
    printf("Preverify OK, depth=%d:%s, err=%d\n", depth, buf, err);
...
其输出为(某些证书数据替换为“…”):

运行“openssl s_client”时,此CA证书文件为“-CAfile”,输出以以下内容开始:

depth=2 /ST=GP/L=JHB/C ... QA Root CA 01
verify return:1
depth=1 /C=ZA/DC=za/DC ... QA Issue CA 01
verify return:1
depth=0 /C=ZA/ST ...
verify return:1

那么,“openssl s_客户端”所做的与代码所做的有什么区别呢?

我通过在代码中添加“openssl_add_all_algorithms()。结果是找不到服务器证书使用的算法。代码和openssl s_客户端命令之间的区别显然在于此调用


测试程序中的代码取自Axis2/C源代码,因为我的客户机基于Axis2/C。因此,这里也缺少此调用。

我通过在代码中添加“OpenSSL\u add\u all\u algorithms()”使其正常工作。结果是找不到服务器证书使用的算法。代码和openssl s_客户端命令之间的区别显然在于此调用

测试程序中的代码取自Axis2/C源代码,因为我的客户机是基于Axis2/C的。因此这里也缺少此调用

depth=2 /ST=GP/L=JHB/C ... QA Root CA 01
verify return:1
depth=1 /C=ZA/DC=za/DC ... QA Issue CA 01
verify return:1
depth=0 /C=ZA/ST ...
verify return:1