如何在 Apache 上默认启用完美前向保密?

Posted

技术标签:

【中文标题】如何在 Apache 上默认启用完美前向保密?【英文标题】:How do I enable perfect forward secrecy by default on Apache? 【发布时间】:2013-06-22 22:05:27 【问题描述】:

警告:请仅使用以下答案中的 Apache 配置建议。使用哪些密码 - 安全规范会随着时间而变化,以下一些安全建议已经过时。

在最近发生的事件之后,我一直在重新考虑我的 Apache 设置。目前,我的 apache 站点配置如下所示:

 <IfModule mod_ssl.c>
    <VirtualHost *:80>
            ServerName example.com
            ServerAlias www.example.com
            Redirect permanent / https://example.com
    </VirtualHost>

    <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            ServerName example.com

            DocumentRoot /var/www-wordpress
            <Directory />
                    Options FollowSymLinks
                    AllowOverride None
            </Directory>
            <Directory /var/www-wordpress>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride FileInfo
                    Order allow,deny
                    allow from all
            </Directory>

            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
            <Directory "/usr/lib/cgi-bin">
                    AllowOverride None
                    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                    Order allow,deny
                    Allow from all
            </Directory>

            ErrorLog $APACHE_LOG_DIR/error.log
            LogLevel warn

            CustomLog $APACHE_LOG_DIR/ssl_access.log combined
            SSLCertificateFile    /etc/ssl/certs/example.com.crt
            SSLCertificateKeyFile /etc/ssl/private/example.com.key
            SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem
            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
            </Directory>

            BrowserMatch "MSIE [2-6]" \
                    nokeepalive ssl-unclean-shutdown \
                    downgrade-1.0 force-response-1.0
            BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>

我必须做些什么来支持完美的前向保密?如何默认启用 SSL 完美前向保密?我怎么能强制执行?

【问题讨论】:

+1。我认为很难获得良好的配置,因为 SSLv3 / TLS v1 容易受到 BEAST 的攻击,这意味着您应该选择弱 RC4 而不是任何基于 CBC 的密码(如 AES)。使用 TLS v1.1 或 v1.2、OTOH 时,最好使用更强的密码,如 AES。 AFAIK,Apache 不允许您根据协议版本有条件地选择密码。浏览器对 TLS v1.1+ 的支持仍然很弱(Firefox 还没有。)密码业务与在密钥交换中具有完美的前向保密性是正交的(我认为),但希望看到一个可以接受它的配置都考虑在内。 DHE 和 ECDH 密钥交换提供完美的前向保密。几乎所有浏览器都支持 DHE,而 ECDH 至少需要 TLSv1.1 和相当现代的浏览器。但是,与普通 RSA 密钥交换相比,DHE 密钥交换大约为 three times slower。 请注意“在最近发生的事件之后”如何始终保持最新状态。 Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Web Applications Stack Exchange、Webmaster Stack Exchange 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 【参考方案1】:

怎么样:

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5

注意添加 -SSLv3 标志以禁用 SSLv3。这是为了防止POODLE attack 而添加的。

这将更喜欢完美的前向保密,但不会以易受 BEAST 攻击为代价。由于 Apache 缺乏基于协议版本配置密码首选项的方法,我通过引用仅在较新协议中可用的密码来伪造它。具体来说,在 TLSv1.2 之前,AES 仅适用于 SHA1 散列。因此,该列表以 TLSv1.2 临时 Diffie-Hellman 密码开始,然后是 RC4(首先使用临时 DH,然后没有),最后是 BEAST 易受攻击的 AES 选项。最后排除无身份验证/弱加密/弱散列只是为了良好的卫生,可以省略,因为没有引入这样的密码。如果性能是一个问题,请仅使用 EECDH 并忽略 EDH。

