OpenSSL之s_client分析

系列文章目录

本系列OpenSSL使用的代码版本为:1.0.2o


前言

本篇文章纯属个人学习的一点经验分享,若有不对之处烦请各位大神现身指点,希望能和大家一起共同进步


一、s_client是什么?

s_client是openssl命令行插件中的客户端部分,使用openssl命令进行ssl连接,命令如:

openssl s_client -cert ./sm2_pki.cer -key ./priv.key -cipher ECC-SM4-SM3 -connect ip:port

二、s_client代码分析

   在openssl中,使用openssl命令的主函数入口统一都在apps下的openssl.c文件中,首先调用apps_startup()初始化openssl加载算法套件等操作,然后NCONF_load(config, p, &errline)加载系统参数中配置的openssl.cnf文件,之后调用do_cmd(prog, Argc, Argv)进入命令行处理。

   在do_cmd方法中,首先调用lh_FUNCTION_retrieve(prog, &f)根据s_client查找对应的注册函数,找到之后调用fp->func(argc, argv)将命令行参数传递进去,这里进去之后就到了s_client.c文件的MAIN函数,进入s_client的处理流程。

         在MAIN中首先是初始化openssl,加载BIO_err及加载openssl.cnf等前期准备工作,然后进入到while (argc >= 1) {}循环中处理命令行参数,获取命令行的各种参数及命令。

        解析完命令之后,根据engine_id加载算法引擎,如果engine_id为0则表示没有指定算法引擎,e = setup_engine(bio_err, engine_id, 1)返回结果为NULL。

       之后 if (key_file == NULL) key_file = cert_file;判断命令行中是否存在密钥文件,不存在则使用证书文件赋值。然后调用load_key()加载密钥文件,调用load_cert()加载证书文件,调用load_certs()方法加载客户端证书链,如果有crl文件则调用load_crl(crl_file, crl_format)加载crl文件。

          加载完密钥证书之后,调用SSL_CTX_set_verify(ctx, verify, verify_callback)设置是否启用双向认证,设置认证类型,如果设置了CA证书则SSL_CTX_load_verify_locations()加载CA证书,调用set_cert_key_stuff(ctx, cert, key, chain, build_chain)将证书、密钥和证书链等设置进ctx句柄中,同时检查证书和密钥的匹配性。

         最后调用con = SSL_new(ctx)生成一个ssl连接句柄,调用init_client(&s, host, port, socket_type)创建socket,建立socket连接,调用sbio = BIO_new_socket(s, BIO_NOCLOSE)创建连接bio,调用SSL_set_bio(con, sbio, sbio)将连接bio设置进ssl连接中,调用SSL_set_connect_state(con)进行ssl连接设置,然后使用select监听fd,当有数据可读写时调用SSL_write或者SSL_read进行读写,当连接没有建立时SSL_write会先调用ssl23_connect函数进行ssl连接建立,连接成功建立之后就是数据的收发,如果没有指定收发数据的协议类型,则通常都是裸数据传输。

        连接建立成功之后,openssl的s_client基本算是跑完了,以上就是s_client流程的初略分析,涉及到ssl的具体建立流程及过程,我们后面再慢慢讲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值