SSL Server证书验证在代码中失败,但没有使用OpenSSL



我正在尝试在RHEL 4系统(OpenSSL 0.9.8B(中编码Web服务客户端(升级不是选项(。我有使用CA CERT文件,并带有两个证书,一个是一个自签名的根证书。它可以与" Openssl s_client"一起使用,但不能来自代码。在那里,我从ssl_get_verify_result。

获得错误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 verify"接受。

我已经使用过

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:%sn", err,
             X509_verify_cert_error_string(err), depth, buf);
else
    printf("Preverify OK, depth=%d:%s, err=%dn", depth, buf, err);
...

输出是(某些证书数据替换为" ..."(:

Preverify OK, depth=2:/ST=GP/L=JHB/C ... QA Root CA 01, err=0
Preverify OK, depth=1:/C=ZA/DC=za/DC ... QA Issue CA 01, err=0
verify error:num=7:certificate signature failure:depth=0:/C=ZA ...

使用此CA CERT文件作为" -Cafile"运行" OpenSSL S_CLIENT"时,输出以:

开始
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_client"正在做什么,代码在做什么?

我通过在代码中添加" openssl_add_all_algoriths(("来使它起作用。事实证明,没有找到服务器证书使用的算法。代码和openssl s_client命令之间的区别显然是此调用。

由于我的客户端基于AXIS2/c,因此测试程序中的代码是从AXIS2/C源代码中获取的。因此,此通话也缺少。

最新更新