OpenSSL 和 pyOpenSSL 那点事

[UPDATE 2014-01-23]

解决 pyOpenSSL 的问题也不一定非得使用升级 OpenSSL 的方式,由于 OpenSSL 关联面太广,实际上可以采用安装新版 OpenSSL,在安装 pyOpenSSL 的时候指定 include 和 libs 的方式来指定使用版本的 OpenSSL。具体改一下 setup.py 中的具体对应参数即可。

PSS: 重要的放在开头,升级 OpenSSL 对系统影响较大,比如 OpenSSH 无法正常工作,算是得到的一个教训,记得同步更新相关使用到 OpenSSL 的软件

之前比较挫的很少在 64 位系统上编译东西,经常用的服务器都是 x86 的 VPS。今天因为项目需要安装 mitmproxy。这玩意对 pyOpenSSL 的需求是 0.13 以上版本,隐性要求 OpenSSL 为 0.9.8f 及以上版本。怎奈何服务器上是 0.9.8e 版本。因此需要对 OpenSSL 进行升级。因为各种原因,升级是在源码编译状态下进行的。

编译倒是挺顺畅的,./config 一下,然后直接 make && make install,替换下系统的头文件和 lib 文件。

然后开始安装 pyOpenSSL。这步也没什么错误提示,如果安装出错,那么肯定是 OpenSSL 的版本不对。

然后执行以下 mitmproxy,提示 pyOpenSSL 的 SSL.so 无法找 “SSL_get_servername” 的引用。What?编译没问题运行却提示出错了,orz。

1
ldd SSL.so

看下该文件的引用关系,发现引用了 lib64 的 libssl.so.6 和 libcrypto.so.6 文件,这两个文件是 openssl 的 shared library。切换到默认的 OpenSSL 目录下 / usr/local/ssl/lib / 文件下,发现并没有生成 so 文件。原因很明显了,是因为生成 OpenSSL 的方式是采用默认的 static 方式。

1
./config shared

这样就没有问题了。

另外还有一个值得注意的地方是在 64 位系统下默认的 lib 目录是 lib64 而不是 lib,最开始我还替换错了,还好及时发现了。

PS: 每次 Markdown 写文章,带下划线的总是忘记该,要回来修一下,蛋疼。