Simplify the way OpenSSL renegotiation is initiated in server.
authorHeikki Linnakangas <[email protected]>
Fri, 13 Feb 2015 19:46:08 +0000 (21:46 +0200)
committerHeikki Linnakangas <[email protected]>
Fri, 13 Feb 2015 19:46:08 +0000 (21:46 +0200)
At least in all modern versions of OpenSSL, it is enough to call
SSL_renegotiate() once, and then forget about it. Subsequent SSL_write()
and SSL_read() calls will finish the handshake.

The SSL_set_session_id_context() call is unnecessary too. We only have
one SSL context, and the SSL session was created with that to begin with.

src/backend/libpq/be-secure-openssl.c

index d5f97122ff408f847bb59cabf48f6e51db3e2edd..d13ce334cccf8145c8882db3fd7e072d07e3847d 100644 (file)
@@ -624,33 +624,10 @@ be_tls_write(Port *port, void *ptr, size_t len)
         */
        SSL_clear_num_renegotiations(port->ssl);
 
-       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")));
-       else
-       {
-           int         retries;
-
-           /*
-            * A handshake can fail, so be prepared to retry it, but only
-            * a few times.
-            */
-           for (retries = 0;; retries++)
-           {
-               if (SSL_do_handshake(port->ssl) > 0)
-                   break;  /* done */
-               ereport(COMMERROR,
-                       (errcode(ERRCODE_PROTOCOL_VIOLATION),
-                        errmsg("SSL handshake failure on renegotiation, retrying")));
-               if (retries >= 20)
-                   ereport(FATAL,
-                           (errcode(ERRCODE_PROTOCOL_VIOLATION),
-                            errmsg("could not complete SSL handshake on renegotiation, too many failures")));
-           }
-       }
    }
 
 wloop: