我正在尝试在RHEL 4系统(openssl 0.9.8b)中编写web服务客户端(升级不是一个选项)。我得到了要使用的CA证书文件,其中有两个证书,一个是自签名根证书。它可以与"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 is“接受。
我用过
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证书文件为"-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“所做的和代码所做的有什么不同呢?
发布于 2017-05-30 21:52:57
我将"OpenSSL_add_all_algorithms()“添加到代码中,使其正常工作。原来没有找到服务器证书所使用的算法。代码和openssl s_client命令之间的区别很明显就是这个调用。
测试程序中的代码取自Axis2/C源代码,因为我的客户机是基于Axis2/C的,所以这里也没有这个调用。
https://stackoverflow.com/questions/44245716
复制相似问题