Как собрать Apache httpd 2.4.20 на CentOS 7 с поддержкой http2?

Я потратил почти день, пытаясь создать сборки Apache httpd с ALPN и http2 поддержка EL6 и EL7 для моей компании и общества, как я ранее сделал для NGINX (Построен статически против OpenSSL 1.0.2h).

Сначала я попытался перестроить src rpms с взятым OpenSSL 1.0.2h из Fedora и установил rpms (openssl-devel-1.0.2h-1.el7.centos.x86_64.rpm, openssl-1.0.2h-1.el7.centos.x86_64.rpm) на замену системного. Да, я знаю , это не подходит для публичных сборок,но мне нужно знать, будет ли вообще работать.

Затем я перестроил nghttp2-1.7.1-1.fc24.src.rpm и установил получившийся libnghttp2-devel-1.7.1-1.el7.centos.x86_64 .rpm и libnghttp2-1.7.1-1.el7.centos.x86_64.rpm.

Наконец, после удаления некоторых патчей и взлома apr и apr-util мне удалось собрать httpd-2.4.18-1.fc23 .src.rpm в httpd-2.4.18-1.el7.centos.x86_64.rpm.

Обычный HTTP / 1.1 работал у меня нормально, и поддержка ALPN также присутствовала, но HTTP / 2 не работал:

$ curl -v --insecure --http2 --tlsv1.2 https://192.168.1.148
* Rebuilt URL to: https://192.168.1.148/
*   Trying 192.168.1.148...
* Connected to 192.168.1.148 (192.168.1.148) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* ALPN, server accepted to use h2
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
*       subject: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
*       start date: май 25 13:11:19 2016 GMT
*       expire date: май 25 13:11:19 2017 GMT
*       common name: centos7.dcodeit.net
*       issuer: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55ccf55b44c0)
> GET / HTTP/1.1
> Host: 192.168.1.148
> User-Agent: curl/7.43.0
> Accept: */*
>
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* Unexpected EOF
* Closing connection 0
curl: (56) Unexpected EOF

Я подумал, что с некоторыми патчами Fedora могут быть проблемы, и попытался пересобрать некоторые другие части, но безуспешно.после удаления некоторых патчей и взлома apr и apr-util мне удалось встроить httpd-2.4.18-1.fc23.src.rpm в httpd-2.4.18-1.el7.centos.x86_64.rpm.

Обычный HTTP / 1.1 работал у меня нормально, и поддержка ALPN также присутствовала, но HTTP / 2 не работал:

$ curl -v --insecure --http2 --tlsv1.2 https://192.168.1.148
* Rebuilt URL to: https://192.168.1.148/
*   Trying 192.168.1.148...
* Connected to 192.168.1.148 (192.168.1.148) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* ALPN, server accepted to use h2
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
*       subject: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
*       start date: май 25 13:11:19 2016 GMT
*       expire date: май 25 13:11:19 2017 GMT
*       common name: centos7.dcodeit.net
*       issuer: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55ccf55b44c0)
> GET / HTTP/1.1
> Host: 192.168.1.148
> User-Agent: curl/7.43.0
> Accept: */*
>
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* Unexpected EOF
* Closing connection 0
curl: (56) Unexpected EOF

Я подумал, что могут быть проблемы с некоторыми патчами Fedora, и попытался пересобрать некоторые другие части, но безуспешно.после удаления некоторых патчей и взлома apr и apr-util мне удалось встроить httpd-2.4.18-1.fc23.src.rpm в httpd-2.4.18-1.el7.centos.x86_64.rpm.

Обычный HTTP / 1.1 работал у меня нормально, и поддержка ALPN также присутствовала, но HTTP / 2 не работал:

