Como construir o Apache httpd 2.4.20 no CentOS 7 com suporte a http2?

4

Passei quase um dia tentando fazer o Apache httpd construir com ALPN e suporte a http2 para EL6 e EL7 para minha empresa e sociedade, como anteriormente feito para o NGINX (Construído estaticamente contra o OpenSSL 1.0.2h).

Primeiro, tentei reconstruir o src rpms com o OpenSSL 1.0.2h retirado do Fedora e instalar o resultado rpms (openssl-devel-1.0.2h-1.el7.centos.x86_64.rpm, openssl-1.0.2h-1. el7.centos.x86_64.rpm) para substituir o sistema. Sim, eu sei, isso não é o caminho certo para compilações públicas, mas eu preciso saber se funcionará.

Então eu reconstruí o nghttp2-1.7.1-1.fc24.src.rpm e instalei o resultado libnghttp2-devel-1.7.1-1.el7.centos.x86_64.rpm e libnghttp2-1.7.1-1. el7.centos.x86_64.rpm.

Finalmente, após remover alguns patches e hackear apr e apr-util, consegui construir o httpd-2.4.18-1.fc23.src.rpm em httpd-2.4.18-1.el7.centos.x86_64. rpm.

O HTTP / 1.1 simples funcionou para mim ok, e o suporte a ALPN também estava presente, mas o HTTP / 2 não funcionou:

$ 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: [email protected],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: [email protected],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

Eu pensei que poderia haver problemas com alguns dos patches do Fedora e tentei reconstruir algumas outras partes sem qualquer sorte. Finalmente, eu removi todos os rpms "devel", baixei o último estável httpd-2.4.20, coloquei apr e apr-util não modificadas mais recentes fontes em seu diretório srclib e tentei construir com:

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"

Como você pode ver, estou tentando construir mod_ssl e mod_http2 estaticamente com as versões mais recentes das bibliotecas, mas http2 ainda não funciona exatamente com a mesma mensagem de erro: o servidor descarta a conexão sem nenhuma resposta. Não há dados que possam ser encontrados nos logs: as solicitações não são exibidas nos logs, enquanto as solicitações http / 1.1, http / 1.1 sobre SSL e h2c são registradas e tratadas corretamente.

Meu arquivo de configuração agora é quase um estoque (de httpd-2.4.20 não modificado), mas com mod_ssl ativado, mod_http2 e "Protocolos h2 http / 1.1".

Mais uma coisa estranha: tentei adicionar "LogLevel http2: info" para depurar http2, mas não consigo ver nenhuma linha de inicialização como "[http2: info] [pid XXXXX: números tid] mod_http2 (v1. 0.0, nghttp2 1.3.4), inicializando ... ". No entanto, acredito que o módulo http2 esteja ativado, pois não há erro de configuração para este nível de log. Também verifiquei com h2c (http2 sobre http simples) e funciona perfeitamente com curl e "101 Switching protocols" reply.

Então, eu tentei compilá-lo estaticamente, dinamicamente, com diferentes versões de lib, finalmente usei fontes limpas e não modificadas para arquivos de configuração nghttp2, openssl, apr, apr-util, sem qualquer sorte, porém o HTTP / 2 e o ALPN funcionam normalmente separadamente.

Por favor, informe.

    
por Alexander Gerasimov 26.05.2016 / 22:50

1 resposta

5

Noto que você está usando este conjunto de criptografia: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

No entanto, essa codificação é listada em preto para HTTP / 2: link

Por padrão, o mod_http2 não permitirá negociar com códigos da lista negra: link

Então, eu me pergunto se esse é o único problema e você só precisa ativar conjuntos de criptografia mais modernos? Especificamente, um ECDHE com GCM em vez de um conjunto CBC como TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25. Você pode sempre desativar a flag off para o teste de curvas, mas o Chrome usa essa lista negra de forma semelhante. Portanto, você precisará habilitar outras cifras (e por que você não quer, já que passou pela dificuldade de atualizar o seu openssl para isso? ).

Se esse não é o problema, você pode conferir as instruções passo a passo que eu dou aqui sobre como criar a partir da fonte: link . Eu uso o Centos 7 e essas etapas funcionam para mim.

    
por 30.05.2016 / 00:38