使用APR和OpenSSL解决Tomcat上的心脏出血问题.编译错误



我在一台Windows机器上运行TeamCity,该机器使用Tomcat作为web服务器,并使用Apache Portable Runtime(APR)和OpenSSL进行SSL。

我还没有成功地将OpenSSL版本升级到1.0.1g,我认为原因是Tomcat本地库二进制文件(tcnative-1.dll)(http://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.1.29/binaries/tomcat-native-1.1.29-win32-bin.zip)包含APR和OpenSSL的1.0.1e版本,并且我找不到1.0.1.g.的新二进制文件

我曾尝试自己编译Tomcat本机库,但在编译"libapr"项目时遇到编译错误。

我得到的编译错误是:

Error   4   error LNK2019: unresolved external symbol __InterlockedIncrement referenced in function _apr_atomic_inc32@4 C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprapr_atomic.obj   libapr
Error   5   error LNK2019: unresolved external symbol __InterlockedExchangeAdd referenced in function _apr_atomic_add32@8   C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprapr_atomic.obj   libapr
Error   6   error LNK2019: unresolved external symbol __InterlockedExchange referenced in function _apr_atomic_set32@8  C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprapr_atomic.obj   libapr
Error   7   error LNK2019: unresolved external symbol __InterlockedDecrement referenced in function _apr_atomic_dec32@4 C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprapr_atomic.obj   libapr
Error   8   error LNK2019: unresolved external symbol __InterlockedCompareExchange referenced in function _apr_atomic_cas32@12  C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprapr_atomic.obj   libapr
Error   9   error LNK1120: 5 unresolved externals   C:Usersheartbleedtomcat-native-1.1.29-win32-srcjniaprDebuglibapr-1.dll   1   1   libapr

我正在尝试使用Visual Studio Ultimate 2013进行编译(可能是Visual Studio的新版本?)。

如何解决此问题?

有人用OpenSSL 1.0.1.g成功地构建了Tomcat本机库吗?

更新

我已将"平台工具集"设置为v100(如这里所建议的https://groups.google.com/forum/#!topic/UniMRCP/Iybpn51UYnI),以前的编译错误消失了,但现在我得到了新的错误:

Error   9   error C1083: Cannot open include file: 'apr.h': No such file or directory   C:Usersheartbleedtomcat-native-1.1.29-win32-srcjninativeincludetcn.h 26  1   tcnative

更多更新

我确实解决了编译问题,并用OpenSSL 1.0.1g构建了一个tcnative-1.dll,我的TeamCity已经修复了Heartbleed问题!我现在很忙。但是,请询问您是否想要详细的程序描述。

这就是我所做的。

我从Visual Studio 2013开始。

安装Visual C++2010学习版(http://go.microsoft.com/?linkid=9709949)。

安装OpenSSL(http://slproweb.com/products/Win32OpenSSL.html),我选择了"Win32 OpenSSL v1.0.1g"。

下载Tomcat本机(http://apache.mirrors.spacedump.net//tomcat/tomcat-connectors/native/1.1.29/source/tomcat-native-1.1.29-win32-src.zip)把它提取到某个地方。

下载APR源代码(http://apache.mirrors.spacedump.net//apr/apr-1.5.0-win32-src.zip)将其提取并移动到目录"tomcat-nameactive-1.1.29-win32-src/jni"中。将其从"apr-1.5.0"目录重命名为"apr",这样在"jni"文件夹中就有了一个"apr"文件夹。

在Visual Studio 2013中打开"tomcat-nameactive-1.1.29-win32-src/jni/native/libtcnnative.dsw"。它将进行一些转换。

从"调试"更改为"发布"。

对于"apr"one_answers"tcnative"项目。右键单击它们,进入属性->配置属性。将"平台工具集"设置为"v100"。

右键单击"tcnative",单击属性->配置属性->C/C++->其他包含目录->编辑

  • 将"./srclib/apr/include"更改为"../apr/includ"
  • 将"./srclib/apr/include/arch/win32"更改为"../apr/include/arch/win.32"
  • 添加"C:\OpenSSL-Win3\include"(或安装OpenSSL的任何位置)

转到配置属性->链接器->输入->附加依赖项->编辑

  • 将"libeay32.lib"更改为"libeay22MT.lib"
  • 将"ssley32.lib"更改为"ssley32MT.lib"

转到配置属性->链接器->其他库目录->编辑。

  • 添加"C:\OpenSSL-Win32\lib\VC\static"(或安装OpenSSL的任何位置)

右键单击tcnative,然后单击Build。

构建完成后,您将找到"tcnative-1.dll"

在"tomcat-nactive-1.1.29-win32-src\jni\native\LibR"

目前,tcnative团队已经完成了下一个版本的工作,该版本中包含了Heartbleed修复程序。因此,可以从最新的带有Heartbled修复程序的tcnative中获得该版本

这个版本将很快正式发布。

Apache Tomcat 7.0.53(最新版本)在使用Tomcat Native时易受Heartbleed攻击(请检查tcnative-1.dll是否在bin文件夹中。如果下载Tomcat Windows二进制文件,则会出现这种情况)。

您可以在以下位置找到Windows(x86和x64)的二进制文件http://people.apache.org/~mturk/native/1.1.30/binary/.

我希望他们能很快在http://tomcat.apache.org/download-native.cgi.

只需下载DLL文件,将其放入Tomcat/bin文件夹,重新启动Tomcat,就完成了。

要验证修复,请检查文件catalina.log:

Apr 11, 2014 8:39:27 AM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized (OpenSSL 1.0.1g 7 Apr 2014)

自OpenSSL 1.0.1f以来,Heartbleed修复程序就一直在OpenSSL中。

现在是我构建的dll:https://docs.google.com/file/d/0B4GOp0amHg-0SU5GXzZuM2lJT3c/edit

我相信Tomcat不会受到开箱即用的Heartbleach攻击。

是的,APR库已链接,SSLEngine已打开。

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

但是,如果查看默认Tomcat部署的server.xml配置文件,其SSL连接器使用JSSE,而不是APR库。

<!-- Define a SSL HTTP/1.1 Connector on port 8443
     This connector uses the BIO implementation that requires the JSSE
     style configuration. When using the APR/native implementation, the
     OpenSSL style configuration is required as described in the APR/native
     documentation -->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->

所以它不应该通过Heartbleed进行爆炸。除非您手动更改SSL连接器以使用APR,否则我认为可以肯定地说,您不会受到攻击。

最新更新