强制 httpd 2.0 mod_ssl 使用 TLSv1 进行代理握手

强制 httpd 2.0 mod_ssl 使用 TLSv1 进行代理握手

我有一个 httpd(版本 2.0)实例,它使用 mod_proxy 将传入的 http 请求转换为 https。我的问题是我需要我的代理连接到仅支持 SSLv3/TLSv1 Client Hello 握手的服务器。

作为测试,我尝试在我能找到的每个选项上强制使用 TLSv1:

SSLProxyEngine On
SSLProxyProtocol TLSv1
SSLProxyCipherSuite TLSv1

但是我可以看到 httpd 仍在尝试 SSLv2 握手。我意识到这是为某些客户端实现向后兼容而采取的旧行为,但据我所知,这应该会强制进行较新的握手。这是预期行为吗?这可能是我的旧模块中的错误吗?

答案1

通过查看 httpd 源代码找到了答案——httpd 版本 2.0 不会对任何连接使用 SSLv3/TLSv1 握手,因为它仅使用 SSLv2_client_method() 或 SSLv23_client_method() 来创建其 SSL 上下文。

来自ssl_engine_init.c:

if (protocol == SSL_PROTOCOL_SSLV2) {
    method = mctx->pkp ?
       SSLv2_client_method() : /* proxy */
        SSLv2_server_method();  /* server */
    ctx = SSL_CTX_new(method);  /* only SSLv2 is left */
}
else {
    method = mctx->pkp ?
        SSLv23_client_method() : /* proxy */
        SSLv23_server_method();  /* server */
    ctx = SSL_CTX_new(method); /* be more flexible */
}

根据SSL 文档,使用 TLSv1_server_method() 创建的服务器上下文将无法理解 SSLv2* 方法。确认 httpd/mod_ssl 的更高版本可以按预期工作,并首先尝试 SSLv3/TLSv1。

不要使用旧版本!

相关内容