66 const std::shared_ptr<
Config>& config)
69 onConnect(socketConnection);
71 SSL* ssl = socketConnection->startSSL(socketConnection->getFd(),
Super::config->getSslCtx());
73 SSL_set_accept_state(ssl);
74 SSL_set_ex_data(ssl, 1,
Super::config.get());
78 LOG(TRACE) << socketConnection->getConnectionName() <<
" SSL/TLS: Start handshake";
79 if (!socketConnection->doSSLHandshake(
80 [socketContextFactory,
83 LOG(DEBUG) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake success";
85 onConnected(socketConnection);
87 socketConnection->setSocketContext(socketContextFactory);
89 [socketConnection]() {
90 LOG(ERROR) << socketConnection->getConnectionName() <<
"SSL/TLS: Handshake timed out";
92 socketConnection->close();
94 [socketConnection](
int sslErr) {
95 ssl_log(socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed", sslErr);
97 socketConnection->close();
99 LOG(ERROR) << socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed";
101 socketConnection->close();
104 [onDisconnect, instanceName = config->getInstanceName()](
SocketConnection* socketConnection) {
105 socketConnection->stopSSL();
106 onDisconnect(socketConnection);
136 LOG(TRACE) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creating ...";
137 SSL_CTX* sslCtx = config->getSslCtx();
139 if (sslCtx !=
nullptr) {
140 LOG(DEBUG) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX created";
146 LOG(ERROR) << config->getInstanceName() <<
" SSL/TLS: SSL/TLS creation failed";
148 Super::onStatus(
Super::config->Local::getSocketAddress(), core::socket::STATE_ERROR);
158 int ret = SSL_CLIENT_HELLO_SUCCESS;
160 const std::string connectionName = *
static_cast<std::string*>(SSL_get_ex_data(ssl, 0));
161 Config* config =
static_cast<
Config*>(SSL_get_ex_data(ssl, 1));
165 if (!serverNameIndication.empty()) {
166 SSL_CTX* sniSslCtx = config->getSniCtx(serverNameIndication);
168 if (sniSslCtx !=
nullptr) {
169 LOG(DEBUG) << connectionName <<
" SSL/TLS: Setting sni certificate for '" << serverNameIndication <<
"'";
171 }
else if (config->getForceSni()) {
172 LOG(ERROR) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
173 <<
"' but forceSni set - terminating";
174 ret = SSL_CLIENT_HELLO_ERROR;
175 *al = SSL_AD_UNRECOGNIZED_NAME;
177 LOG(WARNING) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
178 <<
"'. Still using master certificate";
181 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(core::eventreceiver::AcceptEventReceiver *)> &onInitState, const std::function< void(const SocketAddress &, core::socket::State)> &onStatus, const std::shared_ptr< Config > &config)