我花了一些时间搜索互联网寻找更好的方法来分析和调试我的问题,但我似乎无法找到解决方案.所以我想我会问.
简单地说.我正在尝试创建一个非阻塞的ssl转发代理.代理的服务器部分使用自签名服务器证书,我使用自己的CA证书签名.如果重要,我正在使用libev.我首先成功创建了一个非加密代理(它盲目地转发了网络流量),现在我正在尝试添加SSL.:)
我在让客户端连接到代理时遇到问题.我已经尝试过wget和ssl的s_client作为测试客户端,因为我想要进行一些自动化测试.
ssl服务器设置(此代码在EV_READ事件中从libev观察器侦听套接字accept_handler()调用):
/* setup client side ssl state (we are a SERVER) */
ctx = SSL_CTX_new(SSLv23_server_mode());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLV2 | SSL_OP_ALL);
SSL_CTX_set_info_callback(ctx, client_info_cb);
SSL_CTX_set_cipher_list(ctx, "ALL:!SSLv2:-aNULL");
//SSL_CTX_load_verify_locations(ctx, CA_CERTIFICATE, NULL);
//SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CA_CERTIFICATE));
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
SSL_CTX_set_verify_depth(ctx, 0);
SSL *client_ssl = SSN_new(ctx);
SSL_set_mode(client_ssl, SSL_MODE_ENABLE_PARTIAL_WRITE);
SSL_set_accept_state(client_ssl);
SSL_set_fd(client_ssl, client_fd);
/* initialize client handshake watchers */
ev_io_init(&ev_r_ch, client_handshake, client_fd, EV_READ);
ev_io_init(&ev_w_ch, client_handshake, client_fd, EV_WRITE);
... other watcher inits and set watcher data portions ...
/* start the read */
ev_io_start(loop, &ev_r_ch);
Run Code Online (Sandbox Code Playgroud)
libev循环设置为:
loop = ev_default_loop(EVFLAG_AUTO); …Run Code Online (Sandbox Code Playgroud)