openvpn,选项 tls-cipher 不起作用,没有共享密码

cof*_*kid 5 openvpn tls

在尝试设置 openvpn 时,我在网站上偶然发现了这个技巧。它说您可以限制密码列表,以防止降级攻击。我在有 2 台计算机的局域网中测试它,两台计算机都运行带有 OpenVPN 2.3.2 的 kubuntu 14.04。

在 openvpn 服务器上的 server.conf 中,我插入了这一行

tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256

通过执行openvpn --show-tls和比较输出,我确信上面一行中的每个密码都是我的 openvpn 版本(在服务器和客户端上)知道的。

但是当我随后启动 openvpnserver 和客户端时,服务器给了我以下输出

Fri Sep 25 12:31:59 2015 "THECLIENTSIP":38749 TLS: Initial packet from [AF_INET]"THECLIENTSIP":38749, sid=d9c33d37 653b2f0e Fri Sep 25 12:32:00 2015 "THECLIENTSIP":38749 TLS_ERROR: BIO read tls_read_plaintext error: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher Fri Sep 25 12:32:00 2015 "THECLIENTSIP":38749 TLS Error: TLS object -> incoming plaintext read error Fri Sep 25 12:32:00 2015 "THECLIENTSIP":38749 TLS Error: TLS handshake failed Fri Sep 25 12:32:00 2015 "THECLIENTSIP":38749 SIGUSR1[soft,tls-error] received, client-instance restarting 没有那个 tls-cipher 选项它工作正常。

我不明白为什么它说“没有共享密码”。列出用冒号分隔的密码是错误的吗?或者这里有什么问题?

谢谢你的阅读。我希望任何人都可以帮助我。

编辑 我替换了 server.conf 中的行, tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256 看看会发生什么。和openvpn服务器的输出是一样的。

编辑 2

我进一步搜索并找到了这个站点https://community.openvpn.net/openvpn/wiki/Hardening ,现在了解到 OpenVpn 2.3.2 只支持 SSLv3/TLSv1.0 密码套件。但openvpn --show-tls也显示了 TLSv1.2 密码套件

限制为 TLSv1.0 DHE + RSA 选择产生以下列表,适用于 <=2.3.2 对等点。最好避免 DES 选择,尤其是单 DES(已知非常弱)。

TLS-DHE-RSA-WITH-AES-256-CBC-SHA

TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA

TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA

TLS-DHE-RSA-WITH-AES-128-CBC-SHA

TLS-DHE-RSA-WITH-SEED-CBC-SHA

TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA

TLS-DHE-RSA-WITH-DES-CBC-SHA

避免所有 DES 密码套件:已知 DES 非常弱(3DES-EDE 仍然很好)避免所有 RC4 密码套件:已知 RC4 很弱避免所有 EXPORT 密码套件:EXPORT 多年前被指定为弱

当我在 server.conf 中使用这些密码之一时它会起作用,例如 tls-cipher TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA

可悲的是,在那一页上没有写我自己如何才能让自己屈服......有人知道吗?

由于 TLSv1.0 是 SSLv3 并且 openvpn 说它使用 OpenSSL 我试图通过 OpenSSL 获取该信息,使用 grep 过滤 openssl ciphers -v | grep SSLv3 | grep Kx=DH 但输出不同(例如,WITH 这个词没有出现在该列表中)

假设可能只有符号不同,我试图用 sedopenssl ciphers -v | grep SSLv3 | grep Kx=DH | grep DHE-RSA | sed 's/DHE-RSA/TLS-DHE-RSA-WITH/g' | awk '{print $1}' 打印替换一些文本 :

TLS-DHE-RSA-WITH-AES256-SHA TLS-DHE-RSA-WITH-CAMELLIA256-SHA TLS-DHE-RSA-WITH-AES128-SHA TLS-DHE-RSA-WITH-SEED-SHA TLS-DHE-RSA-WITH-CAMELLIA128-SHA

但这仍然与“强化 openvpn 文章”中的列表不同,而且我不确定,如果这是正确的方法...

鼓励在此站点上使用 DHE-RSA-AES256-SHA。所以,我假设,我可以与 openvpn 2.3.2 一起使用的最安全的 tls-cipher 是 TLS-DHE-RSA-WITH-AES-256-CBC-SHA。但那个答案是从 2013 年 11 月开始的。那仍然是最好的选择吗?不知何故,这是一个不同的问题。但这完全是为了找到最安全的 tls-cipher 选项。

编辑 3 好的,我可以扩展那个 openssl-grep-sed 命令

openssl ciphers -v | grep SSLv3 | grep Kx=DH | grep DHE-RSA | sed 's/DHE-RSA/TLS-DHE-RSA-WITH/g' | sed 's/SHA/CBC-SHA/g'| awk '{print $1}'

印刷:

TLS-DHE-RSA-WITH-AES256-CBC-SHA TLS-DHE-RSA-WITH-CAMELLIA256-CBC-SHA TLS-DHE-RSA-WITH-AES128-CBC-SHA TLS-DHE-RSA-WITH-SEED-CBC-SHA TLS-DHE-RSA-WITH-CAMELLIA128-CBC-SHA

现在它与那篇文章中的列表相同,没有那个 DES 和 3DES 条目。

那么这是正确的结果吗?因为此解决方案仅基于以下假设,即 openssl -v 命令的输出和 openvpn --show-tls 命令的输出之间仅存在符号差异。

编辑 4 不抱歉,它与没有那个 DES 和 3DES 条目的那篇文章中的列表不同..现在是:

openssl ciphers -v | grep SSLv3 | grep Kx=DH | grep DHE-RSA | sed 's/DHE-RSA/TLS-DHE-RSA-WITH/g' | sed 's/SHA/CBC-SHA/g'| sed 's/AES/AES-/g' | sed 's/CAMELLIA/CAMELLIA-/g' | awk '{print $1}' 印刷:

TLS-DHE-RSA-WITH-AES-256-CBC-SHA TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA TLS-DHE-RSA-WITH-AES-128-CBC-SHA TLS-DHE-RSA-WITH-SEED-CBC-SHA TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA

但这是一种混乱的方式,不是吗?如果密码的名称列表没有增长,它只能以这种方式工作。

抱歉,如果“问题”可能令人困惑……请发表评论,非常感谢您至少花时间阅读本文!

小智 2

我认为 OpenVPN 还不支持 ECDHE - 我已经在 Debian 8.3(稳定)上尝试了 OpenVPN 2.3.4,在 Debian 测试上尝试了 2.3.10 作为服务器,当使用 ECDHE 密码套件指定 tls-cipher 时,两者都不起作用,从运行 2.3.10 的 Windows 客户端。到目前为止,只有 DHE 有效。