diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index bbe1eb0d19..e900dccb11 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1034,35 +1034,6 @@ include_dir 'conf.d' - - ssl_renegotiation_limit (integer) - - ssl_renegotiation_limit configuration parameter - - - - - Specifies how much data can flow over an SSL-encrypted - connection before renegotiation of the session keys will take - place. Renegotiation decreases an attacker's chances of doing - cryptanalysis when large amounts of traffic can be examined, but it - also carries a large performance penalty. The sum of sent and received - traffic is used to check the limit. If this parameter is set to 0, - renegotiation is disabled. The default is 512MB. - - - - SSL libraries from before November 2009 are insecure when using SSL - renegotiation, due to a vulnerability in the SSL protocol. As a - stop-gap fix for this vulnerability, some vendors shipped SSL - libraries incapable of doing renegotiation. If any such libraries - are in use on the client or server, SSL renegotiation should be - disabled. - - - - - ssl_ciphers (string) diff --git a/src/backend/libpq/be-secure-openssl.c b/src/backend/libpq/be-secure-openssl.c index f0774fe8c9..e9bc282d2e 100644 --- a/src/backend/libpq/be-secure-openssl.c +++ b/src/backend/libpq/be-secure-openssl.c @@ -16,12 +16,8 @@ * backend can restart automatically, it is important that * we select an algorithm that continues to provide confidentiality * even if the attacker has the server's private key. Ephemeral - * DH (EDH) keys provide this, and in fact provide Perfect Forward - * Secrecy (PFS) except for situations where the session can - * be hijacked during a periodic handshake/renegotiation. - * Even that backdoor can be closed if client certificates - * are used (since the imposter will be unable to successfully - * complete renegotiation). + * DH (EDH) keys provide this and more (Perfect Forward Secrecy + * aka PFS). * * N.B., the static private key should still be protected to * the largest extent possible, to minimize the risk of @@ -37,12 +33,6 @@ * session. In this case you'll need to temporarily disable * EDH by commenting out the callback. * - * ... - * - * Because the risk of cryptanalysis increases as large - * amounts of data are sent with the same session key, the - * session keys are periodically renegotiated. - * *------------------------------------------------------------------------- */ @@ -92,9 +82,6 @@ static const char *SSLerrmessage(void); static char *X509_NAME_to_cstring(X509_NAME *name); -/* are we in the middle of a renegotiation? */ -static bool in_ssl_renegotiation = false; - static SSL_CTX *SSL_context = NULL; /* ------------------------------------------------------------ */ @@ -570,37 +557,6 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) ssize_t n; int err; - /* - * If SSL renegotiations are enabled and we're getting close to the limit, - * start one now; but avoid it if there's one already in progress. - * Request the renegotiation 1kB before the limit has actually expired. - */ - if (ssl_renegotiation_limit && !in_ssl_renegotiation && - port->count > (ssl_renegotiation_limit - 1) * 1024L) - { - in_ssl_renegotiation = true; - - /* - * The way we determine that a renegotiation has completed is by - * observing OpenSSL's internal renegotiation counter. Make sure we - * start out at zero, and assume that the renegotiation is complete - * when the counter advances. - * - * OpenSSL provides SSL_renegotiation_pending(), but this doesn't seem - * to work in testing. - */ - SSL_clear_num_renegotiations(port->ssl); - - /* without this, renegotiation fails when a client cert is used */ - SSL_set_session_id_context(port->ssl, (void *) &SSL_context, - sizeof(SSL_context)); - - if (SSL_renegotiate(port->ssl) <= 0) - ereport(COMMERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("SSL failure during renegotiation start"))); - } - errno = 0; n = SSL_write(port->ssl, ptr, len); err = SSL_get_error(port->ssl, n); @@ -646,28 +602,6 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) break; } - if (n >= 0) - { - /* is renegotiation complete? */ - if (in_ssl_renegotiation && - SSL_num_renegotiations(port->ssl) >= 1) - { - in_ssl_renegotiation = false; - port->count = 0; - } - - /* - * if renegotiation is still ongoing, and we've gone beyond the limit, - * kill the connection now -- continuing to use it can be considered a - * security problem. - */ - if (in_ssl_renegotiation && - port->count > ssl_renegotiation_limit * 1024L) - ereport(FATAL, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("SSL failed to renegotiate connection before limit expired"))); - } - return n; } diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c index 4a650cc001..26d8faaf77 100644 --- a/src/backend/libpq/be-secure.c +++ b/src/backend/libpq/be-secure.c @@ -43,13 +43,6 @@ char *ssl_key_file; char *ssl_ca_file; char *ssl_crl_file; -/* - * How much data can be sent across a secure connection - * (total in both directions) before we require renegotiation. - * Set to 0 to disable renegotiation completely. - */ -int ssl_renegotiation_limit; - #ifdef USE_SSL bool ssl_loaded_verify_locations = false; #endif diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 34c23f9560..c907ef1e41 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -2577,17 +2577,6 @@ static struct config_int ConfigureNamesInt[] = NULL, assign_tcp_keepalives_interval, show_tcp_keepalives_interval }, - { - {"ssl_renegotiation_limit", PGC_USERSET, CONN_AUTH_SECURITY, - gettext_noop("Set the amount of traffic to send and receive before renegotiating the encryption keys."), - NULL, - GUC_UNIT_KB, - }, - &ssl_renegotiation_limit, - 512 * 1024, 0, MAX_KILOBYTES, - NULL, NULL, NULL - }, - { {"tcp_keepalives_count", PGC_USERSET, CLIENT_CONN_OTHER, gettext_noop("Maximum number of TCP keepalive retransmits."), diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index 06dfc067b0..e5d275df21 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -83,7 +83,6 @@ # (change requires restart) #ssl_prefer_server_ciphers = on # (change requires restart) #ssl_ecdh_curve = 'prime256v1' # (change requires restart) -#ssl_renegotiation_limit = 512MB # amount of data between renegotiations #ssl_cert_file = 'server.crt' # (change requires restart) #ssl_key_file = 'server.key' # (change requires restart) #ssl_ca_file = '' # (change requires restart) diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index 6171ef3a1f..caaa8b5f89 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -92,11 +92,6 @@ typedef struct } pg_gssinfo; #endif -/* - * SSL renegotiations - */ -extern int ssl_renegotiation_limit; - /* * This is used by the postmaster in its communication with frontends. It * contains all state information needed during this communication before the