/*
- * 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.
#include "timeval.h"
#include "vlog.h"
-VLOG_DEFINE_THIS_MODULE(stream_ssl)
+VLOG_DEFINE_THIS_MODULE(stream_ssl);
+
+COVERAGE_DEFINE(ssl_session);
+COVERAGE_DEFINE(ssl_session_reused);
/* Active SSL. */
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;
}
for (i = 0; i < n_certs; i++) {
/* SSL_CTX_add_client_CA makes a copy of the relevant data. */
if (SSL_CTX_add_client_CA(ctx, certs[i]) != 1) {
- VLOG_ERR("failed to add client certificate %d from %s: %s",
+ VLOG_ERR("failed to add client certificate %zu from %s: %s",
i, file_name,
ERR_error_string(ERR_get_error(), NULL));
} else {