为了满足安全规范,从http改造成https(见(四)启用HTTPS),然而启用https后就可以高枕无忧了吗?绿盟告诉你:当然不,TLS Client-initiated 重协商攻击(CVE-2011-1473)了解一下。
1. 漏洞
报告是这样的:
详细描述 该漏洞存在于SSL renegotiation的过程中。对于使用SSL重协商功能的服务都会受其影响。特别的,renegotiation被用于浏览器到服务器之间的验证。虽然目前可以在不启用renegotiation进程的情况下使用HTTPS,但很多服务器的默认设置均启用了renegotiation功能。该漏洞只需要一台普通电脑和DSL连接即可轻易攻破SSL服务器。而对于大型服务器集群来说,则需要20台电脑和120Kbps的网络连接即可实现。SSL是银行、网上电子邮件服务和其他用于服务器和用户之间保护私人数据并安全通信必不可少的功能。所以本次拒绝服务漏洞影响范围非常广危害非常大。 解决办法 使用SSL开启重协商的服务都会受该漏洞影响. Apache解决办法: 升级到Apache 2.2.15以后版本 IIS解决办法: IIS 5.0启用SSL服务时,也会受影响。可以升级IIS 6.0到更高的版本。 Lighttpd解决办法: 建议升级到lighttpd 1.4.30或者更高,并设置ssl.disable-client-renegotiation = "enable"。 http://download.lighttpd.net/lighttpd/releases-1.4.x/ Nginx解决办法: 0.7.x升级到nginx 0.7.64 0.8.x升级到 0.8.23 以及更高版本。 http://nginx.org/en/download.html Tomcat解决办法: 1、使用NIO connector代替BIO connector,因为NIO不支持重协商,参考如下配置: <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"> (可能会影响Tomcat性能); 2、配置Nginx反向代理,在Nginx中修复OpenSSL相关问题。 参考链接: https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html http://tomcat.apache.org/security-7.html#Not_a_vulnerability_in_Tomcat https://tomcat.apache.org/tomcat-6.0-doc/config/http.html#Connector_Comparison Squid解决办法: 升级到3.5.24以及以后版本 http://www.squid-cache.org/Versions/ 其它服务解决方案请联系各应用厂商确认关闭重协商的方法。
然而我的http server用的是netty(netty既支持jdk ssl,也支持open ssl,open ssl的安全性和性能都比jdk ssl来的高,可以参考博文)。
解决方案中并无想要的信息,仅有一个用nginx增加反向代理,这种方式并无法让我感到满意,网上搜了一堆信息,但并没有找到想要的答案,因此只能从源码找起了。
2. 找http server
方式是直接从启动入口,通过find usages往上找。
@Override public void start() throws WebServerException { if (this.nettyContext == null) { try { this.nettyContext = startHttpServer(); } catch (Exception ex) { if (findBindException(ex) != null) { SocketAddress address = this.httpServer.options().getAddress(); if (address instanceof InetSocketAddress) { throw new PortInUseException( ((InetSocketAddress) address).getPort()); } } throw new WebServerException("Unable to start Netty", ex); } NettyWebServer.logger.info("Netty started on port(s): " + getPort()); startDaemonAwaitThread(this.nettyContext); } }
@Override public WebServer getWebServer(HttpHandler httpHandler) { HttpServer httpServer = createHttpServer(); ReactorHttpHandlerAdapter handlerAdapter = new ReactorHttpHandlerAdapter( httpHandler); return new NettyWebServer(httpServer, handlerAdapter, this.lifecycleTimeout); }
private HttpServer createHttpServer() { return HttpServer.builder().options((options) -> { options.listenAddress(getListenAddress()); if (getSsl() != null && getSsl().isEnabled()) { SslServerCustomizer sslServerCustomizer = new