我有一个 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。
不要使用旧版本!