OpenSSL中那些方法之ssl_method_st

       在ssl_locl.h中定义了整个协议栈结构的三个非常重要的结构体ssl_ctx_st,ssl_st以及ssl_method_st。本次主要分析结构体变量ssl_method_st,因此其他的结构暂且不表。

       在结构体ssl_ctx_st,ssl_st中均定义了const SSL_METHOD *method,即ssl_method_st类型变量,这个变量在协议栈的主流程中频繁的出现,主要是定义了整个流程过程中遇到的一些函数,例如报文数据读写函数等。由于ssl_method_st结构体中的变量均是函数指针,因此需要搞清楚这些函数指针在什么地方赋值。

       通常使用openssl接口都会先调用SSL_CTX_new以及SSL_new来生成ssl_ctx_st,ssl_st着两种类型的变量,其中在SSL_CTX_new,发现SSL_CTX_new的入参是一个ssl_method_st结构类型变量,该入参会被赋值给ssl_ctx中相应的变量const SSL_METHOD *method,SSL_new的入参为ssl_ctx_st类型变量,因此ssl_st中相应的变量const SSL_METHOD *method也会被赋值。通常SSL_CTX_new的调用如下SSL_CTX_new(TLS_server_method())或者SSL_CTX_new(TLS_client_method()),但是 TLS_server_method或者 TLS_client_method函数只能够找到其声明,找不到其定义。

        前面在分析sk以及lhash这两中基本数据结构的时候,也是找不到sk_以及lhash_开头的函数定义,当时是为了实现相当于面向对象结构中的继承效果,采用了宏定义的方式。 这次同样采用了宏定义的方式。因为ssl_method_st结构体中的函数用于处理ssl数据交互,但是由于ssl版本的不同,因此方法便存在着差异。因此除了在include/openssl/ssl.h中声明的函数外,

 __owur const SSL_METHOD *TLS_method(void); 
__owur const SSL_METHOD *TLS_client_method(void); 

       include中的文件主要用于对外提供接口使用 在ssl/ssl_locl.h中也存在着如下声明 :

__owur const SSL_METHOD *sslv3_method(void); 
__owur const SSL_METHOD *sslv3_server_method(void); 
__owur const SSL_METHOD *sslv3_client_method(void); 
__owur const SSL_METHOD *tlsv1_method(void); 
__owur const SSL_METHOD *tlsv1_server_method(void); 
__owur const SSL_METHOD *tlsv1_client_method(void);
 __owur const SSL_METHOD *tlsv1_1_method(void); 
 __owur const SSL_METHOD *tlsv1_2_method(void); 
__owur const SSL_METHOD *tlsv1_3_method(void); 
__owur const SSL_METHOD *tlsv1_3_server_method(void); 
__owur const SSL_METHOD *tlsv1_3_client_method(void); 

       表示各种版本的函数声明。 前面已经提到,对于这种类似与继承用法函数定义,一般是应用了宏定义。 在ssl/methods.h中出现了IMPLEMENT_tls_meth_func宏,例如: MPLEMENT_tls_meth_func(TLS_ANY_VERSION, 0, 0, TLS_server_method, ossl_statem_accept, ssl_undefined_function, TLSv1_2_enc_data) 而该宏的第四个参数对应的则是前面所提到的函数声明TLS_server_method等, 而该宏则定义在ssl/ssl_locl.h,如下:

