我在一台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,否则我认为可以肯定地说,您不会受到攻击。