Apache 不会将连接升级到 TLS

Jör*_*wig 5 ssl http tls apache-2.2

我已经用 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
Run Code Online (Sandbox Code Playgroud)

要求:

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
Run Code Online (Sandbox Code Playgroud)

回复:

HTTP/1.1 200 OK
Server: Apache/2.2.16
Content-Length: 0
Content-Type: text/plain
Run Code Online (Sandbox Code Playgroud)

预期回复:

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
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 2

据我所知,Apache Httpd从 2.1 版开始就支持RFC 2817 。

要使用它,您必须使用SSLEngine optional(而不是更常见SSLEngine onHTTPS),如文档中所述。

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

看来这个问题具体是由于OPTIONS * HTTP/1.1. OPTIONS / HTTP/1.1当您发送(或OPTIONS / 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,带有一些额外的向后移植的安全补丁)和更新的版本上,您根本不会获得这些AllowVary标头。您将获得它们OPTIONS /

OPTIONS *我怀疑这些版本之间的处理方式发生了变化。(这也可能与该线程中提到的问题有关。)这肯定会影响通过OPTIONS *.

我建议向 Apache Httpd 用户或可能的开发人员列表询问有关此问题的信息。

听起来这可能是一个错误。(使用的情况OPTIONS *相当罕见,而且很少有客户端支持 RFC 2817,以至于它可能根本没有被注意到。)