我使用modssl通过Apache运行一个代理服务器,我们用这个代理服务器将来自移动设备的POST代理到另一个内部服务器。 这对大多数客户成功地工作,但来自特定手机型号(诺基亚2690)的请求正在显示一个奇怪的握手失败。
看起来好像OpenSSL要么从电话中请求(或试图读取未经请求的)客户端证书(这是特别奇怪的,因为j2me的kssl实现不支持客户端证书)。 我在虚拟主机conf和modssl conf中都使用SSLVerifyClient none指令禁用了客户端证书。 debugging级别的error.log跟踪是(详细编辑):
[client 41.220.207.10] Connection to child 0 established (server www.myserver.org:443) [info] Seeding PRNG with 656 bytes of entropy [debug] ssl_engine_kernel.c(1866): OpenSSL: Handshake: start [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: before/accept initialization [debug] ssl_engine_io.c(1882): OpenSSL: read 11/11 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d0] (BIO dump follows) [debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1882): OpenSSL: read 49/49 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90db] (BIO dump follows) [debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+ [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 read client hello A [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write server hello A [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write certificate A [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 write server done A [debug] ssl_engine_kernel.c(1874): OpenSSL: Loop: SSLv3 flush data [debug] ssl_engine_io.c(1882): OpenSSL: read 5/5 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d0] (BIO dump follows) [debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1882): OpenSSL: read 2/2 bytes from BIO#7fe3fbaf17a0 [mem: 7fe3fbaf90d5] (BIO dump follows) [debug] ssl_engine_io.c(1815): +-------------------------------------------------------------------------+ [debug] ssl_engine_io.c(1860): +-------------------------------------------------------------------------+ [debug] ssl_engine_kernel.c(1879): OpenSSL: Read: SSLv3 read client certificate A [debug] ssl_engine_kernel.c(1898): OpenSSL: Exit: failed in SSLv3 read client certificate A [client 41.220.207.10] SSL library error 1 in handshake (server www.myserver.org:443) [info] SSL Library Error: 336151568 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure [client 41.220.207.10] Connection closed to child 0 with abortive shutdown (server www.myserver.org:443)
我已经尝试使用modssl暂时启用所有密码和所有协议,这两者似乎都不是问题。 手机应该使用RSA_RC4_128_MD5和SSLv3,所有这些都可用。
我在这里失去了什么更重要的东西? 似乎证书请求可能是重新协商失败的一部分。 我试图在虚拟主机上启用SSLInsecureRenegotiation On ,以防万一这是手机SSL不支持新协议的问题,但无济于事。
目前运行:Apache / 2.2.16(Ubuntu)mod_ssl / 2.2.16 OpenSSL / 0.9.8o Apache proxy_html / 3.0.1
我遇到了同样的问题,结果是问题实际上出现在了错误信息中 – 令人困惑。 如果你看看服务器读取的确切的协议字节(你删除了 – 这是我的日志中的相关部分):
ssl_engine_io.c(1854):| 0000:15 03 01 00 02
ssl_engine_io.c(1854):| 0000:02 28
0x15是指ContentType 21,它是一个警告消息。 “03 01”是版本,“00 02”是实际消息的长度。
“02 28”表示致命错误40,指的是handshake_failure,这只是表示服务器没有提供客户端可以使用的任何东西。 换句话说,诺基亚没有所需的根证书来识别您的ssl证书。
发生此错误时,服务器协议状态机正在等待读取可选的客户端证书。 因此,“SSLv3读取客户端证书A”只是服务器报告从客户端收到警报消息时所处的状态。
只是有点混乱。