diff --git a/src/network/ssl/socket.c b/src/network/ssl/socket.c
index 2ecdd71..f763ebd 100644
--- a/src/network/ssl/socket.c
+++ b/src/network/ssl/socket.c
@@ -246,8 +246,18 @@ ssl_read(struct socket *socket, unsigned char *data, int len)
 #endif
 
 #ifdef CONFIG_GNUTLS
-		if (err == GNUTLS_E_REHANDSHAKE)
-			return -1;
+		if (err == GNUTLS_E_REHANDSHAKE) {
+			err = gnutls_handshake(socket->ssl);
+			if (err < 0) {
+				fprintf(stderr, "elinks: SSL rehandshake error: %s\n", gnutls_strerror(err));
+				errno = S_SSL_ERROR;
+				return SOCKET_INTERNAL_ERROR;
+			}
+			rd = gnutls_record_recv(socket->ssl, data, len);
+			if (rd > 0)
+				return rd;
+			err = rd;
+		}
 #endif
 
 		if (err == SSL_ERROR_WANT_READ ||
