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->setSocketContext(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)