mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-23 10:35:40 +08:00
Keep TLS client context between requests
This commit is contained in:
parent
35d1de6f5e
commit
144af547fb
@ -181,7 +181,7 @@ SSL_CERT ssl_copy_cert(SSL_CERT cert, SSL_CONFIG *config)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CERT *server_cert, char **errSSL)
|
SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CTX *srv_ctx, SSL_CERT *server_cert, char **errSSL)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
X509 *cert;
|
X509 *cert;
|
||||||
@ -193,19 +193,9 @@ SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CERT *server_cer
|
|||||||
if ( conn == NULL ){
|
if ( conn == NULL ){
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
conn->ctx = NULL;
|
||||||
conn->ctx = SSL_CTX_new(SSLv23_client_method());
|
conn->ssl = SSL_new(srv_ctx);
|
||||||
#else
|
|
||||||
conn->ctx = SSL_CTX_new(TLS_client_method());
|
|
||||||
#endif
|
|
||||||
if ( conn->ctx == NULL ) {
|
|
||||||
free(conn);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
conn->ssl = SSL_new(conn->ctx);
|
|
||||||
if ( conn->ssl == NULL ) {
|
if ( conn->ssl == NULL ) {
|
||||||
SSL_CTX_free(conn->ctx);
|
|
||||||
free(conn);
|
free(conn);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@ struct ssl_config {
|
|||||||
X509 *server_cert;
|
X509 *server_cert;
|
||||||
EVP_PKEY *CA_key;
|
EVP_PKEY *CA_key;
|
||||||
EVP_PKEY *server_key;
|
EVP_PKEY *server_key;
|
||||||
|
SSL_CTX *cli_ctx;
|
||||||
|
SSL_CTX *srv_ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct ssl_config SSL_CONFIG;
|
typedef struct ssl_config SSL_CONFIG;
|
||||||
@ -31,7 +33,7 @@ SSL_CERT ssl_copy_cert(SSL_CERT cert, SSL_CONFIG *config);
|
|||||||
//
|
//
|
||||||
// SSL/TLS handshakes
|
// SSL/TLS handshakes
|
||||||
//
|
//
|
||||||
SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CERT *server_cert, char **errSSL);
|
SSL_CONN ssl_handshake_to_server(SOCKET s, char * hostname, SSL_CTX *srv_ctx, SSL_CERT *server_cert, char **errSSL);
|
||||||
SSL_CONN ssl_handshake_to_client(SOCKET s, SSL_CERT server_cert, EVP_PKEY *server_key, char **errSSL);
|
SSL_CONN ssl_handshake_to_client(SOCKET s, SSL_CERT server_cert, EVP_PKEY *server_key, char **errSSL);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -238,7 +238,7 @@ int domitm(struct clientparam* param, SSL_CONN* ServerConnp, SSL_CONN* ClientCon
|
|||||||
ul = ((unsigned long)ssl_connect_timeout)*1000;
|
ul = ((unsigned long)ssl_connect_timeout)*1000;
|
||||||
setsockopt(param->remsock, SOL_SOCKET, SO_SNDTIMEO, (char *)&ul, 4);
|
setsockopt(param->remsock, SOL_SOCKET, SO_SNDTIMEO, (char *)&ul, 4);
|
||||||
}
|
}
|
||||||
ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, &ServerCert, &errSSL);
|
ServerConn = ssl_handshake_to_server(param->remsock, (char *)param->hostname, PCONF->srv_ctx, &ServerCert, &errSSL);
|
||||||
if ( ServerConn == NULL || ServerCert == NULL ) {
|
if ( ServerConn == NULL || ServerCert == NULL ) {
|
||||||
param->res = 8011;
|
param->res = 8011;
|
||||||
param->srv->logfunc(param, (unsigned char *)"SSL handshake to server failed");
|
param->srv->logfunc(param, (unsigned char *)"SSL handshake to server failed");
|
||||||
@ -371,6 +371,16 @@ static void* ssl_filter_open(void * idata, struct srvparam * srv){
|
|||||||
srv->usesplice = 0;
|
srv->usesplice = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if(sc && sc->mitm){
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
sc->srv_ctx = SSL_CTX_new(SSLv23_client_method());
|
||||||
|
#else
|
||||||
|
sc->srv_ctx = SSL_CTX_new(TLS_client_method());
|
||||||
|
#endif
|
||||||
|
if ( sc->srv_ctx == NULL ) {
|
||||||
|
sc->mitm = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
return sc;
|
return sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,6 +459,12 @@ static void ssl_filter_close(void *fo){
|
|||||||
if ( CONFIG->server_key != NULL ) {
|
if ( CONFIG->server_key != NULL ) {
|
||||||
EVP_PKEY_free(CONFIG->server_key);
|
EVP_PKEY_free(CONFIG->server_key);
|
||||||
}
|
}
|
||||||
|
if ( CONFIG->srv_ctx != NULL ) {
|
||||||
|
SSL_CTX_free(CONFIG->srv_ctx);
|
||||||
|
}
|
||||||
|
if ( CONFIG->cli_ctx != NULL ) {
|
||||||
|
SSL_CTX_free(CONFIG->cli_ctx);
|
||||||
|
}
|
||||||
free(fo);
|
free(fo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user