2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/SocketConnector.hpp"
43#include "core/socket/stream/tls/SocketConnector.h"
45#ifndef DOXYGEN_SHOULD_SKIP_THIS
47#include "core/socket/stream/tls/ssl_utils.h"
48#include "log/Logger.h"
51#include <openssl/ssl.h>
52#include <openssl/x509v3.h>
59 template <
typename PhysicalClientSocket,
typename Config>
62 const std::function<
void(SocketConnection*)>& onConnect,
63 const std::function<
void(SocketConnection*)>& onConnected,
64 const std::function<
void(SocketConnection*)>& onDisconnect,
65 const std::function<
void(
const SocketAddress&, core::socket::
State)>& onStatus,
66 const std::shared_ptr<Config>& config)
69 [onConnect,
this](SocketConnection* socketConnection) {
70 onConnect(socketConnection);
72 SSL* ssl = socketConnection->startSSL(socketConnection->getFd(),
73 Super::config->getSslCtx(),
74 Super::config->getInitTimeout(),
75 Super::config->getShutdownTimeout(),
76 !Super::config->getNoCloseNotifyIsEOF());
78 SSL_set_connect_state(ssl);
79 SSL_set_ex_data(ssl, 1, Super::config.get());
81 ssl_set_sni(ssl, Super::config->getSni());
84 [socketContextFactory, onConnected](SocketConnection* socketConnection) {
85 LOG(TRACE) << socketConnection->getConnectionName() <<
" SSL/TLS: Start handshake";
86 if (!socketConnection->doSSLHandshake(
87 [socketContextFactory,
90 LOG(DEBUG) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake success";
92 onConnected(socketConnection);
94 socketConnection->connectSocketContext(socketContextFactory);
97 [socketConnection]() {
98 LOG(ERROR) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake timed out";
100 socketConnection->close();
102 [socketConnection](
int sslErr) {
103 ssl_log(socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed", sslErr);
105 socketConnection->close();
107 LOG(ERROR) << socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed";
109 socketConnection->close();
112 [onDisconnect](SocketConnection* socketConnection) {
113 socketConnection->stopSSL();
114 onDisconnect(socketConnection);
120 template <
typename PhysicalSocketServer,
typename Config>
122 : Super(socketConnector) {
125 template <
typename PhysicalClientSocket,
typename Config>
130 template <
typename PhysicalSocketClient,
typename Config>
133 LOG(TRACE) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creating ...";
135 if (config->getSslCtx() !=
nullptr) {
136 LOG(DEBUG) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX created";
140 LOG(ERROR) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creation failed";
142 Super::onStatus(config->Remote::getSocketAddress(), core::socket::STATE_FATAL);
SocketConnection(const std::string &instanceName, PhysicalSocket &&physicalSocket, const std::function< void(SocketConnection *)> &onDisconnect, const std::string &configuredServer, const SocketAddress &localAddress, const SocketAddress &remoteAddress, const utils::Timeval &readTimeout, const utils::Timeval &writeTimeout, std::size_t readBlockSize, std::size_t writeBlockSize, const utils::Timeval &terminateTimeout)
utils::Timeval sslShutdownTimeout
SSL * startSSL(int fd, SSL_CTX *ctx, const utils::Timeval &sslInitTimeout, const utils::Timeval &sslShutdownTimeout, bool closeNotifyIsEOF)
bool doSSLHandshake(const std::function< void()> &onSuccess, const std::function< void()> &onTimeout, const std::function< void(int)> &onStatus) final
void onReadShutdown() final
void doWriteShutdown(const std::function< void()> &onShutdown) final
utils::Timeval sslInitTimeout
void useNextSocketAddress() override
SocketConnector(const SocketConnector &socketConnector)
SocketConnector(const std::shared_ptr< core::socket::stream::SocketContextFactory > &socketContextFactory, const std::function< void(SocketConnection *)> &onConnect, const std::function< void(SocketConnection *)> &onConnected, const std::function< void(SocketConnection *)> &onDisconnect, const std::function< void(const SocketAddress &, core::socket::State)> &onStatus, const std::shared_ptr< Config > &config)
static void doHandshake(const std::string &instanceName, SSL *ssl, const std::function< void(void)> &onSuccess, const std::function< void(void)> &onTimeout, const std::function< void(int)> &onStatus, const utils::Timeval &timeout)
static void doShutdown(const std::string &instanceName, SSL *ssl, const std::function< void(void)> &onSuccess, const std::function< void(void)> &onTimeout, const std::function< void(int)> &onStatus, const utils::Timeval &timeout)
Timeval & operator=(const Timeval &timeVal)