Disable SSLv3 by default. As a precursor to removing the code entirely later, disable the protocol by default. Callers must use SSL_CTX_set_min_version to enable it. This change also makes SSLv3_method *not* enable SSL 3.0. Normally version-specific methods set the minimum and maximum version to their version. SSLv3_method leaves the minimum at the default, so we will treat it as all versions disabled. To help debugging, the error code is switched from WRONG_SSL_VERSION to a new NO_SUPPORTED_VERSIONS_ENABLED. This also defines OPENSSL_NO_SSL3 and OPENSSL_NO_SSL3_METHOD to kick in any no-ssl3 build paths in consumers which should provide a convenient hook for any upstreaming changes that may be needed. (OPENSSL_NO_SSL3 existed in older versions of OpenSSL, so in principle one may encounter an OpenSSL with the same settings.) Change-Id: I96a8f2f568eb77b2537b3a774b2f7108bd67dd0c Reviewed-on: https://boringssl-review.googlesource.com/14031 Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 7adf103..9f77c5a 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c
@@ -296,9 +296,12 @@ ret->mode = SSL_MODE_NO_AUTO_CHAIN; /* Lock the SSL_CTX to the specified version, for compatibility with legacy - * uses of SSL_METHOD. */ + * uses of SSL_METHOD, but we do not set the minimum version for + * |SSLv3_method|. */ if (!SSL_CTX_set_max_proto_version(ret, method->version) || - !SSL_CTX_set_min_proto_version(ret, method->version)) { + !SSL_CTX_set_min_proto_version(ret, method->version == SSL3_VERSION + ? 0 /* default */ + : method->version)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); goto err2; } @@ -945,6 +948,10 @@ /* Zero is interpreted as the default minimum version. */ if (version == 0) { *out = method->min_version; + /* SSL 3.0 is disabled unless explicitly enabled. */ + if (*out < TLS1_VERSION) { + *out = TLS1_VERSION; + } return 1; } @@ -2398,7 +2405,7 @@ } if (!any_enabled) { - OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SSL_VERSION); + OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SUPPORTED_VERSIONS_ENABLED); return 0; }