SSL服务器证书验证代码失败,但不使用OpenSSL

问题描述:

我试图在RHEL 4系统编写一个Web服务客户端(OpenSSL的0.9.8b)(升级不是一个选项)。我拿到了CA证书文件,使用两个证书,一个是自签名根证书。它适用于“openssl s_client”,但不适用于代码。我从SSL_get_verify_result收到错误7(SSL证书验证失败)。SSL服务器证书验证代码失败,但不使用OpenSSL

我做了一个测试程序,这里的基本部分:

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:%s\n", err, 
      X509_verify_cert_error_string(err), depth, buf); 
else 
    printf("Preverify OK, depth=%d:%s, err=%d\n", 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证书文件运行“openssl s_client”为“-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_client”在做什么和代码在做什么之间有什么区别?

我把它加入“OpenSSL_add_all_algorithms()”的代码工作。事实证明,没有找到服务器证书使用的算法。代码和openssl s_client命令之间的区别显然是这个调用。

在测试程序中的代码是从所述的Axis2/C源代码截取,因为我的客户端基于的Axis2/C。所以这个电话也没有。