结合 Apache 2.2(因此没有 @Bruno 所说的 EECDH),根据 https://www.ssllabs.com/ssltest/analyze.html,这仅实现了 ios Safari 的 PFS。 IE 和 Firefox 是 TLSv1.0,所以他们使用 RC4 来避免 BEAST。 (唉,没有像 EDH RC4 这样的东西,所以没有 EECDH,你就放弃了 PFS)。我相信,对于 Apache 2.2 上的那些浏览器来说,这是最好的希望。 Chrome 是唯一一个服务不佳的,因为它支持 TLSv1.1 并且可以使用 EDH AES 而不会受到 BEAST 的攻击。相反,它像 Firefox 和 IE 一样获得 RC4-RSA。升级 Apache 以启用 EECDH RC4 应该会获得适用于 Firefox、IE 和 Chrome 的 PFS。

2013 年 11 月 9 日更新:

我在网上找到了一些替代建议。他们较少强调 BEAST 保护(也许是明智的;BEAST 是 mostly mitigated client-side now),而更加强调完美的前向保密。他们在不同程度上也对 GCM 有更强的偏好,更不愿意接受 RC4。

我认为特别值得注意的是以下建议:

Mozilla OpSec Ivan Ristic (Qualys) Geoffroy Gramaize

就我个人而言,我会选择 Mozilla OpSec 的。他们的推理在他们的页面上得到了很好的解释。值得注意的是,他们更喜欢 AES128 而不是 AES256。用他们的话说:“[AES128] 提供了良好的安全性,速度非常快,而且似乎更能抵抗定时攻击。

Ivan Ristic 和 Geoffroy Gramaize 的建议中值得注意的是禁用 SSLv3。我认为这主要只是破坏了 IE6,尽管 SSLv3 和 TLS v1.0 之间的一些安全相关差异是mentioned on Wikipedia。

在我没有谈论CRIME 和BREACH 之前。要防止犯罪,请禁用 SSL 压缩。这包含在链接的示例中。要防止 BREACH,您需要在 HTTP 级别禁用压缩。对于 Apache 2.4,只需在全局范围内执行一次:

<Location />
  SetEnvIfExpr "%HTTPS == 'on'" no-gzip
</Location>

对于旧版本的 Apache,将其放置在 SSLEngine 所在的每个 VirtualHost 中:

<Location />
    SetEnv no-gzip
</Location>

2014 年 10 月 14 日更新: Mozilla OpSec 指南现在分为旧/中/现代兼容性建议。使用中级或现代的设置,您最终会禁用 SSLv3。这将防止 POODLE 攻击。

【讨论】:

两个问题洛林。为什么不SSLProtocol all -SSLv2 -SSLv3?为什么不AESGCM? TLS1.0 的采用率似乎接近 100% (Transport Layer Security)。 嗨 noloader,好问题。添加-SSLv3 是个好主意。我不知道有任何可以防范的特定漏洞,但如果您禁用 SSLv3,Qualys SSL 实验室确实会为您提供略高的协议分数。 (而且他们比我知道的更多!)AESGCM 是多余的:像EECDH+AES 这样的术语可以使用 EECDH 密钥交换和 AES 密码,包括有和没有伽罗瓦/计数器模式 (GCM) 的变体.您可以在命令行上自己验证这一点:openssl ciphers -v 'EECDH+AES:...&lt;rest of cipher suite string&gt;' 将包含 GCM 变体。 谢谢 Lorrin,最后一个问题。我们不希望AESGCM首先确保它,然后再帮助确保它的用户,比如AEC-CBC吗?例如,EECDH+AESGCM:EECDH+AES:.... 如果您知道自己更喜欢 GCM,那么,是的,首先明确列出它是有意义的。我相信您不会指定并遵循 openssl 默认值,无论如何您都会首先获得它。 当我将此设置添加到我的 apache 2.4.16 服务器时,我的 ssl 等级从 A- 降级为 B,因为它支持弱的 RC4。我必须恢复设置以提高我的域的 ssl 评级。您可以使用此在线工具尝试您的域。 ssllabs.com/ssltest/analyze.html【参考方案2】:

