web-dev-qa-db-ja.com

http2をサポートするCentOS7でApachehttpd 2.4.20をビルドする方法は?

以前と同じように、ALPNを使用してApache httpdビルドを作成し、EL6とEL7をhttp2でサポートして、会社と社会を構築しようとほぼ1日を費やしました NGINX用に作成 (OpenSSL 1.0.2hに対して静的に構築) 。

まず、Fedoraから取得したOpenSSL 1.0.2hでsrc rpmsを再構築し、結果の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: [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

私はFedoraのパッチのいくつかに問題がある可能性があると考え、運が悪かったので他のいくつかのパーツを再構築しようとしました。最後に、すべての「devel」rpmを削除し、最新の安定した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 over SSL、およびh2cリクエストは適切にログに記録されて処理されます。

私の設定ファイルは今ではほとんど変更されていません(未変更のhttpd-2.4.20から)が、mod_ssl、mod_http2、および "Protocols h2 http/1.1"が有効になっています。

もう1つの奇妙なこと:http2をデバッグするために「LogLevel http2:info」を追加しようとしましたが、「[http2:info] [pid XXXXX:tid numbers] mod_http2(v1.0.0、nghttp2 1.3.4)、初期化中...」ただし、このログレベルの構成エラーはないため、http2モジュールはオンになっていると思います。また、h2c(プレーンhttpよりもhttp2)でチェックしたところ、curlと「101Switchingprotocols」の応答で完全に機能します。

それで、私はそれを静的に、動的に、異なるlibバージョンで構築しようとしました、最後にnghttp2、openssl、apr、apr-util、構成ファイルのクリーンで変更されていないソースを使用しましたが、HTTP/2とALPNは通常は別々に機能します。

お知らせ下さい。

4

この暗号スイートを使用していることに気付きました:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

ただし、その暗号はHTTP/2のブラックリストに記載されています: https://tools.ietf.org/html/rfc754

また、デフォルトでは、mod_http2はブラックリストに登録された暗号とのネゴシエーションを許可しません: https://httpd.Apache.org/docs/2.4/mod/mod_http2.html#h2moderntlsonly

それが唯一の問題であり、より近代的な暗号スイートを有効にする必要があるだけなのでしょうか。具体的には、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25のようなCBCスイートではなくGCMを使用したECDHEです。カールテストではいつでも上記のフラグをオフにすることができますが、Chromeも同様にこのブラックリストを使用するため、とにかく他の暗号を有効にする必要があります(そして、行ってからなぜそうしたくないのですか?このためにopensslをアップグレードする手間をかけます)。

それが問題ではない場合は、ソースからビルドする方法についてここで説明するステップバイステップの手順を確認できます: https://www.tunetheweb.com/performance/http2/ 。私はCentos 7を使用しており、これらの手順でうまくいきます。

5
Barry Pollard