38 const std::shared_ptr<SocketContextFactory>& socketContextFactory,
39 const std::function<
void(SocketConnection*)>& onConnect,
40 const std::function<
void(SocketConnection*)>& onConnected,
41 const std::function<
void(SocketConnection*)>& onDisconnect,
42 const std::function<
void(
const SocketAddress&, core::socket::State)>& onStatus,
43 const std::shared_ptr<Config>& config)
46 [onConnect,
this](SocketConnection* socketConnection) {
47 onConnect(socketConnection);
49 SSL* ssl = socketConnection->startSSL(socketConnection->getFd(),
50 Super::config->getSslCtx(),
51 Super::config->getInitTimeout(),
52 Super::config->getShutdownTimeout(),
53 !Super::config->getNoCloseNotifyIsEOF());
55 SSL_set_accept_state(ssl);
56 SSL_set_ex_data(ssl, 1, Super::config.get());
59 [socketContextFactory, onConnected](SocketConnection* socketConnection) {
60 LOG(TRACE) << socketConnection->getConnectionName() <<
" SSL/TLS: Start handshake";
61 if (!socketConnection->doSSLHandshake(
62 [socketContextFactory,
65 LOG(DEBUG) << socketConnection->getConnectionName() <<
" SSL/TLS: Handshake success";
67 onConnected(socketConnection);
69 socketConnection->connectSocketContext(socketContextFactory);
71 [socketConnection]() {
72 LOG(ERROR) << socketConnection->getConnectionName() <<
"SSL/TLS: Handshake timed out";
74 socketConnection->close();
76 [socketConnection](
int sslErr) {
77 ssl_log(socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed", sslErr);
79 socketConnection->close();
81 LOG(ERROR) << socketConnection->getConnectionName() +
" SSL/TLS: Handshake failed";
83 socketConnection->close();
86 [onDisconnect, instanceName = config->getInstanceName()](SocketConnection* socketConnection) {
87 socketConnection->stopSSL();
88 onDisconnect(socketConnection);
106 if (!config->getDisabled()) {
107 LOG(TRACE) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX creating ...";
108 SSL_CTX* sslCtx = config->getSslCtx();
110 if (sslCtx !=
nullptr) {
111 LOG(DEBUG) << config->getInstanceName() <<
" SSL/TLS: SSL_CTX created";
117 LOG(ERROR) << config->getInstanceName() <<
" SSL/TLS: SSL/TLS creation failed";
119 Super::onStatus(Super::config->Local::getSocketAddress(), core::socket::STATE_ERROR);
129 int ret = SSL_CLIENT_HELLO_SUCCESS;
131 std::string connectionName = *
static_cast<std::string*>(SSL_get_ex_data(ssl, 0));
132 Config* config =
static_cast<Config*>(SSL_get_ex_data(ssl, 1));
134 std::string serverNameIndication = core::socket::stream::tls::ssl_get_servername_from_client_hello(ssl);
136 if (!serverNameIndication.empty()) {
137 SSL_CTX* sniSslCtx = config->getSniCtx(serverNameIndication);
139 if (sniSslCtx !=
nullptr) {
140 LOG(DEBUG) << connectionName <<
" SSL/TLS: Setting sni certificate for '" << serverNameIndication <<
"'";
141 core::socket::
stream::
tls::ssl_set_ssl_ctx(ssl, sniSslCtx);
142 }
else if (config->getForceSni()) {
143 LOG(ERROR) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
144 <<
"' but forceSni set - terminating";
145 ret = SSL_CLIENT_HELLO_ERROR;
146 *al = SSL_AD_UNRECOGNIZED_NAME;
148 LOG(WARNING) << connectionName <<
" SSL/TLS: No sni certificate found for '" << serverNameIndication
149 <<
"'. Still using master certificate";
152 LOG(DEBUG) << connectionName <<
" SSL/TLS: No sni certificate requested from client. Still using master certificate";