如何为 NGINX 配置选择正确的加密算法

3

我对 nginx 不太了解,最近决定更改配置文件,使用返回语句return 301 https://$host$request_uri;将我的应用程序从http重定向到https。这一切都很顺利,直到我发现我们无法通过Twilio API接收短信。我决定调试问题,并发现我收到了一个SSL/TLS握手错误

查看调试器后,我发现这可能是问题的原因:

Incompatible cipher suites in use by the client and the server. This would require the client to use (or enable) a cipher suite that is supported by the server.

我查看了 nginx 配置文件,发现没有使用密码套件,这可能是问题的根源,而不是因为 TLS 没有启用。以下是配置:

server {
        listen      443 ssl http2 default_server;
        listen      [::]:443 ssl http2 default_server;
        server_name     localhost;

        ssl_certificate "/etc/nginx/ssl/domain-crt.txt";
        ssl_certificate_key "/etc/nginx/ssl/domain-key.txt";
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

        ## More configuration below this...
    }
Twilio 有一份支持的密码列表,可以在这里找到,但我不确定如何在我的配置文件中实现。 我是否应该使用所有密码,因为我的协议包括TLSv1、TLSv1.1 和 TLS1.2?还是仅使用该列表中的其中一个?我真的很困惑,不知道我需要在我的ssl_ciphers变量中设置什么。

另外,我看到启用SSLv3ssl_protocols中是不明智的。我可以将其从ssl_protocols中删除,并保存配置文件而不会造成重大问题吗?

如果有人能帮我回答这些问题,那将非常有帮助。谢谢!

1个回答

4
默认情况下,Nginx使用密码并按版本配置。
在1.0.5及更高版本中,默认的SSL密码是HIGH:!aNULL:!MD5。在0.7.65和0.8.20及更高版本中,默认的SSL密码是HIGH:!ADH:!MD5。从0.8.19版本开始,默认的SSL密码为ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM。从0.7.64、0.8.18及更早版本开始,默认的SSL密码为ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP。有关更多信息,请参见Nginx Docs
但是,您也可以明确选择要允许的密码: ssl_ciphers "cipher1 cipher2 ... cipherN"; 例如 - ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256"; 仅支持此特定密码套件。 关于:
我读到有关在ssl_protocols中启用SSLv3的做法是不好的。 如果我从ssl_protocols中移除它并保存配置,是否会导致主要问题? 唯一可能引起的主要问题是,使用SSLv3的客户端尝试连接您的服务器时将被拒绝,因为您的服务器不接受它(不受配置文件支持)。 无论如何,在某些版本中,这是Nginx的默认设置,不应该成为问题。 来自Nginx文档: 从0.7.65和0.8.19版本以及之后的版本开始,默认的SSL协议是SSLv3、TLSv1、TLSv1.1和TLSv1.2(如果OpenSSL库支持)。

这是很好的建议,谢谢。我只需要在他们的网站上选择一个密码吗?还是我需要为每个SSL协议选择一个密码? - Michael
你可以选择一种加密方式,但这样客户端只能使用这一种,其他任何加密方式都不可接受。我认为你应该使用多种加密方式,例如“HIGH:!aNULL:!MD5”,这样就可以解决问题了。 - BarT
HIGH 表示你与客户端握手时使用双方都可接受的最高加密算法(服务器和客户端)。!aNULL 表示你不接受空认证密码,这是有意义的,而 MD5 是另一种消息摘要算法。 - BarT
我可以将它们与其他密码组合吗?如果我做了这样的事情:HIGH:!aNULL:!MD5:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA。或者我不能以那种方式包含多个密码吗?抱歉问了这么多问题,我只是想确保我做得对。 - Michael
是的,你可以这样做,只需要验证每个密码是否有效。 - BarT
检查一下你的 OpenSSL 密码选项是否包含它们。命令:openssl ciphers -V - BarT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接