define IMPLEMENT_tls_meth_func(version, flags, mask, func_name, s_accept, \

s_connect, enc_data) \
const SSL_METHOD *func_name(void) 
{ 
static const SSL_METHOD func_name##_data= { 
    version, 
    flags, 
    mask, 
    tls1_new, 
    tls1_clear, 
    tls1_free, 
    s_accept, 
    s_connect, 
    ssl3_read, 
    ssl3_peek, 
    ssl3_write, 
    ssl3_shutdown, 
    ssl3_renegotiate, 
    ssl3_renegotiate_check, 
    ssl3_read_bytes, 
    ssl3_write_bytes, 
    ssl3_dispatch_alert, 
    ssl3_ctrl, 
    ssl3_ctx_ctrl, 
    ssl3_get_cipher_by_char, 
    ssl3_put_cipher_by_char, 
    ssl3_pending, 
    ssl3_num_ciphers, 
    ssl3_get_cipher, 
    tls1_default_timeout, 
    &enc_data, 
    ssl_undefined_void_function, 
    ssl3_callback_ctrl, 
    ssl3_ctx_callback_ctrl, 
    }; 
return &func_name##_data; 
} 

       可以看到当入参为TLS_server_method,则实现了对于SSL_METHOD *TLS_server_method(void);的定义,前面所述的其余函数则同理会有相应的定义。

       而在SSL_METHOD *TLS_server_method(void)函数中,可以看到返回了一个静态常量 static const SSL_METHOD TLS_server_method_data,而该常量则会在SSL_CTX_new(TLS_server_method())中,初始化ssl_ctx_st结构体类型中的const SSL_METHOD *method变量。至此,可以看到整个ssl握手过程中所使用到的一些函数均存在于 static const SSL_METHOD TLS_server_method_data中,这些函数包括tls1_new, tls1_clear, tls1_free, 初始化以及清理函数,主要针对SSL3_STATE类型变量;s_accept, s_connect, 服务器和客户端连接的状态机函数。ssl3_read, ssl3_peek, ssl3_write,ssl3_renegotiate, ssl3_renegotiate_check, ssl3_read_bytes, ssl3_write_bytes, 报文读写以及重协商相关函数;ssl3_ctrl, ssl3_ctx_ctrl, 一些控制函数;ssl3_callback_ctrl,ssl3_ctx_callback_ctrl, 用户可以设置的控制回调函数,enc_data变量主要是 IMPLEMENT_tls_meth_func(TLS_ANY_VERSION, 0, 0, TLS_server_method, ossl_statem_accept, ssl_undefined_function, TLSv1_2_enc_data) 这类宏传进的最后一个参数 TLSv1_2_enc_data来决定的,可以看到这是一个全局变量,定义在ssl/t1_lib.c中,该变量主要定义了ssl3_enc_method结构体中加解密和摘要等相关算法的封装。在涉及到加解密以及摘要相关部分,再详细说明。

       本文为CSDN村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054是一个与网络连接相关的错误。这个错误通常出现在使用Git进行提交或克隆操作时。可以根据以下几种方法来解决这个问题: 1. 检查网络连接:首先,确保你的网络连接正常并且稳定。这个错误通常是由于网络过慢或不稳定导致的。可以尝试使用不同的网络连接,者连接到更稳定的网络上再次尝试操作。 2. 更换网络环境:如果你使用的是公共Wi-Fi或者公司的网络,有时候这些网络对Git操作进行了限制。尝试切换到一个不同的网络环境,例如使用个人热点或者使用家庭网络来进行操作。 3. 使用代理:如果你在使用Git时遇到了网络问题,可以尝试配置代理。可以使用`git config`命令来设置代理,具体的设置方法可以参考Git的官方文档。 4. 手动下载:如果以上方法都没有解决问题,你可以尝试手动下载所需的文件。在Git操作遇到网络问题时,你可以手动从源码管理系统(例如GitHub)下载所需的文件,然后将其放置在正确的位置,再进行后续的操作。 总结起来,OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054错误通常是由于网络连接问题引起的。通过检查网络连接、更换网络环境、使用代理或者手动下载文件等方法,可以解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [提交Git时报错:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054](https://blog.csdn.net/qq_42203909/article/details/123882309)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [安装vagrant报错OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54](https://download.csdn.net/download/weixin_38627213/14043306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ERROR: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054解决方法](https://blog.csdn.net/JISOOLUO/article/details/103625488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值