$ curl -v --insecure --http2 --tlsv1.2 https://192.168.1.148
* Rebuilt URL to: https://192.168.1.148/
*   Trying 192.168.1.148...
* Connected to 192.168.1.148 (192.168.1.148) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* ALPN, server accepted to use h2
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
* Server certificate:
*       subject: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
*       start date: май 25 13:11:19 2016 GMT
*       expire date: май 25 13:11:19 2017 GMT
*       common name: centos7.dcodeit.net
*       issuer: E=root@centos7.dcodeit.net,CN=centos7.dcodeit.net,OU=SomeOrganizationalUnit,O=SomeOrganization,L=SomeCity,ST=SomeState,C=--
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55ccf55b44c0)
> GET / HTTP/1.1
> Host: 192.168.1.148
> User-Agent: curl/7.43.0
> Accept: */*
>
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* http2_recv: 16384 bytes buffer at 0x55ccf55b4e08 (stream 1)
* Unexpected EOF
* Closing connection 0
curl: (56) Unexpected EOF

Я подумал, что могут быть проблемы с некоторыми патчами Fedora, и попытался пересобрать некоторые другие части, но безуспешно. Наконец, я удалил все "devel" rpms, загрузил последнюю стабильную версию httpd-2.4.20, поместил неизмененные последние исходные коды apr и apr-util в ее каталог srclib и попытался выполнить сборку с помощью:

CFLAGS="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic"; export CFLAGS
LDFLAGS="-Wl,-z,relro,-z,now"; export LDFLAGS
"./configure" \
"--prefix=/etc/httpd" \
"--exec-prefix=/usr" \
"--bindir=/usr/bin" \
"--sbindir=/usr/sbin" \
"--mandir=/usr/share/man" \
"--libdir=/usr/lib64" \
"--sysconfdir=/etc/httpd/conf" \
"--includedir=/usr/include/httpd" \
"--libexecdir=/usr/lib64/httpd/modules" \
"--datadir=/usr/share/httpd" \
"--enable-layout=Fedora" \
"--with-installbuilddir=/usr/lib64/httpd/build" \
"--enable-mpms-shared=all" \
"--enable-suexec" \
"--with-included-apr" \
"--with-suexec" \
"--enable-suexec-capabilities" \
"--with-suexec-caller=apache" \
"--with-suexec-docroot=/var/www" \
"--without-suexec-logfile" \
"--with-suexec-syslog" \
"--with-suexec-bin=/usr/sbin/suexec" \
"--with-suexec-uidmin=1000" \
"--with-suexec-gidmin=1000" \
"--enable-pie" \
"--with-pcre" \
"--enable-mods-shared=all" \
"--enable-ssl" \
"--with-ssl=/root/openssl-1.0.2h" \
"--enable-ssl-staticlib-deps" \
"--with-nghttp2=/root/nghttp2-1.11.0" \
"--enable-nghttp2-staticlib-deps" \
"LDFLAGS=-Wl,-z,relro,-z,now" \
"CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic"

Как видите, я пытаюсь для статической сборки mod_ssl и mod_http2 с последними версиями библиотек, но http2 по-прежнему не работает с точно таким же сообщением об ошибке: сервер разрывает соединение без какого-либо ответа. В журналах нет данных: запросы вообще не отображаются в журналах, тогда как запросы http / 1.1, http / 1.1 через SSL и h2c должным образом регистрируются и обрабатываются.

Мой файл конфигурации теперь почти готов ( из немодифицированного httpd-2.4.20), но с включенными mod_ssl, mod_http2 и «Протоколами h2 http / 1.1».

Еще одна странная вещь: я пытался добавить «LogLevel http2: info» для отладки http2, но я ' m не может видеть строки инициализации, такие как «[http2: info] [pid XXXXX: tid numbers] mod_http2 (v1.0.0, nghttp2 1.3.4), initializing ...». Однако я считаю, что модуль http2 включен, так как для этого уровня журнала нет ошибки конфигурации. Также я проверил его с помощью h2c (http2 поверх обычного http), и он отлично работает с curl и ответом «101 Switching Protocol».

Итак, я попытался построить его статически, динамически, с разными версиями библиотеки, наконец, я использовал clean, без изменений исходники для nghttp2, openssl, apr, apr-util, конфигурационных файлов безуспешно, однако HTTP / 2 и ALPN обычно работают отдельно.

Пожалуйста, сообщите.

4
задан 27 May 2016 в 00:12
1 ответ

Я заметил, что вы используете этот набор шифров: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

Однако этот шифр черный для HTTP/2: https://tools.ietf.org/html/rfc7540

И по умолчанию mod_http2 не позволяет вам вести переговоры с шифрами, занесенными в черный список: https://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2moderntlsonly

Интересно, это единственная проблема и вам просто нужно включить более современные наборы шифров? Конкретно ECDHE с GCM, а не CBC, как TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25. Вы всегда можете отключить флаг выше для проверки скручивания, но Chrome аналогичным образом использует этот чёрный список, так что вам всё равно понадобится включить другие шифры (а почему бы и нет, раз уж вы прошли через сложную процедуру обновления вашего openssl для этого).

Если это не так, то вы можете посмотреть пошаговые инструкции, которые я даю здесь о том, как собирать из исходных текстов: https://www.tunetheweb.com/performance/http2/. Я использую Centos 7, и эти шаги работают на меня.

.
5
ответ дан 3 December 2019 в 03:16

Теги

Похожие вопросы