博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LibreSSL替代OpenSSL
阅读量:4167 次
发布时间:2019-05-26

本文共 3403 字,大约阅读时间需要 11 分钟。

2016 年 3 月初 OpenSSL 再次爆出与 2014 年的同样严重的新漏洞——!在获悉这一消息的时候第一时间我去看 LibreSSL 有没有受影响,正如所料——没有(见下图)!这让我觉得 LibreSSL 取代 OpenSSL 更加必要。

LibreSSL 不受 DROWN 攻击影响

关于 DROWN 溺亡漏洞如果还没了解过,可以参考:

LibresSSL 是什么

大家可能对 不够熟悉,但对它的LibreSSL favicon——心脏滴血恐怕会相当熟悉。你没看错,就是 OpenSSL 心脏出血漏洞的图标。它是 开发者在 OpenSSL 爆出心脏出血漏洞之后 fork 的一个分支,旨在提供一个比 OpenSSL 更安全的替代品。OpenBSD 是一个以安全著称的操作系统,LibreSSL 遵循其他 OpenBSD 项目的安全指导原则。

LibreSSL 与 OpenSSL 都是和(TLS,Transport Layer Security)协议的开源实现,如需了解 TLS 可参见其或自行搜索。

字面上看,LibreSSL 有两种断词方式:

  • Libre-SSL,Libre 来自拉丁语,意为“自由”,大家应该并不陌生,因为 LibreOffice 已经事实上取代了 OpenOffice,没准 LibreSSL 也会有这一天。
  • Lib-Re-SSL,即重新实现的 libssl。

LibreSSL 更安全吗

当然

如上所述,OpenBSD 当初创立这个项目就是为了能够避免再出现像 Heartbleed 这样的严重漏洞。而它不受 DROWN 影响也说明了它的努力没有白费,参见 。

如果去看 LibreSSL 的 Release Note,会发现有不少 OpenSSL 的漏洞对于 LibreSSL 根本不存在,比如 ,见下图:

LireSSL 2.1.4 Release Note

红线所标的标题下的 CVE 分别在 LibreSSL 早期版修复或者对于 LibreSSL 根本不存在。

另外还可以参考 :

FreeBSD wiki 上的漏洞比较

很明显,LibreSSL 的漏洞数与严重程度要比 OpenSSL 少的多、轻的多。

能够取代 OpenSSL 吗

要分情况

有些发行版已经将原有的 OpenSSL 替换为 LibreSSL 了,知名的有:

在以上这些系统中应该除了实测必须要用 OpenSSL 软件外,应该都可以用 LibreSSL 取代 OpenSSL。

而对于其他大多数还没有将系统自带的 OpenSSL 替换为 LibreSSL 的会麻烦一些,并且也可能做不到彻底替换。只是对于编译安装的软件,可以尽量用 LibreSSL 取代 OpenSSL。

编译示例

以下示例的参考系统为 CentOS 7 和 Ubuntu 16,分别作为 RedHat 系、Debian 系发行版的代表。通常网站的 HTTPS 证书配置在 或 上,因此编译二者时用 LibreSSL 取代 OpenSSL 对于网站安全性的价值更大一些,下文就以它们为例。

删掉 OpenSSL 开发包

注意,要删掉的是开发包,换句话说,以 -devel 或者 -dev 结尾的,不要把基本包也删了。

  • CentOS 7:yum erase openssl-devel可能会删掉 mysql-devel 等开发包,不要在已经使用的机器上做测试。
  • Ubuntu 16:apt remove libssl-dev不要在已经使用的机器上做测试。

编译安装 LibreSSL

确保已安装 gcc、wget、make,如果未安装请分别按以下方式安装:

  • CentOS 7:yum install -y gcc wget
  • Ubuntu 16:apt install -y gcc make

编译安装 LibreSSL:

wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.5.4.tar.gztar xvf libressl-2.5.4.tar.gzcd libressl-2.5.4./configure --prefix=/usr/localmakemake install

