Ssl

如何在支持 http2 的 CentOS 7 上建構 Apache httpd 2.4.20?

  • May 29, 2016

我花了將近一天的時間嘗試為我的公司和社會使用 ALPN 和 http2 支持 EL6 和 EL7 建構 Apache httpd,就像我之前為 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: 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” 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”。

還有一件奇怪的事情:我試圖添加“LogLevel http2:info”來調試 http2,但是我看不到任何初始化行,比如“

$$ http2:info $$ $$ pid XXXXX:tid numbers $$mod_http2 (v1.0.0, nghttp2 1.3.4),正在初始化…”。但是,我相信 http2 模組已打開,因為此日誌級別沒有配置錯誤。我還使用 h2c 進行了檢查(http2 over plain http)它與 curl 和“101 Switching protocols”回复完美配合。 因此,我嘗試使用不同的 lib 版本靜態、動態地建構它,最後我為 nghttp2、openssl、apr、apr-util、配置文件使用了乾淨的、未修改的源,但沒有任何運氣,但是 HTTP/2 和 ALPN 分別正常工作。

請指教。

我注意到您正在使用此密碼套件:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

然而,該密碼被列入 HTTP/2 的黑名單:https ://www.rfc-editor.org/rfc/rfc7540

預設情況下,mod_http2 不允許您與列入黑名單的密碼進行協商:https ://httpd.apache.org/docs/2.4/mod/mod_http2.html#h2moderntlsonly

所以我想知道這是否是唯一的問題,您只需要啟用更現代的密碼套件嗎?特別是帶有 GCM 的 ECDHE,而不是像 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA25 這樣的 CBC 套件。您總是可以為您的 curl 測試關閉上述標誌,但 Chrome 類似地使用此黑名單,因此您無論如何都需要啟用其他密碼(為什麼您不想這樣做,因為您已經為此經歷了升級 openssl 的麻煩)。

如果這不是問題,那麼您可以查看我在此處給出的關於如何從原始碼建構的分步說明:https ://www.tunetheweb.com/performance/http2/ 。我使用 Centos 7,這些步驟對我有用。

引用自:https://serverfault.com/questions/779289