Я написал IPP-сервер на PHP, работающий под Apache. Со стандартными клиентами IPP все работает нормально. Но когда я пытаюсь печатать с устройства iOS, соединение прерывается, когда клиент пытается переключиться на TLS. Похоже, что это предусмотрено RFC 2817 (Обновление до TLS в HTTP / 1.1) и должно поддерживаться 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
Насколько мне известно, 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, что это могло бы остаться незамеченным.)