TL; DR: TLS puede, en teoría, utilizarse sin claves privadas.
Una parte integral de TLS es que el cliente autentica correctamente el servidor para detectar posibles personas en los ataques medios. Esto se hace comúnmente con certificados, y esto requiere que la clave privada del certificado en el sitio del servidor demuestre al cliente que el servidor es el propietario del certificado 1 .
Pero, TLS es flexible y también proporciona otras formas de autenticar el servidor. Hay cifrados PSK que permiten la autenticación mediante el uso de una clave precompartida entre el cliente y el servidor. Hay cifrados de SRP que permiten la autenticación por contraseña. Incluso hay anon ciphers que le permite abandonar cualquier tipo de autenticación en TLS, es decir, requiere que realice su propia autenticación.
Por lo tanto, TLS podría usarse sin certificados. Y como los certificados son la única parte de TLS que requiere una clave privada, esto significa que TLS se puede usar sin claves privadas. Pero, incluso si no se utiliza una clave privada, podría requerirse una cosa secreta similar en el servidor: tanto la autenticación basada en SRP como la PSK requieren un secreto en el lado del servidor que, como mucho, debería conocer el servidor y el cliente.
Además de esto, la autenticación sin certificado (y, por lo tanto, sin clave privada) requiere que ambos lados de la conexión admitan los cifrados relevantes con los métodos de autenticación alternativos. Dado que actualmente los navegadores solo admiten la autenticación basada en certificados, se necesita una clave privada en el lado del servidor siempre que se requiera el acceso mediante un navegador, es decir, prácticamente en todo caso en el caso de servidores web.
Por ejemplo, puede usar openssl para proporcionar una conexión protegida TLS que no requiere certificados. El servidor buscaría un ejemplo como este:
$ openssl s_server -www -nocert -psk 1a2b3c4d
El cliente necesitaría usar la misma clave al conectarse al servidor, es decir, la idea básica detrás de PSK es que el cliente y el servidor comparten una clave secreta:
$ openssl s_client -connect 127.0.0.1:4433 -psk 1a2b3c4d
...
Cipher : PSK-AES256-CBC-SHA
...
Verify return code: 0 (ok)
Si intentas conectarte con un navegador a este servidor (es decir, https://127.0.0.1:4433
) solo obtendrás un error ya que el navegador no admite los cifrados PSK: ERR_SSL_VERSION_OR_CIPHER_MISMATCH
.
1 Las claves privadas no solo pueden ser necesarias para la autenticación sino también para el intercambio de claves, es decir, el intercambio de claves RSA. Sin embargo, el intercambio de claves RSA requiere certificados, por lo que nuevamente significa que las claves privadas solo son relevantes si se usan certificados. Además, el intercambio de claves Diffie-Hellman no necesita certificados y este es el método recomendado hoy en día, ya que proporciona secreto hacia adelante.