如何在 RHEL6/CentOS/SL6 上的 Apache 中获得 TLSv1.2 支持?

如何在 RHEL6/CentOS/SL6 上的 Apache 中获得 TLSv1.2 支持?

我希望我的 Scientific Linux 6(RHEL6 重建)服务器上的 Apache 能够支持 TLSv1.2。

是否有一些半支持的途径可以使其发挥作用?最好是最少的定制重建。现在我将 mod_ssl 与 open_ssl 一起使用,如 SL6 存储库中提供的那样。

编辑:一旦 TLSv1.2 支持可用,Apache 配置就会有详细的文档记录并且不会太困难。问题是 RHEL6 附带 OpenSSL 1.0.0,它仅支持 1.0 或 1.1 版本的 TLS。

答案1

我编写了一份快速指南,介绍如何从 Fedora Core 向后移植 OpenSSL 1.0.1 RPM 以支持 RHEL6 及其变体,方法是替换捆绑的 1.0.0 版本以添加 TLSv1.2 和 ECC 支持。 2013 年 9 月针对 CentOS 6.4 构建并测试:

适用于 CentOS 6 的 OpenSSL 1.0.1 RPM 指南

请注意:这是我保存最新 OpenSSL 和 OpenSSH 副本的地方。 CentOS 6.5 的改进在很大程度上减轻了对 TLS1.2 的需求,并且解决了像 Heartbleed 这样的缺陷,而这个答案将永远停留在 2013 年。不要逐字遵循以下步骤,您必须运行 1.0.1g 或更高版本。

现在有了 github:github/ptudor/centos6-openssl

我已经提供了一个补丁,我将在本指南中引用它:openssl-spec-patricktudor-latest.diff

首先,准备您的构建环境。 (如果你已经安装了 EPEL,请使用模拟。这里保持简单......)

yum -y groupinstall "Development tools" 
yum -y install rpm-build zlib-devel krb5-devel
mkdir -p $HOME/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo "%_topdir $HOME/redhat/" > ~/.rpmmacros

接下来,获取适用于 OpenSSL 的 Fedora Core 20 SRPM 和完整的 OpenSSL 源代码。

rpm -Uvh http://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/source/SRPMS/o/openssl-1.0.1e-42.fc21.src.rpm
cd ~/redhat/SOURCES/
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz.sha1
openssl dgst -sha1 openssl-1.0.1g.tar.gz ; cat openssl-1.0.1g.tar.gz.sha1

现在应用旧的 secure_getenv 语法并应用补丁:

cd ~/redhat/SOURCES/
sed -i -e "s/secure_getenv/__secure_getenv/g" openssl-1.0.1e-env-zlib.patch
cd ~/redhat/SPECS/
wget http://www.ptudor.net/linux/openssl/resources/openssl-spec-patricktudor-fc20-19.diff
patch -p1 < openssl-spec-patricktudor-latest.diff

运行构建:

time rpmbuild -ba openssl.spec

希望一切顺利,让我们安装新的 RPM:

cd ~/redhat/RPMS/x86_64/
sudo rpm -Fvh openssl-1.0.1g-*.rpm openssl-libs-1.0.1g-*.rpm openssl-devel-1.0.1g-*.rpm

确保它确实有效:

openssl ciphers -v 'TLSv1.2' | head -4

我网站上面的链接有更多详细信息,但这应该是一个很好的起点。

谢谢,享受。

20130819:生皮版本从 14 增加到 15。

20130831:fc20 修订版从 15 增加到 18。

20130906:fc20 修订版从 18 增加到 19。

20140408:1.0.1g之后的任何内容都可以访问我的网站。

答案2

我在 ServerFault 上找到了这个链接,其中介绍了 TLSv1.2 的设置。问答题为:Apache 上的 SSL/TLS 1.2 和 openssl 1.0.1

这些链接涵盖 TLSv1.2 信息:

httpd.conf假设您有 httpd v2.2 或更高版本以及 openssl 1.0.1c 或更高版本,则应在您的应启用 TLSv1.2 中包含以下内容。

SSLProtocol all -SSLv2

您仍然需要设置 CipherSuites。这就是令人困惑的地方。根据上面的文档,唯一的强制密码套件对于 TLS 1.2 是TLS_RSA_WITH_AES_128_CBC_SHA

Appendix C. Cipher Suite Definitions
Cipher Suite                            Key        Cipher         Mac
                                        Exchange
TLS_RSA_WITH_AES_128_CBC_SHA            RSA          AES_128_CBC  SHA

这表示服务器必须提供用于密钥交换的 RSA 证书,并且密码应为 AES_128_CBC 和 Mac SHA。

从 httpd mod_ssl 文档来看,这转换为:

SSLCipherSuite aRSA:kRSA:AES128-CBC:SHA  

您可以阅读有关httpd 中的 SSLCipherSuites,在这里

过去我使用过我的博客文章,标题为:在 Apache 中锁定 SSLv2为 TLSv1.1 执行此操作。该页面上的所有内容都应该仍然相关,您需要做的就是更改 CipherSuites + versions openssl

答案3

我最近正在为一位朋友在 POODLE 的背景下调查同样的问题。

如果您在 epel 上使用 2013 年 10 月起的最新 (AORN) httpd24 版本,则默认情况下您将获得 TLSv1.0 和 TLSv1.1。然而,一旦您将 apache 中的 SSLProtocol 设置为其他任何合理的值,您就会丢失这些协议,因为 httpd24 显然是针对 openssl 标头构建的。

实际上,这意味着如果您尝试显式禁用 SSlv2 或 SSlv3,则会隐式禁用 TLSv11 和 TLSv12。

当您下降到它知道的恰好 1 个协议时,这是 mod_ssl 的一个不幸的怪癖。

RedHat“软件集合”中的 httpd24 是最近构建的,不会遇到此问题,它可能是针对更高版本的 openssl 构建的(或者有一个简单的自定义补丁)

相关内容