openSUSE:安全 完美前向保密

跳转到:导航搜索

具有完美前向保密的TLS

鉴于最近关于大规模网络监控和隐私泄露的报告,网络流量加密中的一个特定功能变得更加重要且强制性,即完美前向保密 (PFS)。

由于关于PFS是什么以及可能存在的限制存在很多困惑,我们将概述与SUSE产品相关的最重要的部分。

维基百科页面 完美前向保密 提供了更多关于PFS的背景和参考资料。

在SSL/TLS握手过程中(TLS基本上是SSL版本3.1),这是建立安全连接所必需的,一个所谓的预主密钥被生成和交换。该密钥用于基于对称算法(如AES)派生加密密钥(Enc)以进行后续的安全通信。传统上,TLS在其X509证书中使用(公共)RSA密钥,这些证书会发送给客户端,以及其他内容,例如支持的对称密码列表等。客户端使用服务器的此公共RSA密钥来加密预主密钥,然后再将其发送到服务器。能够获取RSA密钥私钥的攻击者可以解密他们所持有的所有通信。即使在记录和破解密钥之间经过很长时间(几十年)。

PFS旨在改变这一点。

PFS通过临时密钥交换 (EK) 实现。这两个术语可以互换使用。EK意味着用于加密预主密钥的密钥对于每次握手都是唯一的。PFS将加密密钥交换(Kx)的过程与保护其完整性的过程分开。对于TLS,这意味着RSA仍然可以用于通过签名/验证交换的消息来保护(Au)Kx的完整性。对于传输加密密钥,使用不同的算法:Diffie Hellman (DH)。由于其临时性(密钥对于Kx是唯一的),它被称为DHE或以前的EDH,含义相同。

您可以在这里了解更多关于DH Kx的信息:DH Kx

由于现在TLS握手涉及四种不同的算法(第四种算法是用于与RSA进行签名的哈希函数(Mac),例如SHA),因此人们说使用的密码是DHE + RSA + AES + SHA 或 DHE_RSA_AES_SHA。

由于为每个新客户端动态生成新的DH密钥是一项非常昂贵的操作,因此开发了一种使用椭圆曲线密码学 (ECC) 的更快方法,该方法允许使用更短的密钥,从而加快Kx期间的计算速度,命名为ECDHE或EECDH):ECDHE

请注意,ECC本身与PFS无关。PFS仍然可以完美地工作,而无需ECC,但它会慢一些,因为它使用更大的密钥。在ECDHE或DHE中的E相对于PFS意味着临时,而不是椭圆!

其他可以替代RSA用于Au的算法是DSS或ECDSA。

可用性

要检查您的OpenSSL安装支持哪些密码,可以使用openssl程序。OpenSSL API允许诸如apache之类的程序设置首选密码列表。默认情况下,OpenSSL会自行对其进行排序,但您可以选择适当的密码列表来强制使用PFS。对于配置其Web服务器以使用PFS的远程站点,一个示例连接显示

user@host:~> openssl s_client -connect www.ccc.de:443
[...]
SSL handshake has read 4818 bytes and written 646 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 4096 bit
[...]

DHE-RSA-AES256-SHA 显示使用了临时DH,这是PFS。


SUSE Linux Enterprise 11当前安装了openssl版本0.9.8j,该版本支持Diffie Hellman Kx (DHE),使其能够使用PFS,即使不支持ECC。您可以使用openssl命令检查此设置

user@sle11-sp1:~> openssl ciphers -v
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA1
CAMELLIA256-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(256) Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
DES-CBC3-MD5            SSLv2 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=MD5 
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA1
CAMELLIA128-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA1
RC2-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=RC2(128)  Mac=MD5 
RC4-SHA                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=SHA1
RC4-MD5                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5 
RC4-MD5                 SSLv2 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5 
EDH-RSA-DES-CBC-SHA     SSLv3 Kx=DH       Au=RSA  Enc=DES(56)   Mac=SHA1
EDH-DSS-DES-CBC-SHA     SSLv3 Kx=DH       Au=DSS  Enc=DES(56)   Mac=SHA1
DES-CBC-SHA             SSLv3 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=SHA1
DES-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=DES(56)   Mac=MD5 
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=RSA  Enc=DES(40)   Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=DSS  Enc=DES(40)   Mac=SHA1 export
EXP-DES-CBC-SHA         SSLv3 Kx=RSA(512) Au=RSA  Enc=DES(40)   Mac=SHA1 export
EXP-RC2-CBC-MD5         SSLv3 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
EXP-RC2-CBC-MD5         SSLv2 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
EXP-RC4-MD5             SSLv3 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
EXP-RC4-MD5             SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export


openSUSE 12.2及更高版本使用openssl 1.0.1,因此支持TLS版本1.0到1.2,以及DHE和ECDHE等。

Apache配置

SSL Vhost有一个设置,可以通过指定SSLCipherSuite来限制可用的加密密码。

当前模板中建议的字符串是

SSLCipherSuite ALL:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!MD5:@STRENGTH

对于当前的openSUSE和SUSE Linux Enterprise Server,请遵循以下Qualys博客文章Mozilla服务器端TLS推荐页面中的说明。

您可以在此处找到可以为SSLCipherSuite指定的密码列表

您可以使用openssl命令行工具在本地机器上验证使用的密码,

openssl ciphers -v 'kEDH:ALL:!kRSA:!ADH:!RC4:!LOW:!EXP:HIGH:!MD5:!aNULL:@STRENGTH'

DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA1
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA1
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1

限制

PFS中的P实际上并不完美。即使之前说过攻击者无法解密在RSA密钥被破坏之前记录的会话,但仍然存在一些陷阱

如果攻击者可以解决DH Kx所基于的底层离散对数问题,他们可以反向解密记录的会话。PFS仅保护您免受服务器RSA密钥泄露的影响。

同样,如果使用的对称算法是单个DES,即使PFS也无法保护您。上述密码套件通过!LOW!EXP规范排除了此类弱密码。

PFS不能防止中间人 (MoaS) 或中间人 (MiM) 攻击,因为DH发生在攻击者处,而不是合法的端点。因此,攻击者在握手发生时已经拥有预主密钥。为了防止此类攻击,您必须设置自己的证书颁发机构 (CA),正如最近明确的那样,公共CA很容易受到其司法管辖区的强制,以签署错误/恶意证书,并且网络流量确实被重新路由以进行此类攻击:petrobras


参考资料