OpenSSL源码之erro定位两种方法

       聊一聊在实际定位openssl错误过程中的处理思路。

       openssl提供了err模块实现日志记录的功能。很多时候需要根据err的记录结果确认错误的原因,即找到出错的那一行。以如下两条错误的记录来说明错误的定位方法:

1、error:140A1175:SSLroutines:ssl_bytes_to_cipher_list:inappropriate
fallback

       数字部分表示的是错误的记录码,该记录码由三部分组成。一共4个字节,前8位表示的是模块的编号,例如14(十六进制)指的就是编号为20的ssl模块;紧接着的12位表示的是函数的编号,例如0A1表示的就是ssl模块中编号为161的函数 ssl_bytes_to_cipher_list,175表示的是错误的原因,表示编号为373的错误类型SSL_R_INAPPROPRIATE_FALLBACK,对应的字符串输出为inappropriate fallback。当然从后向前看,就是SSL_R_INAPPROPRIATE_FALLBACK类型错误发生在 ssl_bytes_to_cipher_list函数中,该函数属于ssl模块。

       事实上在ssl_bytes_to_cipher_list会发现SSLerr(SSL_F_SSL_BYTES_TO_CIPHER_LIST,SSL_R_INAPPROPRIATE_FALLBACK)这样的错误输出,因此可以很容易的定位发生该种错误的原因。当然实际定位问题中都是直接搜索错误原因字符串,找到错误原因码,然后搜索错误原因码那个宏,找到错误的位置。

2,error:14094416:SSLroutines:ssl3_read_bytes:sslv3 alert certificate
unknown

       如上分析,该种错误指的是发生在ssl模块, ssl3_read_bytes函数中的SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN类型错误(SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN是定义为1046即16进制为416的宏,对应错误码的最后12位)
       按照前面的情况推断在函数 ssl3_read_bytes应该有如下的错误记录:

SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN)

       但是这种情况并没有出现,在该函数中发现了如下的错误输出

SSLerr(SSL_F_SSL3_READ_BYTES, SSL_AD_REASON_OFFSET + alert_descr)

       通过查看源码发现 alert_descr表示提取的Alert Message中的Description部分,通常Alert Message包含错误的Level以及错误Description。也就是说一端读取另一端发送过来的报文数据,解析Alert Message消息发现Description字段为2e(十进制为46),因此记录错误为SSLerr(SSL_F_SSL3_READ_BYTES, SSL_AD_REASON_OFFSET + 46),而 SSL_AD_REASON_OFFSET宏值为1000,因此就形成了错误原因为 SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN(1046)这样一个错误。因此对于情况二错误需要在相应的函数中去寻找,需要了解一定的源码过程。

       这两种情况就是实际在定位错误过程中遇到的。

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

你可能感兴趣的:(openssl,源码剖析)