根据我自己的理解,您需要激活SSLHonorCipherOrder 并在SSLCipherSuite 前面加上来自openssl ciphers -vECDHEDHE 密码

来自我的/etc/apache2/mods-available/ssl.conf

SSLHonorCipherOrder on
SSLCipherSuite ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA128-SHA:AES128-SHA:RC4-SHA:HIGH:!aNULL:!MD5:!ADH

要测试您的网站,您可以使用:https://www.ssllabs.com/ssltest

注意:椭圆曲线 DHE 似乎只适用于 Apache 2.3.3 或更高版本(请参阅 source 和 Bruno 的评论)。

【讨论】:

非 EC DHE 密码套件可与 Apache Httpd 2.2(以及可能的更低版本)完美配合。【参考方案3】:

提供完美前向保密的密码套件是那些使用 短暂 形式的 Diffie-Hellman 密钥交换的密码套件。它们的缺点是开销,可以通过使用椭圆曲线变体来改善(参见Vincent Bernat's blog。)

Apache Httpd 中的密码套件(前提是您使用的是使用 OpenSSL 编译的 mod_ssl)使用 SSLCipherSuite 配置,它采用您在使用 openssl ciphers 命令时看到的列表。如果您查看OpenSSL man page,您会发现kEDH 就是您要查找的内容。 (您也可以单独列出密码套件。)

【讨论】:

【参考方案4】:

在 httpd.conf 的 main/core conf 指令中输入此密码:

SSLCipherSuite AES128+EECDH:AES128+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off 
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 

您甚至可以通过在https://www.ssllabs.com/ssltest/analyze.html 上测试它来检查它的安全状态?

【讨论】:

【参考方案5】:

在你的 ssl.conf 中试试这个代码:

SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1
SSLCompression off
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:CAMELLIA128-SHA

顺便说一句,

专家提示:(1/n-1) 拆分记录技巧在 Firefox 中实现了一段时间。因此,您可以在高级配置菜单中安全地禁用 Firefox 上的 RC4。为此,请在地址栏中输入“about:config”,然后搜索“rc4”并将所有找到的值切换为“false”。如果您遇到连接问题,请将这些参数切换回 true。

https://cc.dcsec.uni-hannover.de/

该网站为您提供有关您的浏览器支持用于保护 HTTPS 连接的 SSL 密码套件的信息。

【讨论】:

【参考方案6】:

看看https://cipherli.st

在那里你可以找到一些服务的复制和粘贴配置 sn-ps,这应该可以确保强大的 ssl 安全设置。

【讨论】:

【参考方案7】:

本文将帮助您配置前向安全性并让您了解当前标准 - https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy

截至 2015 年 9 月 16 日,这将使您在 SSLLabs 测试结果上获得 A。

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4

【讨论】:

【参考方案8】:

我在SSLLabs 上获得了 A 级(2016 年 9 月),仍然支持 Windows XP / Internet Explorer 8,在 Apache 上使用此 ssl.conf 配置:

SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:AES256+EECDH:DES-CBC3-SHA

简而言之:仅允许TLS:支持所有版本以实现兼容性,并且也允许 DES-CBC3-SHA 密码以实现兼容性。第一个,首选的两个密码使用Elliptic curve Diffie-Hellman,最后一个被添加为备用,因为这个a good option among the ciphers available XP/IE。如果您安装了可用的最后一个 OpenSSL 版本,那么在我撰写本文时,这种组合足以获得 A。

希望这有帮助。

【讨论】:

以上是关于如何在 Apache 上默认启用完美前向保密?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu Apache 中启用错误日志

testssl.sh--检查 SSL/TLS 服务器的加密

使用python语言如何保密源代码以防止逆向工程?

如何在 Apache2 服务器上启用日志级别调试 [关闭]

如何在 Apache 中停用通知?

如何在 apache 服务器上正确启用 mod_status?