OpenSSL 代码可以在 XP 上运行,但在 Vista 及更高版本中永远挂起
此代码启动最小的 SSL服务器:
WSAStartup(MakeWord(1,1), WData);
SSL_library_init;
SSL_load_error_strings;
ctx := SSL_CTX_new(SSLv23_server_method);
SSL_CTX_use_certificate_chain_file(ctx, 'cert.pem');
SSL_CTX_use_PrivateKey_file(ctx, 'key.pem', 1);
SSL_CTX_check_private_key(ctx);
bio_ssl := BIO_new_ssl(ctx, 0);
bio_in := BIO_new_accept('443');
BIO_set_accept_bios(bio_in, bio_ssl);
BIO_do_accept(bio_in); // set up the socket
BIO_do_accept(bio_in); // wait for connection
在 XP 上一切正常。代码停留在第二个BIO_do_accept()中 等待连接,并从浏览器发送 HTTPS 请求 导致 BIO_do_accept() 返回。
在 32 位 Vista Home Premium 和 64 位 Windows 7 上,第二个 BIO_do_accept() 永远挂起,浏览器无法连接。 为什么?
更改 32 位 .EXE 的各种兼容模式(Windows XP、Windows NT 等)没有效果。 我正在使用 OpenSSL 1.0.0d。
This code starts a minimal SSL server:
WSAStartup(MakeWord(1,1), WData);
SSL_library_init;
SSL_load_error_strings;
ctx := SSL_CTX_new(SSLv23_server_method);
SSL_CTX_use_certificate_chain_file(ctx, 'cert.pem');
SSL_CTX_use_PrivateKey_file(ctx, 'key.pem', 1);
SSL_CTX_check_private_key(ctx);
bio_ssl := BIO_new_ssl(ctx, 0);
bio_in := BIO_new_accept('443');
BIO_set_accept_bios(bio_in, bio_ssl);
BIO_do_accept(bio_in); // set up the socket
BIO_do_accept(bio_in); // wait for connection
Everything works fine on XP. The code stays in the second BIO_do_accept()
waiting for a connection, and sending an HTTPS request from a browser
causes BIO_do_accept() to return.
On 32-bit Vista Home Premium and 64-bit Windows 7, the second BIO_do_accept() hangs forever, and the browser can't connect.
Why?
Changing the 32-bit .EXE's various compatibility modes (Windows XP, Windows NT, etc) has no effect.
I'm using OpenSSL 1.0.0d.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
它可能与两次 BIO_do_accept() 调用有关。
我采用了 OpenSSL 的 S_SERVER.C代码,进行了一些更改,并将其简化为下面的更简单的版本。它适用于 Vista 和 Windows 7!它使用与上面的问题代码完全不同的 BIO 调用集,非阻塞工作,并且(与 S_SERVER.C 和网络上的大多数服务器示例不同)Google Chrome POST 通过超时正确抓取 问题7054471。
It probably has to do with the double BIO_do_accept() calls.
I took OpenSSL's S_SERVER.C code, made some changes, and crunched it down to the simpler version below. It works on Vista and Windows 7! It uses a completely different set of BIO calls from the problem code above, non-blocking works, and (unlike S_SERVER.C and most server examples on the Net) Google Chrome POSTs are properly grabbed via timeouts per question 7054471.