65 const std::shared_ptr<
Config>& config)
68 onConnect(socketConnection);
70 SSL* ssl = socketConnection->startSSL(socketConnection->getFd(),
Super::config->getSslCtx());
72 SSL_set_accept_state(ssl);
73 SSL_set_ex_data(ssl, 1,
Super::config.get());
77 LOG(TRACE) << socketConnection->getConnectionName() <<
" SSL/TLS: Start handshake";
78 if (!socketConnection->doSSLHandshake(
79 [socketContextFactory,
82 LOG(DEBUG) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake success";
84 onConnected(socketConnection);
86 socketConnection->setSocketContext(socketContextFactory);
88 [socketConnection]() {
89 LOG(ERROR) << socketConnection->getConnectionName() <<
"SSL/TLS: Handshake timed out";
91 socketConnection->close();
93 [socketConnection](
int sslErr) {
94 ssl_log(socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed", sslErr);
96 socketConnection->close();
98 LOG(ERROR) << socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed";
100 socketConnection->close();
103 [onDisconnect, instanceName = config->getInstanceName()](
SocketConnection* socketConnection) {
104 socketConnection->stopSSL();
105 onDisconnect(socketConnection);
124 LOG(TRACE) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creating ...";
125 SSL_CTX* sslCtx = config->getSslCtx();
127 if (sslCtx !=
nullptr) {
128 LOG(DEBUG) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX created";
134 LOG(ERROR) << config->getInstanceName() <<
" SSL/TLS: SSL/TLS creation failed";
136 Super::onStatus(Super::config->Local::getSocketAddress(), core::socket::STATE_ERROR);
146 int ret = SSL_CLIENT_HELLO_SUCCESS;
148 const std::string connectionName = *
static_cast<std::string*>(SSL_get_ex_data(ssl, 0));
149 Config* config =
static_cast<
Config*>(SSL_get_ex_data(ssl, 1));
153 if (!serverNameIndication.empty()) {
154 SSL_CTX* sniSslCtx = config->getSniCtx(serverNameIndication);
156 if (sniSslCtx !=
nullptr) {
157 LOG(DEBUG) << connectionName <<
" SSL/TLS: Setting sni certificate for '" << serverNameIndication <<
"'";
159 }
else if (config->getForceSni()) {
160 LOG(ERROR) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
161 <<
"' but forceSni set - terminating";
162 ret = SSL_CLIENT_HELLO_ERROR;
163 *al = SSL_AD_UNRECOGNIZED_NAME;
165 LOG(WARNING) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
166 <<
"'. Still using master certificate";
169 LOG(DEBUG) << connectionName <<
" SSL/TLS: No sni certificate requested from client. Still using master certificate";
SocketAcceptor(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)