7
7
// Not present in openssl 1.1 headers
8
8
#define SSL_CTRL_OPTIONS 32
9
9
10
+ static bool TryOpenLibraries (const char *sslName, LibraryLoader::handle *& sslHandle, const char *cryptoName, LibraryLoader::handle *&cryptoHandle)
11
+ {
12
+ sslHandle = LibraryLoader::OpenLibrary (sslName);
13
+ cryptoHandle = LibraryLoader::OpenLibrary (cryptoName);
14
+
15
+ if (sslHandle && cryptoHandle)
16
+ return true ;
17
+
18
+ if (sslHandle)
19
+ LibraryLoader::CloseLibrary (sslHandle);
20
+ if (cryptoHandle)
21
+ LibraryLoader::CloseLibrary (cryptoHandle);
22
+ return false ;
23
+ }
24
+
10
25
OpenSSLConnection::SSLFuncs::SSLFuncs ()
11
26
{
12
27
using namespace LibraryLoader ;
13
28
14
- valid = false ;
29
+ handle *sslhandle = nullptr ;
30
+ handle *cryptohandle = nullptr ;
15
31
16
- // Try OpenSSL 1.1
17
- handle *sslhandle = OpenLibrary (" libssl.so.1.1" );
18
- handle *cryptohandle = OpenLibrary (" libcrypto.so.1.1" );
19
- // Try OpenSSL 1.0
20
- if (!sslhandle || !cryptohandle)
21
- {
22
- sslhandle = OpenLibrary (" libssl.so.1.0.0" );
23
- cryptohandle = OpenLibrary (" libcrypto.so.1.0.0" );
24
- }
25
- // Try OpenSSL without version
26
- if (!sslhandle || !cryptohandle)
27
- {
28
- sslhandle = OpenLibrary (" libssl.so" );
29
- cryptohandle = OpenLibrary (" libcrypto.so" );
30
- }
31
- // Give up
32
- if (!sslhandle || !cryptohandle)
32
+ valid = TryOpenLibraries (" libssl.so.3" , sslhandle, " libcrypto.so.3" , cryptohandle)
33
+ || TryOpenLibraries (" libssl.so.1.1" , sslhandle, " libcrypto.so.1.1" , cryptohandle)
34
+ || TryOpenLibraries (" libssl.so.1.0.0" , sslhandle, " libcrypto.so.1.0.0" , cryptohandle)
35
+ // Try the version-less name last, it may not be compatible or tested
36
+ || TryOpenLibraries (" libssl.so" , sslhandle, " libcrypto.so" , cryptohandle);
37
+ if (!valid)
33
38
return ;
34
39
35
40
valid = true ;
36
- valid = valid && (LoadSymbol (library_init, sslhandle, " SSL_library_init" ) ||
37
- LoadSymbol (init_ssl, sslhandle, " OPENSSL_init_ssl" ));
41
+ valid = valid && (
42
+ LoadSymbol (init_ssl, sslhandle, " OPENSSL_init_ssl" ) ||
43
+ LoadSymbol (library_init, sslhandle, " SSL_library_init" ));
38
44
39
45
valid = valid && LoadSymbol (CTX_new, sslhandle, " SSL_CTX_new" );
40
46
valid = valid && LoadSymbol (CTX_ctrl, sslhandle, " SSL_CTX_ctrl" );
47
+ if (valid)
48
+ LoadSymbol (CTX_set_options, sslhandle, " SSL_CTX_set_options" );
41
49
valid = valid && LoadSymbol (CTX_set_verify, sslhandle, " SSL_CTX_set_verify" );
42
50
valid = valid && LoadSymbol (CTX_set_default_verify_paths, sslhandle, " SSL_CTX_set_default_verify_paths" );
43
51
valid = valid && LoadSymbol (CTX_free, sslhandle, " SSL_CTX_free" );
@@ -50,12 +58,16 @@ OpenSSLConnection::SSLFuncs::SSLFuncs()
50
58
valid = valid && LoadSymbol (write, sslhandle, " SSL_write" );
51
59
valid = valid && LoadSymbol (shutdown, sslhandle, " SSL_shutdown" );
52
60
valid = valid && LoadSymbol (get_verify_result, sslhandle, " SSL_get_verify_result" );
53
- valid = valid && LoadSymbol (get_peer_certificate, sslhandle, " SSL_get_peer_certificate" );
61
+ valid = valid && (LoadSymbol (get_peer_certificate, sslhandle, " SSL_get1_peer_certificate" ) ||
62
+ LoadSymbol (get_peer_certificate, sslhandle, " SSL_get_peer_certificate" ));
54
63
55
- valid = valid && (LoadSymbol (SSLv23_method, sslhandle, " SSLv23_method" ) ||
56
- LoadSymbol (SSLv23_method, sslhandle, " TLS_method" ));
64
+ valid = valid && (
65
+ LoadSymbol (SSLv23_method, sslhandle, " TLS_client_method" ) ||
66
+ LoadSymbol (SSLv23_method, sslhandle, " TLS_method" ) ||
67
+ LoadSymbol (SSLv23_method, sslhandle, " SSLv23_method" ));
57
68
58
69
valid = valid && LoadSymbol (check_host, cryptohandle, " X509_check_host" );
70
+ valid = valid && LoadSymbol (X509_free, cryptohandle, " X509_free" );
59
71
60
72
if (library_init)
61
73
library_init ();
@@ -76,7 +88,10 @@ OpenSSLConnection::OpenSSLConnection()
76
88
if (!context)
77
89
return ;
78
90
79
- ssl.CTX_ctrl (context, SSL_CTRL_OPTIONS, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3, nullptr );
91
+ if (ssl.CTX_set_options )
92
+ ssl.CTX_set_options (context, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
93
+ else
94
+ ssl.CTX_ctrl (context, SSL_CTRL_OPTIONS, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3, nullptr );
80
95
ssl.CTX_set_verify (context, SSL_VERIFY_PEER, nullptr );
81
96
ssl.CTX_set_default_verify_paths (context);
82
97
}
@@ -118,6 +133,7 @@ bool OpenSSLConnection::connect(const std::string &hostname, uint16_t port)
118
133
close ();
119
134
return false ;
120
135
}
136
+ ssl.X509_free (cert);
121
137
122
138
return true ;
123
139
}
0 commit comments