我用 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 on
的HTTPS),如文档。
编辑(我没有意识到你已经在使用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,OPTIONS
Vary
在 Debian Lenny(Apache Httpd 2.2.9,带有一些额外的反向移植安全补丁)以及更新版本上,您根本无法获得这些Allow
或标头。您可以使用 获得它们。Vary
OPTIONS /
我怀疑这些版本之间的处理方式有所改变OPTIONS *
。(这可能也与此主题)这肯定会影响通过的 RFC 2817 升级OPTIONS *
。
我建议向 Apache Httpd 用户或者可能的开发列表询问这个问题。
听起来这可能是一个错误。(使用OPTIONS *
非常少见,而且很少有客户端支持 RFC 2817,因此它可能只是被忽视了。)