Apache не будет обновлять соединение до TLS
Я написал сервер 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
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, что он мог бы просто остаться незамеченным.)