如何打开 libapache2 mod php5 的 mod

查看:11662|回复:7
助理工程师
对于绿盟科技这个安全扫描,我是不想做太多是评论,用过绿盟的朋友都清楚。学艺不精所以粘贴出来让广大网友帮忙参考下这些漏洞如何修补。
随便载了个漏洞如下;
漏洞详情&&漏洞名称
&&&&Apache&&HTTP Server mod_lua模块输入验证漏洞(CVE-)
&& &&详细描述
&&&&Apache HTTP Server是美国阿帕奇(Apache)软件基金会的一款开源网页服务器。该服务器具有快速、可靠且可通过简单的API进行扩充的特点。
Apache HTTP Server 2.4.12及之前版本的mod_lua模块中的lua_request.c文件中的‘lua_websocket_read’函数存在安全漏洞。远程攻击者可通过在Lua脚本调用wsupgrade函数后发送特制的WebSocket&&Ping帧利用该漏洞造成拒绝服务(child-process崩溃)。
&& &&解决办法
&&&&目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接:
&& &&威胁分值
&& &&危险插件
&& &&发现日期
&& &&CVE编号
&& &&CNNVD编号
&&&&CNNVD-
&& &&CNCVE编号
&&&&CNCVE-
&& &&CVSS评分
这个漏洞描述扫描的都很清楚了,下面最费解的就是他这个解决办法安照他这个补丁连接
找到CVE编号& &
-*- coding: utf-8 -*-
Changes with Apache 2.4.14Changes with Apache 2.4.13&&*) SECURITY: CVE- (cve.mitre.org)& &&&core: Fix a crash with ErrorDocument 400 pointing to a local URL-path& && &with the INCLUDES filter active, introduced in 2.4.11. PR 57531.& && &[Yann Ylavic]
*) SECURITY: CVE- (cve.mitre.org)& &&&mod_lua: A maliciously crafted websockets PING after a script& &&&calls r:wsupgrade() can cause a child process crash.& && &[Edward Lu &&]&&*) mod_proxy: Don't put the worker in error state for 500 or 503 errors& &&&returned by the backend unless failonstatus is configured to.&&PR 56925.& &&&[Yann Ylavic]&&*) core: Don't lowercase the argument to SetHandler if it begins with& &&&&proxy:unix&. PR 57968. [Eric Covener]&&*) mod_ssl OCSP Stapling: Don't block initial handshakes while refreshing& &&&the OCSP response for a different certificate.&&mod_ssl has an additional& &&&global mutex, &ssl-stapling-refresh&.&&PR 57131 (partial fix).& &&&[Jeff Trawick]&&*) mod_authz_dbm: Fix crashes when &dbm-file-group& is used and& &&&authz modules were loaded in the &wrong& order.&&[Joe Orton]&&*) mod_authn_dbd, mod_authz_dbd, mod_session_dbd, mod_rewrite: Fix lifetime& &&&of DB lookup entries independently of the selected DB engine.&&PR 46421.& &&&[Steven whitson &steven.whitson gmail com&, Jan Kaluza, Yann Ylavic].....
绿盟的朋友请告诉我这个漏洞怎么补,补丁在哪里。高手指教下这类漏洞怎么找补丁
论坛首席搬砖工程师
找个懂Apache得给看看吧。。。
51CTO信息安全交流群: 入群请说明论坛ID
论坛首席记者
我也曾遇到过你一样的问题,找了半天都没找到,最后放弃了
如果你实在看中这漏洞,咨询绿盟看看
菜刀在手,问天下谁是英雄
初级工程师
引用:原帖由 Ydebin 于
14:58 发表
对于绿盟科技这个安全扫描,我是不想做太多是评论,用过绿盟的朋友都清楚。学艺不精所以粘贴出来让广大网友帮忙参考下这些漏洞如何修补。
随便载了个漏洞如下;
漏洞详情&&漏洞名称
& & file:///C:/Users/ADMINI~1/AppDat ... 就是升级版本。
首先,看看你的apache是2点几的版本。
然后找到2.x版本的change log 看看你的bug是在哪个小版本后修复的。
升级到对应版本就行了。
例如你的这个漏洞 CVE- 根据change log,在apache 2.4系列中到2.4.13中修复。因此需要升级到 2.4.13或 2.4.14都可以。
本帖最后由 phanx 于
17:39 编辑
Cisco - CCIE R&S
IBM - CATE Power/w AIX v2
Oracle - OCM DB 10g
Redhat - RHCA&&
助理工程师
你的程序或者系统架构需要lua吗?如果不用的话,禁掉这个mod_lua模块就行
引用:原帖由 Ydebin 于
14:58 发表
对于绿盟科技这个安全扫描,我是不想做太多是评论,用过绿盟的朋友都清楚。学艺不精所以粘贴出来让广大网友帮忙参考下这些漏洞如何修补。
随便载了个漏洞如下;
漏洞详情&&漏洞名称
& & file:///C:/Users/ADMINI~1/AppDat ... 该漏洞属于无公开利用方法漏洞,基于Apache泄漏版本报出,可以通过配置隐藏Apache版本进行规避。
配置方法:
在Apache配置文件中添加ServerTokens ProductOnly
#ServerTokens OS& && && && & # 注释掉改行
Servertokens off& && && && & # 添加这行屏蔽apache版本信息& &
ServerSignature Off& && && & # 添加这行屏蔽系统信息
配置完成后重启httpd服务,使用chrome 开发者工具.NETWORK抓包,查看报文RESPONSE HEADERS server字段验证版本是否隐藏成功。
其他中间件隐藏版本信息,可参考链接:
系统漏洞扫描器一般有以下几种扫描方式:
1、版本扫描:nmap探测服务版本,然后匹配漏洞库报出。如:mysql、apahce、websphere、nginx、openssh、oracle等(其中ssh和oracle还会有误报,但算不上是扫描器的问题,是ssh和oracle产品机制和版本扫描局限性导致的,如有兴趣可再交流)。
2、可利用漏洞扫描:扫描器发出攻击测试包,对目标返回的数据包进行分析比对来判断漏洞是否存在。目标主机存在漏洞与否,返回的数据包是不一样的。如:openssl 心脏出血漏洞(CVE-)、GNU BASH漏洞(CVE-)等。
3、登录扫描:通过提供用户登陆口令方式登陆进行扫描,扫描方式为读取补丁信息、软件版本信息、主机配置,上传执行脚本等。如:IE本地漏洞、adobe flash player漏洞、windows/linux本地提权漏洞、oracle漏洞、无利用入口的GNU BASH漏洞
本帖最后由 ovfqi 于
11:39 编辑
引用:原帖由 ovfqi 于
11:14 发表
系统漏洞扫描器一般有以下几种扫描方式:
1、版本扫描:nmap探测服务版本,然后匹配漏洞库报出。如:mysql、apahce、websphere、nginx、openssh、oracle等(其中ssh和oracle还会有误报,但算不上是扫描器的问题,是ssh和oracle产品 ... 好懂~~~~网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&正文
apache开启.htaccess及.htaccess的使用方法
今天本地调试PHP程序,用到了.htaccess,而默认配置里面开启.htaccess,在网上找到了开启.htaccess的可行方法,供朋友们借鉴。(开启的我他的方法不行,查找了一下AllowOverride None全部的都给换成AllowOverride All就了,原因不明,O(∩_∩)O~ 记得修改完httpd.conf以后一定要重启下apache才的哦~ ) 1 . 如何让的本地APACHE器.htaccess 如何让的本地APACHE器&.htaccess&呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess了,来看看操作 打开httpd.conf(在那里? APACHE目录的CONF目录里面),用文本编纂器打开后,查找 (1) Options FollowSymLinks AllowOverride None 改为 Options FollowSymLinks AllowOverride All (2)去掉下面的注释 LoadModule rewrite_module modules/mod_rewrite.so 就了 2. htaccess 写法   Apache中的.htaccess(或者”分布式配置”了针对目录改变配置的方法,即,在特定的文档目录中放置包含或多个指令的,以作用于此目录及其子目录。作为,所能的命令受到限制。***Apache的AllowOverride指令来设置。   子目录中的指令会笼盖更高级目录或者主器配置中的指令。   .htaccess必需以ASCII模式上传,最好将其权限设置为644。   错误文档的定位   常用的客户端哀求错误返回代码:   401 Authorization Required   403 Forbidden   404 Not Found   405 Method Not Allowed   408 Request Timed Out   411 Content Length Required   412 Precondition Failed   413 Request Entity Too Long   414 Request URI Too Long   415 Unsupported Media Type   常见的器错误返回代码:   500 Internal Server Error   利用.htaccess指定事先制作好的错误提醒页面。一般下,人们专门设立目录,例如errors放置页面。然后再.htaccess中,加入如下的指令:   ErrorDocument 404 /errors/notfound.html   ErrorDocument 500 /errors/internalerror.html   一条指令一行。上述第一条指令的意思是对于404,也找到所的文档的得显示页面为/errors目录下的notfound.html页面。不难看出语法格局为:   ErrorDocument 错误代码 /目录名/名.扩展名   所提示的很少的话,不必专门制作页面,直接在指令中HTML号了,例如下面例子:   ErrorDocument 401 “你权限访问该页面,请抛却!”   文档访问的密码保护   要利用.htaccess对某个目录下的文档设定访问和对应的密码,首先要做的是生成.htpasswd的文本文档,例如:   zheng:y4E7Ep8e7EYV   这里密码经由加密,找些工具将密码加密成.htaccess的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。   有了授权文档,在.htaccess中加入如下指令了:   AuthUserFile .htpasswd的器目录   AuthGroupFile /dev/null (授权访问的目录)   AuthName EnterPassword   AuthType Basic (授权类型)   是的主人,应该处处为着想。 ―― 雷锋   require user wsabstract (允许访问的,但愿表中都允许, require valid-user)   注,括号部门为学习添加的注释   拒绝来自某个IP的访问   我不想某个政府部门访问到站点的,那.htaccess中加入该部门的IP而将它们拒绝在外。   例如:   order allow,deny   deny from 210.10.56.32   deny from 219.5.45.   allow from all   第二行拒绝某个IP,第三行拒绝某个IP段,也219.5.45.0~219.2.45.255   想要拒绝人?用deny from all好了。不止用IP,也用域名来设定。   保护.htaccess文档   在.htaccess来设置目录的密码保护时,它包含了密码的路径。从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的。虽然用其他做到这点,好比文档的权限。不外,.htaccess本身也能做到,只需加入如下的指令:   order allow,deny   deny from all   URL转向   可能对重新规划,将文档了迁移,或者更改了目录。这,来自搜索引擎或者其他链接过来的访问就可能犯错。这种下,如下指令来完成旧的URL自动转向到新的:   Redirect /旧目录/旧文档名 新文档的   或者整个目录的转向:   Redirect 旧目录 新目录   改变缺省的首页   一般下缺省的首页名有default、index等。不外,有些目录中没出缺省,而是某个特定的名,好比在pmwiki中是 pmwiki.php。这种下,要记住名来访问很麻烦。在.htaccess中等闲的设置新的缺省名:   DirectoryIndex 新的缺省名   也列出多个,顺序表明它们之间的优先级别,例如:   DirectoryIndex filename.html index.cgi index.pl default.htm   防止盗链   不喜欢别人在的网页上连接的、文档的话,也htaccess的指令来做到。   所的指令如下:   RewriteEngine on   RewriteCond %{ HTTP_REFERER } !^$   RewriteCond %{ HTTP_REFERER } !^http://(www.)?/.*$ [NC]   RewriteRule .(gif&jpg)$ - [F]   觉得让别人的页面开个天窗不好看,那用一张来代替:   RewriteEngine on   RewriteCond %{ HTTP_REFERER } !^$   RewriteCond %{ HTTP_REFERER } !^http://(www.)?/.*$ [NC]   RewriteRule .(gif&jpg)$ /替代名 [R,L] 其它补充: 在给出如何配置Apache支持.htaccess文件之前,首先申明一下:使用.htaccess文件,会降低httpd服务器的一点性能。 配置方法 找到Apache的httpd.conf配置文件,编辑器打开。 //找到 &Directory /&   Options FollowSymLinks   AllowOverride None &/Directory& //修改为 &Directory /&   Options FollowSymLinks   AllowOverride All &/Directory& //就可以了 /* 如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。 例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置: */ AccessFileName .config  通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的。 (不)使用.htaccess文件的场合   一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。   .htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。   虽然如此,一般都应该尽可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的段中,而且更高效。 避免使用.htaccess文件有两个主要原因。   首先是性能。如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致性能的下降。另外,对每一个请求,都需要读取一次.htaccess文件。   还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用,所以,如果请求/ctusky/ctu/sky中的页面,Apache必须查找以下文件: /.htaccess /ctusky/.htaccess /ctusky/ctu/.htaccess /ctusky/ctu/sky/.htaccess  一共就要访问4个额外的文件,就算这些文件都不存在,这也是本文开始说会影响服务器的一点性能的原因。   其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:详解为新版Apache服务器开启HTTP/2支持的方法
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了在Apache服务器中开启HTTP/2的方法,HTTP/2被称为未来的新HTTP协议,需要的朋友可以参考下
HTTP 2.0简介
HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。
IETF会让所有互联网通路默认选择的方式来引入加密,互联网专家们将新一代加密协议称为“HTTP 2.0”。
协议目标:
异步连接多路复用;
头部压缩;
请求/响应管线化;
保持与HTTP 1.1语义的向后兼容性也是该版本的一个关键目标。SPDY是一种HTTP兼容协议,由Google发起,Chrome、Opera、Firefox以及Amazon Silk等浏览器均已提供支持。HTTP实现的瓶颈之一是其并发要依赖于多重连接。HTTP管线化技术可以缓解这个问题,但也只能做到部分多路复用。此外,已经证实,由于存在中间干扰,浏览器无法采用管线化技术。SPDY在单个连接之上增加了一个帧层,用以多路复用多个并发流。帧层针对HTTP类的请求响应流进行了优化,因此运行在HTTP之上的应用,对应用开发者而言只要很小的修改甚至无需修改就可以运行在SPDY之上。SPDY对当前的HTTP协议有4个改进:
多路复用请求;
对请求划分优先级;
压缩HTTP头;
服务器推送流(即Server Push技术);
SPDY试图保留HTTP的现有语义,所以cookies、ETags等特性都是可用的。[3]
如何在 Apache 中启用 HTTP/2
刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。
最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。
编译支持 HTTP/2
在你编译版本之前,你要进行一些配置。这里有成千上万的选项。和 HTTP/2 相关的是:
--enable-http2
启用在 Apache 服务器内部实现该协议的 ‘http2' 模块。
--with-nghttp2=&dir&
指定 http2 模块需要的 libnghttp2 模块的非默认位置。如果 nghttp2 是在默认的位置,配置过程会自动采用。
--enable-nghttp2-staticlib-deps
很少用到的选项,你可能想将 nghttp2 库静态链接到服务器里。在大部分平台上,只有在找不到共享 nghttp2 库时才有用。
如果你想自己编译 nghttp2,你可以到 nghttp2.org 查看文档。最新的 Fedora 以及其它版本已经附带了这个库。
大部分人想在浏览器上使用 HTTP/2, 而浏览器只在使用 TLS 连接(https:// 开头的 url)时才支持 HTTP/2。你需要一些我下面介绍的配置。但首先你需要的是支持 ALPN 扩展的 TLS 库。
ALPN 用来协商negotiate服务器和客户端之间的协议。如果你服务器上 TLS 库还没有实现 ALPN,客户端只能通过 HTTP/1.1 通信。那么,可以和 Apache 链接并支持它的是什么库呢?
OpenSSL 1.0.2 及其以后。
??? (别的我也不知道了)
如果你的 OpenSSL 库是 Linux 版本自带的,这里使用的版本号可能和官方 OpenSSL 版本的不同。如果不确定的话检查一下你的 Linux 版本吧。
另一个给服务器的好建议是为 http2 模块设置合适的日志等级。添加下面的配置:
# 放在某个地方的这样一行
LoadModule http2_module modules/mod_http2.so
&IfModule http2_module&
LogLevel http2:info
&/IfModule&
当你启动服务器的时候,你可以在错误日志中看来类似的一行:
[timestamp] [http2:info] [pid XXXXX:tid numbers]
mod_http2 (v1.0.0, nghttp2 1.3.4), initializing...
那么,假设你已经编译部署好了服务器, TLS 库也是最新的,你启动了你的服务器,打开了浏览器。。。你怎么知道它在工作呢?
如果除此之外你没有添加其它的服务器配置,很可能它没有工作。
你需要告诉服务器在哪里使用该协议。默认情况下,你的服务器并没有启动 HTTP/2 协议。因为这样比较安全,也许才能让你已有的部署可以继续工作。
你可以用新的 Protocols 指令启用 HTTP/2 协议:
# 对于 https 服务器
Protocols h2 http/1.1
# 对于 http 服务器
Protocols h2c http/1.1
你可以给整个服务器或者指定的 vhosts 添加这个配置。
对于 TLS (SSL),HTTP/2 有一些特殊的要求。阅读下面的“ https:// 连接”一节了解更详细的信息。
http:// 连接 (h2c)
尽管现在还没有浏览器支持,但是 HTTP/2 协议也工作在 http:// 这样的 url 上, 而且 mod_h[ttp]2 也支持。启用它你唯一所要做的是在 Protocols 配置中启用它:
# 对于 http 服务器
Protocols h2c http/1.1
这里有一些支持 h2c 的客户端(和客户端库)。我会在下面介绍:
Daniel Stenberg 维护的用于访问网络资源的命令行客户端 curl 当然支持。如果你的系统上有 curl,有一个简单的方法检查它是否支持 http/2:
sh& curl -V
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets
不好了。这些功能中没有 'HTTP2'。你想要的是下面这样:
sh& curl -V
url 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets
如果你的 curl 支持 HTTP2 功能,你可以用一些简单的命令检查你的服务器:
sh& curl -v --http2 http://&yourserver&/
& Connection: Upgrade, HTTP2-Settings
& Upgrade: h2c
& HTTP2-Settings: AAMAAABkAAQAAP__
& HTTP/1.1 101 Switching Protocols
& Upgrade: h2c
& Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
&the resource&
恭喜,如果看到了有 ...101 Switching... 的行就表示它正在工作!
有一些情况不会发生 HTTP/2 的升级切换Upgrade。如果你的第一个请求有请求数据body,例如你上传一个文件时,就不会触发升级切换。h2c 限制部分有详细的解释。
nghttp2 可以一同编译它自己的客户端和服务器。如果你的系统中有该客户端,你可以简单地通过获取一个资源来验证你的安装:
sh& nghttp -uv http://&yourserver&/
[ 0.001] Connected
[ 0.001] HTTP Upgrade request
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQAAP__
[ 0.005] HTTP Upgrade response
HTTP/1.1 101 Switching Protocols
Upgrade: h2c
Connection: Upgrade
[ 0.006] HTTP Upgrade success
这和我们上面 curl 例子中看到的 Upgrade 输出很相似。
有另外一种在命令行参数中不用 -u 参数而使用 h2c 的方法。这个参数会指示 nghttp 进行 HTTP/1 升级切换过程。但如果我们不使用呢?
sh& nghttp -v http://&yourserver&/
[ 0.002] Connected
[ 0.002] send SETTINGS frame
[ 0.002] send HEADERS frame
END_STREAM | END_HEADERS | PRIORITY
(padlen=0, dep_stream_id=11, weight=16, exclusive=0)
Open new stream
:method: GET
:scheme: http
连接马上使用了 HTTP/2!这就是协议中所谓的直接direct模式,当客户端发送一些特殊的 24 字节到服务器时就会发生:
0x2e300d0a0d0a534d0d0a0d0a
用 ASCII 表示是:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
支持 h2c 的服务器在一个新的连接中看到这些信息就会马上切换到 HTTP/2。HTTP/1.1 服务器则认为是一个可笑的请求,响应并关闭连接。
因此,直接模式只适合于那些确定服务器支持 HTTP/2 的客户端。例如,当前一个升级切换过程成功了的时候。
直接模式的魅力是零开销,它支持所有请求,即使带有请求数据部分(查看h2c 限制)。
对于 2.4.17 版本,明文连接时默认启用 H2Direct 。但是有一些模块和这不兼容。因此,在下一版本中,默认会设置为off,如果你希望你的服务器支持它,你需要设置它为:
H2Direct on
https:// 连接 (h2)
当你的 mod_h[ttp]2 可以支持 h2c 连接时,那就可以一同启用 h2 兄弟了,现在的浏览器仅支持它和 https: 一同使用。
HTTP/2 标准对 https:(TLS)连接增加了一些额外的要求。上面已经提到了 ALNP 扩展。另外的一个要求是不能使用特定黑名单中的加密算法。
尽管现在版本的 mod_h[ttp]2 不增强这些算法(以后可能会),但大部分客户端会这么做。如果让你的浏览器使用不恰当的算法打开 h2 服务器,你会看到不明确的警告 INADEQUATE_SECURITY,浏览器会拒接连接。
一个可行的 Apache SSL 配置类似:
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
SSLProtocol All -SSLv2 -SSLv3
(是的,这确实很长。)
这里还有一些应该调整,但不是必须调整的 SSL 配置参数:SSLSessionCache, SSLUseStapling 等,其它地方也有介绍这些。例如 Ilya Grigorik 写的一篇超赞的博客: 高性能浏览器网络。
再次回到 shell 使用 curl(查看上面的“curl h2c”章节了解要求),你也可以通过 curl 用简单的命令检测你的服务器:
sh& curl -v --http2 https://&yourserver&/
* ALPN, offering h2
* ALPN, offering http/1.1
* ALPN, server accepted to use h2
&the resource&
恭喜你,能正常工作啦!如果还不能,可能原因是:
你的 curl 不支持 HTTP/2。查看上面的“检测 curl”一节。
你的 openssl 版本太低不支持 ALPN。
不能验证你的证书,或者不接受你的算法配置。尝试添加命令行选项 -k 停用 curl 中的这些检查。如果可以工作,就重新配置你的 SSL 和证书。
我们已经在 h2c 讨论过 nghttp。如果你用它来进行 https: 连接,你会看到类似下面的信息:
sh& nghttp https://&yourserver&/
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)
这有两种可能,你可以通过添加 -v 来检查。如果是:
sh& nghttp -v https://&yourserver&/
[ 0.034] Connected
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)
这意味着你服务器使用的 TLS 库没有实现 ALPN。有时候正确安装有点困难。多看看 Stackoverflow 吧。
你看到的也可能是:
sh& nghttp -v https://&yourserver&/
[ 0.034] Connected
The negotiated protocol: http/1.1
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)
这表示 ALPN 能正常工作,但并没有用 h2 协议。你需要像上面介绍的那样检查你服务器上的 Protocols 配置。如果一开始在 vhost 部分设置不能正常工作,试着在通用部分设置它。
你可以在 Firefox 浏览器中打开开发者工具,在那里的网络标签页查看 HTTP/2 连接。当你打开了 HTTP/2 并重新刷新 html 页面时,你会看到类似下面的东西:
在响应头中,你可以看到奇怪的 X-Firefox-Spdy 条目中列出了 “h2”。这表示在这个 https: 连接中使用了 HTTP/2。
Google Chrome
在 Google Chrome 中,你在开发者工具中看不到 HTTP/2 指示器。相反,Chrome 用特殊的地址 chrome://net-internals/#http2 给出了相关信息。(LCTT 译注:Chrome 已经有一个 “HTTP/2 and SPDY indicator” 可以很好的在地址栏识别 HTTP/2 连接)
如果你打开了一个服务器的页面,可以在 Chrome 中查看那个 net-internals 页面,你可以看到类似下面这样:
如果你的服务器在上面的列表中,就表示它正在工作。
Microsoft Edge
Windows 10 中 Internet Explorer 的继任者 Edge 也支持 HTTP/2。你也可以在开发者工具的网络标签页看到 HTTP/2 协议。
在 Apple 的 Safari 中,打开开发者工具,那里有个网络标签页。重新加载你的服务器上的页面,并在开发者工具中选择显示了加载的那行。如果你启用了在右边显示详细视图,看 Status 部分。那里显示了 HTTP/2.0 200,像这样:
https: 连接重新协商是指正在运行的连接中特定的 TLS 参数会发生变化。在 Apache httpd 中,你可以在 directory 配置中改变 TLS 参数。如果进来一个获取特定位置资源的请求,配置的 TLS 参数会和当前的 TLS 参数进行对比。如果它们不相同,就会触发重新协商。
这种最常见的情形是算法变化和客户端证书。你可以要求客户访问特定位置时需要通过验证,或者对于特定资源,你可以使用更安全的、对 CPU 压力更大的算法。
但不管你的想法有多么好,HTTP/2 中都不可以发生重新协商。在同一个连接上会有 100 多个请求,那么重新协商该什么时候做呢?
对于这种配置,现有的 mod_h[ttp]2 还没有办法。如果你有一个站点使用了 TLS 重新协商,别在上面启用 h2!
当然,我们会在后面的版本中解决这个问题,然后你就可以安全地启用了。
非 HTTP 协议
实现除 HTTP 之外协议的模块可能和 mod_http2 不兼容。这在其它协议要求服务器首先发送数据时无疑会发生。
NNTP 就是这种协议的一个例子。如果你在服务器中配置了 mod_nntp_like_ssl,那么就不要加载 mod_http2。等待下一个版本。
h2c 的实现还有一些限制,你应该注意:
在虚拟主机中拒绝 h2c
你不能对指定的虚拟主机拒绝 h2c 直连。连接建立而没有看到请求时会触发直连,这使得不可能预先知道 Apache 需要查找哪个虚拟主机。
有请求数据时的升级切换
对于有数据的请求,h2c 升级切换不能正常工作。那些是 PUT 和 POST 请求(用于提交和上传)。如果你写了一个客户端,你可能会用一个简单的 GET 或者 OPTIONS * 来处理那些请求以触发升级切换。
原因从技术层面来看显而易见,但如果你想知道:在升级切换过程中,连接处于半疯状态。请求按照 HTTP/1.1 的格式,而响应使用 HTTP/2 帧。如果请求有一个数据部分,服务器在发送响应之前需要读取整个数据。因为响应可能需要从客户端处得到应答用于流控制及其它东西。但如果仍在发送 HTTP/1.1 请求,客户端就仍然不能以 HTTP/2 连接。
为了使行为可预测,几个服务器在实现上决定不在任何带有请求数据的请求中进行升级切换,即使请求数据很小。
302 时的升级切换
有重定向发生时,当前的 h2c 升级切换也不能工作。看起来 mod_http2 之前的重写有可能发生。这当然不会导致断路,但你测试这样的站点也许会让你迷惑。
这里有一些你应该意识到的 h2 实现限制:
HTTP/2 协议允许在特定条件下重用 TLS 连接:如果你有带通配符的证书或者多个 AltSubject 名称,浏览器可能会重用现有的连接。例如:
你有一个 a.example.org 的证书,它还有另外一个名称 b.example.org。你在浏览器中打开 URL https://a.example.org/,用另一个标签页加载 https://b.example.org/。
在重新打开一个新的连接之前,浏览器看到它有一个到 a.example.org 的连接并且证书对于 b.example.org 也可用。因此,它在第一个连接上面发送第二个标签页的请求。
这种连接重用是刻意设计的,它使得使用了 HTTP/1 切分sharding来提高效率的站点能够不需要太多变化就能利用 HTTP/2。
Apache mod_h[ttp]2 还没有完全实现这点。如果 a.example.org 和 b.example.org 是不同的虚拟主机, Apache 不会允许这样的连接重用,并会告知浏览器状态码 421 Misdirected Request。浏览器会意识到它需要重新打开一个到 b.example.org 的连接。这仍然能工作,只是会降低一些效率。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 apache mod wsgi 的文章

 

随机推荐