我正在尝试同时升级 Apache 和 OpenSSL。我已经用我需要的所有模块编译了 Apache,它弹出并运行,但仍然显示旧版本的 OpenSSL。
这是我的配置命令:
./configure --prefix=/usr/local/apache2.2.24/ --with-ssl=/usr/local/openssl-1.0.1e/ --enable-mods-shared="all [sic] ssl rewrite"
该目录中的 OpenSSL 是正确的:
$ /usr/local/openssl-1.0.1e/bin/openssl version
OpenSSL 1.0.1e 11 Feb 2013
然而,当我查询服务器时,我仍然在标头中收到旧版本的 OpenSSL:
$ curl -I http://www.mydomain.com/
HTTP/1.1 200 OK
Date: Thu, 09 May 2013 14:51:59 GMT
Server: Apache/2.2.24 (Unix) DAV/2 mod_ssl/2.2.24 OpenSSL/1.0.0g
在过去的几天里,我已经重新编译了几百次,但还是搞不清楚我遗漏了什么。每个目录都已被删除并从头开始创建(包括我正在编译的源目录)。
该系统是旧版本的 FreeBSD,ports
安装已损坏,因此我无法使用端口进行编译。
答案1
首先,修复您的 PORTS -rm -rf /usr/ports
如果需要的话。这不会损害已安装的软件。使用portsnap
可轻松获取新的 ports 树副本。高级用户可以使用svn
。
其次,不要从下载的源代码编译 Apache。您只会自找麻烦,而且您不应该对遇到麻烦感到惊讶。使用 ports 树。即使您想使用 Ports 树中不同版本的软件,也要学习如何修改本地树以获得所需的版本。
针对 mod_ssl.so 文件运行ldd
,因为您正在编译下载的源,所以安装方向可能是非标准的(这意味着您系统的未来管理员将无法轻松找到该目录)。
查看它正在使用什么 libssl.so,以及它将从哪里加载。确保在该位置拥有最新的 OpenSSL 库。
当您从 ports 构建 Apache 时,它应该始终针对 OpenSSL 的 ports 安装版本(libssl.so in /usr/local/lib
)进行构建。由于情况并非如此,因此任何人都无法猜测它正在加载什么。
答案2
您可能要考虑修复您的 ports collection。如果您运行的是不受支持的版本,您可能无法获取所需 ports 的最新版本。否则,您可以按照手册中的说明获取最新portsnap
的 ports collection。
答案3
一种解决方法是在配置 apache 时使用 rpath,即:
$ LDFLAGS=-Wl,-rpath=/opt/openssl/lib ./configure ...
安装apache后验证:
$ ldd /opt/apache-httpd/modules/mod_ssl.so
...
libssl.so.1.0.0 => /opt/openssl/lib/libssl.so.1.0.0 (0x00007fdd56278000)
libcrypto.so.1.0.0 => /opt/openssl/lib/libcrypto.so.1.0.0 (0x00007fdd55e9c000)
...