在尝试设置 openvpn 时,我偶然发现网站上的这个提示。它说你可以限制密码列表,以防止降级攻击。我在有两台计算机的局域网中对其进行了测试,两台计算机都运行带有 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-与-AES-256-CBC-SHA
TLS-DHE-RSA-带有-CAMELLIA-256-CBC-SHA
TLS-DHE-RSA-使用3DES-EDE-CBC-SHA
TLS-DHE-RSA-使用-AES-128-CBC-SHA
TLS-DHE-RSA-带种子-CBC-SHA
TLS-DHE-RSA-带有-CAMELLIA-128-CBC-SHA
TLS-DHE-RSA-使用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 没有出现在该列表中)
假设可能只是符号上有差异,我尝试用 sed
openssl 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 密码是 TLS-DHE-RSA-WITH-AES-256-CBC-SHA。但该答案是 2013 年 11 月的。这仍然是最佳选择吗?不知何故,这现在是另一个问题。但这都是为了找到最安全的 tls 密码选项。
编辑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
但这是一种混乱的方法,不是吗?而且只有当密码名称列表不增长时,它才会以这种方式起作用。
抱歉,如果这个“问题”可能令人困惑...请发表评论,如果您至少花时间阅读这篇文章,我们将非常感谢!
答案1
我认为 OpenVPN 还不支持 ECDHE - 我尝试在 Debian 8.3(稳定版)上使用 OpenVPN 2.3.4,在 Debian 上使用 2.3.10 作为服务器进行测试,当使用 ECDHE 密码套件指定 tls-cipher 时,从运行 2.3.10 的 Windows 客户端进行连接时,这两种方法都不起作用。到目前为止,只有 DHE 可以工作。