当前位置: 技术问答>linux和unix
SSL 连接偶尔会失败
来源: 互联网 发布时间:2016-12-27
本文导语: 本人最近在做SSL方面的开发和测试。遇到一些棘手的问题,希望高手们能帮助。 我客户端,做好SSL初始化,参数设置等一系列工作后,调用SSL_connect() 偶尔会出现失败的情况 【注:大概30-40次 出现一次,有时候接...
本人最近在做SSL方面的开发和测试。遇到一些棘手的问题,希望高手们能帮助。
我客户端,做好SSL初始化,参数设置等一系列工作后,调用SSL_connect() 偶尔会出现失败的情况
【注:大概30-40次 出现一次,有时候接连出现2-3次】。
查找errno 返回值是235, SSL中定义为SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER-尝试使用不支持的加密方式。
1. SSL_connect 即客户端和服务器进行握手,使用何种加密方式是由服务器决定吗?不明白为什么偶尔失败。失败的原因是什么
由于本人做的是类似嵌入式的工作,SSL已经是做好的lib,有些底层的函数我都无法使用,一些调试状态我也无法跟踪。
2.在使用SSL_connect 之后我还使用 Post Connection Check (调用SSL_get_peer_certificate)检查PEER CERTIFICATE。(网上讲这个并不是必须的)
有时候即使SSL_connect失败了,该检查依然可以通过,
以下是能抓到的一点SSL State
Socket connect is successful returned: 0 errno: 2
SL_set_fd inResult: 1
info: SSL 7045A154 10 1 SSL->state 5000
info: SSL 7045A154 1001 1 SSL->state 5000
info: SSL 7045A154 1001 1 SSL->state 1210
info: SSL 7045A154 1001 1 SSL->state 1120
info: SSL 7045A154 1001 1 SSL->state 1130
info: SSL 7045A154 1001 1 SSL->state 1160
info: SSL 7045A154 1001 1 SSL->state 1180
info: SSL 7045A154 1001 1 SSL->state 11A0
info: SSL 7045A154 1001 1 SSL->state 11B0
info: SSL 7045A154 1001 1 SSL->state 1100
info: SSL 7045A154 1002 -1 SSL->state 11D0
info: SSL 7045A154 1002 -1 SSL->state 11D0
SSL_connect inResult: -1 errno: 235
SSL connection using AES256-SHA
info: 信息都是通过infocallback 函数来实现的。
SSL->state在SSL定义中
#define SSL_ST_CONNECT 0x1000
#define SSL_ST_ACCEPT 0x2000
#define SSL_ST_MASK 0x0FFF
#define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT)
#define SSL_ST_BEFORE 0x4000
#define SSL_ST_OK 0x03
#define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT)
#define SSL_CB_LOOP 0x01
#define SSL_CB_EXIT 0x02
#define SSL_CB_READ 0x04
#define SSL_CB_WRITE 0x08
#define SSL_CB_ALERT 0x4000 /* used in callback */
#define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ)
#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE)
#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP)
#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT)
#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP)
#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT)
#define SSL_CB_HANDSHAKE_START 0x10
#define SSL_CB_HANDSHAKE_DONE 0x20
但是还是计算不出是哪个states
最后一句 SSL connection using AES256-SHA 是使用SSL_get_cipher来查看当前使用的cipher,有时候连接失败了返回值是NONE,但是有的时候失败了,返回值竟然还是AES256-SHA。
我客户端,做好SSL初始化,参数设置等一系列工作后,调用SSL_connect() 偶尔会出现失败的情况
【注:大概30-40次 出现一次,有时候接连出现2-3次】。
查找errno 返回值是235, SSL中定义为SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER-尝试使用不支持的加密方式。
1. SSL_connect 即客户端和服务器进行握手,使用何种加密方式是由服务器决定吗?不明白为什么偶尔失败。失败的原因是什么
由于本人做的是类似嵌入式的工作,SSL已经是做好的lib,有些底层的函数我都无法使用,一些调试状态我也无法跟踪。
2.在使用SSL_connect 之后我还使用 Post Connection Check (调用SSL_get_peer_certificate)检查PEER CERTIFICATE。(网上讲这个并不是必须的)
有时候即使SSL_connect失败了,该检查依然可以通过,
以下是能抓到的一点SSL State
Socket connect is successful returned: 0 errno: 2
SL_set_fd inResult: 1
info: SSL 7045A154 10 1 SSL->state 5000
info: SSL 7045A154 1001 1 SSL->state 5000
info: SSL 7045A154 1001 1 SSL->state 1210
info: SSL 7045A154 1001 1 SSL->state 1120
info: SSL 7045A154 1001 1 SSL->state 1130
info: SSL 7045A154 1001 1 SSL->state 1160
info: SSL 7045A154 1001 1 SSL->state 1180
info: SSL 7045A154 1001 1 SSL->state 11A0
info: SSL 7045A154 1001 1 SSL->state 11B0
info: SSL 7045A154 1001 1 SSL->state 1100
info: SSL 7045A154 1002 -1 SSL->state 11D0
info: SSL 7045A154 1002 -1 SSL->state 11D0
SSL_connect inResult: -1 errno: 235
SSL connection using AES256-SHA
info: 信息都是通过infocallback 函数来实现的。
SSL->state在SSL定义中
#define SSL_ST_CONNECT 0x1000
#define SSL_ST_ACCEPT 0x2000
#define SSL_ST_MASK 0x0FFF
#define SSL_ST_INIT (SSL_ST_CONNECT|SSL_ST_ACCEPT)
#define SSL_ST_BEFORE 0x4000
#define SSL_ST_OK 0x03
#define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT)
#define SSL_CB_LOOP 0x01
#define SSL_CB_EXIT 0x02
#define SSL_CB_READ 0x04
#define SSL_CB_WRITE 0x08
#define SSL_CB_ALERT 0x4000 /* used in callback */
#define SSL_CB_READ_ALERT (SSL_CB_ALERT|SSL_CB_READ)
#define SSL_CB_WRITE_ALERT (SSL_CB_ALERT|SSL_CB_WRITE)
#define SSL_CB_ACCEPT_LOOP (SSL_ST_ACCEPT|SSL_CB_LOOP)
#define SSL_CB_ACCEPT_EXIT (SSL_ST_ACCEPT|SSL_CB_EXIT)
#define SSL_CB_CONNECT_LOOP (SSL_ST_CONNECT|SSL_CB_LOOP)
#define SSL_CB_CONNECT_EXIT (SSL_ST_CONNECT|SSL_CB_EXIT)
#define SSL_CB_HANDSHAKE_START 0x10
#define SSL_CB_HANDSHAKE_DONE 0x20
但是还是计算不出是哪个states
最后一句 SSL connection using AES256-SHA 是使用SSL_get_cipher来查看当前使用的cipher,有时候连接失败了返回值是NONE,但是有的时候失败了,返回值竟然还是AES256-SHA。
|
你测试的时候网络环境怎么样?
如果是偶尔测一次,你可以在败时在来一次或许可以解决?
如果是偶尔测一次,你可以在败时在来一次或许可以解决?