在TOMCAT5.5上,SSL的APR实现和SSL的JSSE实现之间有什么区别

时间:2010-06-20 09:47:29

标签: tomcat ssl https

我正在配置SSL以支持TOMCAT 5.5上的HTTPS,因此我提到了http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html,其中详细说明了如何实现SSL。

本文档描述了两种实现SSL的方法,即APR实现和JSSE实现。我想知道它们之间有什么区别,包括它们的缺点和优点。

4 个答案:

答案 0 :(得分:22)

不同之处在于JDK正在使用它自己的SSL实现,而APR则使用计算机上安装的内容,即大多数情况下使用OpenSSL。

如果你有https的中低流量,那么Java解决方案就可以了,但是对于非常繁重的负载(例如,大多数页面运行在https上),OpenSSL本机解决方案要好得多,并且可以重新编译和优化,因此它运行得更快,消耗更少的资源。 然而,APR + OpenSSL的主要缺点是需要更多配置和调优+测试,Java版本只需开箱即用。

我通常做的是始终将默认的Java SSL解决方案与监控工具一起使用,如果流量变得繁重,而且只花费精力来调整APR解决方案。

答案 1 :(得分:1)

使用APR时,Tomcat可能会使用易受Heartbleed错误(http://heartbleed.com)攻击的OpenSSL引擎。 然后,您只需从APR切换server.xml:

<-- Define a APR SSL Coyote HTTP/1.1 Connector on port 8443 --> <Connector protocol="org.apache.coyote.http11.Http11AprProtocol" port="8443" .../>

对于不受此错误攻击的Java SSL实现:

<-- Define a blocking Java SSL Coyote HTTP/1.1 Connector on port 8443 --> <Connector protocol="org.apache.coyote.http11.Http11Protocol" port="8443" .../>

或者,如果您仍想使用APR,请确保使用已使用不受Heartbleed(OpenSSL 1.0.1g或更高版本)攻击的OpenSSL版本编译的Tomcat Native库,请参阅https://issues.apache.org/bugzilla/show_bug.cgi?id=56363

答案 2 :(得分:1)

小于5.5.29的Tomcat版本支持新的连接器属性&#34; allowUnsafeLegacyRenegotiation&#34;如果您使用旧的Java机器(jvm 1.6或更早版本没有安全补丁)并且不想更新也不想用Java也不是Tomcat唯一的方法 - 就是使用APR。 参见:

About security patches against RFC 5746 CVE-2009-3555

About Tomcat patches

About MITM vulnerability

答案 3 :(得分:0)

下表摘自Tomcat official documents,显示了连接器如何相互关联。表格中描述的最重要的区别是:

  • 从Tomcat 5.5.x开始支持APR,在Tomcat 6.x中添加了NIO,在Tomcat 8.x中添加了NIO2。
  • APR只能使用OpenSSL,但是NIO和NIO2可以使用JSSE或OpenSSL。
  • APR在执行SSL握手时会阻止,而其他两个不会。

OpenSSL connector comparison

还请注意this statement,它显示了自Tomcat 8.5以来JSSE和OpenSSL的配置属性之间的巨大兼容性:

  

NIO和NIO2连接器使用JSSE Java SSL实现或OpenSSL实现,而APR / native连接器仅使用OpenSSL。在Tomcat 8.5之前,JSSE和OpenSSL使用了不同的配置属性。从Tomcat 8.5开始,并尽可能将JSSE和OpenSSL都使用通用配置属性。同样,如果使用JSSE OpenSSL实现,则可以使用JSSE或APR属性来设置配置(注意:同一配置中不能同时使用两种类型)。这有助于简化SSL连接器的连接器实现之间的切换。

Tomcat SSL操作方法具有a section,可更深入地研究连接器之间的关系。强制NIO或NIO2使用JSSE的方法如下:

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
           port="8443" .../>

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO2 implementation -->
<Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
           port="8443" .../>

以下是配置NIO以使用OpenSSL(对于NIO2同样)的方法:

<!-- Define an HTTP/1.1 Connector on port 8443, JSSE NIO implementation and OpenSSL -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443"
           sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation"
           .../>

最后,配置APR:

<!-- Define an HTTP/1.1 Connector on port 8443, APR implementation -->
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
           port="8443" .../>