确保 /usr/local/lib 已经在 ld.so.conf 中或者 ld.so.conf.d/*.conf 中。如果未在可通过 echo /usr/local/lib > /etc/ld.so.conf.d/local.conf 来添加。然后更新缓存,并查看 libressl 的 libssl.so 版本

ldconfigldconfig -v | fgrep libssl

主版本号至少两位数,例如

libssl.so.43 -> libssl.so.43.0.2

这个是 LibreSSL 的,主版本号比较小的是系统自带的。

编译安装 Nginx

确保 pcre、zlib 的开发库已安装,如果未安装请分别按以下方式安装:

  • CentOS 7:yum install -y pcre-devel zlib-devel
  • Ubuntu 16:apt install -y zlib1g-dev libpcre3-dev

编译安装 Nginx(当前最新稳定版为 1.12.0):

wget http://nginx.org/download/nginx-1.12.0.tar.gztar xvf nginx-1.12.0.tar.gzcd nginx-1.12.0./configure --with-http_ssl_modulemakemake install

验证:ldd /usr/local/nginx/sbin/nginx | fgrep ssl 的输出应该是这样的:

libssl.so.43 => /usr/local/lib/libssl.so.43 (0x00007f4fc5684000)

编译安装 HaProxy

需要使用 2.4.5 版 LibreSSL,目前最新稳定版的 LibreSSL 与目前最新稳定版的 HaProxy 不兼容。

wget http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.4.5.tar.gztar xvf libressl-2.4.5.tar.gz cd libressl-2.4.5/./configure --prefix=/usr/localmakemake installldconfig

编译安装 HaProxy(目前最新稳定版为 1.7.5):

wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.5.tar.gztar xvf haproxy-1.7.5.tar.gzcd haproxy-1.7.5make TARGET=linux \    USE_ZLIB=1 \    USE_PCRE=1 \    USE_OPENSSL=1 \    SSL_INC=/usr/local/include \    SSL_LIB=/usr/local/libmake install

验证:ldd /usr/local/sbin/haproxy | fgrep ssl 应该输出:

libssl.so.39 => /usr/local/lib/libssl.so.39 (0x00007fd34408f000)

存在问题

有些软件可能用了兼容性不好的 OpenSSL API,需要实测下用 LibreSSL 取代后的兼容性如何,比如 HaProxy 与 LibreSSL 2.4.5 兼容,但是与目前最新版 2.5.4 一起编译会有问题。

未来展望

从 LibreSSL 与 OpenSSL 安全漏洞数量及严重程度的对比来看,LibreSSL 要安全很多,从目前来看也应该用 LibreSSL 来取代 OpenSSL。

但是与 OpenSSL 一样,LibreSSL 也是用 C 语言开发的,而由于语言本身的局限性,C 语言无法为内存安全提供良好的保障。可以说像 TLS 支持这样的重视安全且用于安全领域的底层库用 C 语言开发并不适合。目前来看,对于这一领域的首选开发语言当属 ,并且已经有一些进展,比如 ,当然距离成熟稳定乃至流行起来还有很多路要走。

转载;。

你可能感兴趣的文章
Activity类中7个与活动生命周期回调有关的方法
查看>>
jwt与token+redis,哪种方案更好用?
查看>>
Comparator接口
查看>>
在二叉树中找到一个节点的后继节点
查看>>
寻找第K大
查看>>
String.trim
查看>>
缓存行 伪共享
查看>>
400 : perceived to be a client error 错误
查看>>
Establishing SSL connection without server's identity verification is not recommended
查看>>
扫描包不存在:pojo类找不到
查看>>
c语言中计算数组长度的方法
查看>>
java 数组定义
查看>>
java中的&和&&的区别
查看>>
Java的位运算符
查看>>
BufferedReader与Scanner的区别
查看>>
java String于常量池中的介绍
查看>>
java Text 错误: 找不到或无法加载主类 Text
查看>>
XShell连接ubantu:给ubantu安装ssh
查看>>
c语言的null和0
查看>>
二进制详解:世界上有10种人,一种懂二进制,一种不懂。
查看>>