/*
- * Copyright (c) 2008, 2009, 2010 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
struct ssl_stream *sslv = ssl_stream_cast(stream);
SSL_SESSION *session;
- /* Statistics. */
- COVERAGE_INC(ssl_session);
- if (SSL_session_reused(sslv->ssl)) {
- COVERAGE_INC(ssl_session_reused);
- }
-
/* Get session from stream. */
session = SSL_get1_session(sslv->ssl);
if (session) {
}
}
}
- } else {
- /* There is no new session. This doesn't really make sense because
- * this function is only called upon successful connection and there
- * should always be a new session in that case. But I don't trust
- * OpenSSL so I'd rather handle this case anyway. */
- ssl_flush_session(stream);
}
}
VLOG_ERR("rejecting SSL connection during bootstrap race window");
return EPROTO;
} else {
- if (sslv->type == CLIENT) {
- ssl_cache_session(stream);
+ /* Statistics. */
+ COVERAGE_INC(ssl_session);
+ if (SSL_session_reused(sslv->ssl)) {
+ COVERAGE_INC(ssl_session_reused);
}
return 0;
}
* background. */
SSL_shutdown(sslv->ssl);
+ ssl_cache_session(stream);
+
/* SSL_shutdown() might have signaled an error, in which case we need to
* flush it out of the OpenSSL error queue or the next OpenSSL operation
* will falsely signal an error. */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
NULL);
+ /* We have to set a session context ID string in 'ctx' because OpenSSL
+ * otherwise refuses to use a cached session on the server side when
+ * SSL_VERIFY_PEER is set. And it not only refuses to use the cached
+ * session, it actually generates an error and kills the connection.
+ * According to a comment in ssl_get_prev_session() in OpenSSL's
+ * ssl/ssl_sess.c, this is intentional behavior.
+ *
+ * Any context string is OK, as long as one is set. */
+ SSL_CTX_set_session_id_context(ctx, (const unsigned char *) PACKAGE,
+ strlen(PACKAGE));
+
return 0;
}