Apache 不会将连接升级到 TLS

Apache 不会将连接升级到 TLS

我用 PHP 编写了一个在 Apache 下运行的 IPP 服务器。使用标准 IPP 客户端,它工作得很好。但是当我尝试从 iOS 设备打印时,当客户端尝试切换到 TLS 时,连接会中断。这似乎包含在 RFC 2817(在 HTTP/1.1 内升级到 TLS)中,Apache 应该会支持多年。我的 Apache 配置有什么问题?

Apache SSL 配置:

SSLEngine optional
SSLCertificateFile /path/to/server.crt
SSLCertificateKeyFile /path/to/server.key

要求:

OPTIONS * HTTP/1.1
Connection: Upgrade
Host: iserv.local
Upgrade: TLS/1.0,SSL/2.0,SSL/3.0
User-Agent: CUPS/1.5.0

回复:

HTTP/1.1 200 OK
Server: Apache/2.2.16
Content-Length: 0
Content-Type: text/plain

期望答复:

HTTP/1.1 101 Switching Protocol
Server: CUPS/1.4
Connection: Keep-Alive
Keep-Alive: timeout=30
Connection: Upgrade
Upgrade: TLS/1.0,HTTP/1.1
Content-Length: 0

答案1

据我所知,Apache Httpd 已支持RFC 2817自 2.1 版以来。

要使用它,你必须使用SSLEngine optional(而不是更常见SSLEngine onHTTPS),如文档

编辑(我没有意识到你已经在使用SSLEngine optional):

看来这个问题是具体由于 造成的。当您发送(或) 并使用相同的升级标头OPTIONS * HTTP/1.1时,它将起作用。OPTIONS / HTTP/1.1OPTIONS / HTTP/1.1

经过进一步调查后,似乎这OPTIONS *在 Apache Httpd 的最新版本上根本不起作用(或者至少它的工作方式不同)。

如果您尝试使用 Debian Etch(Apache Httpd 2.2.3),一个简单的OPTIONS * HTTP/1.1(带有标题)将为​​您提供带有和标题的Host响应。Allow: GET,HEAD,POST,OPTIONSVary

在 Debian Lenny(Apache Httpd 2.2.9,带有一些额外的反向移植安全补丁)以及更新版本上,您根本无法获得这些Allow或标头。您可以使用 获得它们。VaryOPTIONS /

我怀疑这些版本之间的处理方式有所改变OPTIONS *。(这可能也与此主题)这肯定会影响通过的 RFC 2817 升级OPTIONS *

我建议向 Apache Httpd 用户或者可能的开发列表询问这个问题。

听起来这可能是一个错误。(使用OPTIONS *非常少见,而且很少有客户端支持 RFC 2817,因此它可能只是被忽视了。)

相关内容