This Delphi 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? The various definitions used are: const SSLEAY32DLL = 'ssleay32.dll'; LIBEAY32DLL = 'libeay32.dll'; LIBSSL32DLL = 'libssl32.dll'; function SSL_CTX_check_private_key(ctx: Pointer): BOOL; cdecl; external SSLEAY32DLL; function SSL_CTX_new(meth: Pointer): Pointer; cdecl; external SSLEAY32DLL; function SSL_CTX_use_certificate_chain_file(ctx: Pointer; FName: PChar): Integer; cdecl; external SSLEAY32DLL; function SSL_CTX_use_PrivateKey_file(ctx: Pointer; FName: PChar; AType: Integer): Integer; cdecl; external SSLEAY32DLL; procedure SSL_library_init; cdecl; external SSLEAY32DLL; procedure SSL_load_error_strings; cdecl; external SSLEAY32DLL; function SSLv23_server_method: Pointer; cdecl; external SSLEAY32DLL; function BIO_new_ssl(ctx: Pointer; client: Integer): Pointer; cdecl; external LIBSSL32DLL; function BIO_new_accept(port: pchar): Pointer; cdecl; external LIBEAY32DLL; function BIO_ctrl(bp: Pointer; cmd: Integer; larg: Longint; parg: Pointer): longint; cdecl; external LIBEAY32DLL; function BIO_set_accept_bios(b, bio: pointer): integer; const BIO_C_SET_ACCEPT = 118; begin result := BIO_ctrl(b, BIO_C_SET_ACCEPT, 2, bio); end; function BIO_do_accept(b: pointer): integer; const BIO_C_DO_STATE_MACHINE = 101; begin result := BIO_ctrl(b, BIO_C_DO_STATE_MACHINE, 0, nil); end; var WData: TWSAData; ctx, bio_ssl, bio_in: pointer; Changing the 32-bit .EXE's various compatibility modes (Windows XP, Windows NT, etc) has no effect. I'm using OpenSSL 1.0.0d (LIBEAY32.DLL, LIBSSL32.DLL, SSLEAY32.DLL). ______________________________________________________________________ OpenSSL Project http://www.openssl.org User Support Mailing List openssl-users@openssl.org Automated List Manager majord...@openssl.org