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);
96 [socketConnection]() {
97 LOG(ERROR) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake timed out";
99 socketConnection->close();
101 [socketConnection](
int sslErr) {
102 ssl_log(socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed", sslErr);
104 socketConnection->close();
106 LOG(ERROR) << socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed";
108 socketConnection->close();
111 [onDisconnect](SocketConnection* socketConnection) {
112 socketConnection->stopSSL();
113 onDisconnect(socketConnection);
119 template <
typename PhysicalSocketServer,
typename Config>
121 : Super(socketConnector) {
124 template <
typename PhysicalClientSocket,
typename Config>
129 template <
typename PhysicalSocketClient,
typename Config>
132 LOG(TRACE) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creating ...";
134 if (config->getSslCtx() !=
nullptr) {
135 LOG(DEBUG) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX created";
139 LOG(ERROR) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creation failed";
141 Super::onStatus(config->Remote::getSocketAddress(), core::socket::STATE_FATAL);
utils::Timeval sslShutdownTimeout
SocketConnection(PhysicalSocket &&physicalSocket, const std::function< void(SocketConnection *)> &onDisconnect, const std::shared_ptr< Config > &config)
void doWriteShutdown(const std::function< void()> &onShutdown) final
SSL * startSSL(int fd, SSL_CTX *ctx, const utils::Timeval &sslInitTimeout, const utils::Timeval &sslShutdownTimeout, bool closeNotifyIsEOF)
utils::Timeval sslInitTimeout
void onReadShutdown() final
bool doSSLHandshake(const std::function< void()> &onSuccess, const std::function< void()> &onTimeout, const std::function< void(int)> &onStatus) final
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)