LibreSSL是一款用于SSL与TLS协议的开源实现,它fork自OpenSSL,还是由OpenBSD项目团队开发,旨在改进安全性,取出陈旧废气的代码以提升软件的质量,自2014年7月份发布以来已经有了一个念头。从那段时间以来,OpenSSL就不断爆出安全问题,其中不少就是由于还在使用陈旧、含有bug的代码所致;所以LibreSSL发布以来笔者便一直关注开发进度,最近在Gentoo Linux下折腾,已经完整地将OpenSSL替换为LibreSSL,借此机会分享一下替换与使用中的一些问题;其中参考了一位在LibreSSL发布次日便作出尝试的勇士

LibreSSL的主要变更

注意:并不需要全局打开libressl的USE,这里采取的是替换。

相对于OpenSSL,LibreSSL的主要变化是去除了陈旧地功能与操作系统支持,最常见的两个是

安装LibreSSL

portage中有keywords mask掉的libressl,直接替换会有诸多问题,这时需要从Gentoo LibreSSL Overlay里获取LibreSSL以及针对其修复过的ebuild。

/etc/portage/repos.conf中加入

[libressl]
master = gentoo
locations = /usr/local/overlays/libressl
sync-type = git
sync-uri = https://github.com/gentoo/libressl
auto-sync = yes

然后同步一下portage

$ emaint -r libressl sync

由于OpenSSL是一个非常基础的库,所以其他ebuild多数会直接写明依赖dev-libs/openssl,这时就需要使用overlay里准备好的一个“空”的版本为9999的openssl,它依赖dev-libs/libressl

为了确保安装时不会产生文件冲突,我们先删除openssl。

$ emerge -C dev-libs/openssl

portage会提示由于其他软件需要使用libssl.so libcrypt.so等文件所以予以保留,并尽快重新编译依赖这些动态链接库的软件包。

$ emerge -pvt @preserved-rebuild

即可,常见的软件包在overlay中已做相应的补丁处理。当然还有一些例外。

常见问题

这个空的openssl包USE并不是和原来的一模一样,会出现USE不满足的情况始终过不去,例如zlib,尝试使用笔者的版本(撰写时尚未被上游接受)。

当然,还有编译不过的软件包

www-server/apache

编译时会抱怨缺少定义ENGINE_CTRL_CHIL_SET_FORKCHECK,网上已有补丁解决

这里

net-misc/socat

这里

net-misc/nodejs

很遗憾,NodeJS的开发者并不认为应该支持LibreSSL,因为2.0以上吃上了OpenSSL 1.0.2的分支,导致和LibreSSL有较大的差异。(LibreSSL fork自OpenSSL 1.0.1g分支);不过幸运的是NodeJS的0.12分支仍旧可以使用。

如果还有其他编译不过

可以尝试看看笔者的fork是否已有修复而尚未被overlay上游接受。

如果还是不行,那么可能发现一个需要改进的软件包,这就需要一些C语言技巧了(相信不是大的问题),参考FreeBSD中的做法进行修改。

常见的有

  • RAND_egd

所有相关的都加上预处理条件

#ifndef OPENSSL_NO_EGD
   RAND_egd("/some/file");
#endif
  • SSL压缩

如果遇到这种情况,很可能是软件本身没有检查压缩的支持或者干脆用错了判断条件

改成

#include 
#include 
#ifdef SSL_NO_COMP
#define OPENSSL_NO_COMP
#endif

或者干脆拿下

#ifndef OPENSSL_NO_COMP
   /* Offending code */
#endif

最重要的:把补丁提交到overlay中,让我们一起改进软件。

最后

笔者并没有把家里的服务器给替换掉原因是怕几个服务软件都需要重新改补丁,比如dovecot啥的,下次有时间了再折腾;先把手头

参考资料

__END__