如何在nginx上启用TLSv1和TLSv1.1?

6
我的nginx配置文件如下:
 server {
   listen          80;
   listen [::]:80;

   server_name hostserver.ru www.hostserver.ru;
   return 301 https://hostserver.ru$request_uri;

   server_tokens off;
  }

 server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   server_name     hostserver.ru www.hostserver.ru;

   ssl_certificate /etc/letsencrypt/live/hostserver.ru/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/hostserver.ru/privkey.pem;
   ssl_dhparam /etc/ssl/certs/dhparam.pem;
   ssl_session_timeout 1d;
   ssl_session_cache shared:SSL:50m;
   ssl_session_tickets off;
   ssl_protocols TLSv1.2;
   ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-R$
   ssl_prefer_server_ciphers on;
   add_header Strict-Transport-Security "max-age=31536000" always;
   ssl_stapling on;
   ssl_stapling_verify on;

   root /var/www/html;
   index index.html index.htm;
   server_tokens off;

   ... some location stuff...
}

不幸的是,Android 4.0-4.3 不支持 TLS1.2,因此我已更改配置:

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

但是在使用SSLTest之后,它向我报告说TLS1和TLS1.1不被支持。

我错过了需要更改的配置文件吗? 提前感谢您的回答。

更新:我通过命令检查了证书:

openssl s_client -tls1 (and so on) -connect example.org:443 < /dev/null

并且对于每个协议都启用了证书。


你在做完这些更改后重启了服务器吗? - Rob
@Rob 是的!我重新启动了nginx和整个Ubuntu服务器 - 没有效果。 - micsha123
1
你可能想要检查哪些密码与TLSv1和TLSv1.1兼容。在测试我的网站时,只有TLSv1.2列出了GCM密码 - 你可能需要添加更多的密码。例如:ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; - Richard Smith
@RichardSmith,你说得对!你能把你的评论发表为答案吗? - micsha123
你可以使用 nmap -script ssl-enum-ciphers -p PORT HOSTNAME 命令列出 SSL 密码套件。 - andrej
3个回答

5

我不知道哪些加密算法适用于TLSv1和TLSv1.1。但是,我在使用SSLTest测试网站时注意到,GCM加密算法仅适用于TLSv1.2。

你可能需要使用更全面的加密算法清单。

例如:

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

3
是的!我已经更改了我的密码列表(只支持TLS1.2)。对于这个问题的新手,我可以推荐https://mozilla.github.io/server-side-tls/ssl-config-generator/ - 我有类似“现代”类型的东西。 - micsha123
1
我也遇到了同样的问题(nginx 1.18.0,OpenSSL 1.1.1f),并且编写了ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ALL"; ,然后重新启动了nginx,但没有任何改变。 SSL测试仍然显示仅支持TLSv1.2。 - Thomas
1
原来,OpenSSL 配置文件 /etc/ssl/openssl.cnf 在此也发挥了作用,即使 nginx 明确请求协议(和可能的密码),它也可以禁止它们。我在 https://dev59.com/ZVIH5IYBdhLWcg3wB4F7#61568390 找到了帮助解决问题的答案。 - Thomas
3
在密码列表中添加 @SECLEVEL=1ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:@SECLEVEL=1";,参见 https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_security_level.html 了解各个安全级别。 - JPelletier
1
@JPelletier 这是唯一一个对我有用的!你刚刚救了我的一天! - Swap
1
那次测试并非巧合——AEAD密码(GCM、CCM和ChaCha/Poly)是TLS 1.2中的新功能,在早期版本中并不存在(而且它们是TLS 1.3中唯一的密码套件,但这是在你发布这篇文章之后的2021年)。 - undefined

1

在使用Ubuntu 22.04时,让TLS 1.0/1.1正常工作是一件非常麻烦的事情,因为似乎Ubuntu的openssl 3.0版本根本不包括TLS 1.0/1.1支持。

我通过以下方式使其正常工作:

  1. 源代码构建openssl 1.1.1分支

  2. 卸载libssl-dev后从源代码构建nginx,以便找到本地构建的openssl,并确保启用所需的模块

  3. 更新openssl 配置

  4. 更新Nginx 配置

  5. 更新我的systemd服务以使用本地构建的nginx

请注意,如果这样做,您将无法获得自动安全更新。谨慎行事。


0
在Debian bookworm服务器上,我需要执行以下操作来启用TLS 1.0(用于Debian squeeze客户端):
- 在nginx中配置`ssl_ciphers DEFAULT:@SECLEVEL=0;`(以及`ssl_protocols`) - 使用certbot的`--key-type rsa`标志重新配置我的letsencrypt证书
我曾以为`ssl_ciphers ALL;`会启用所有密码,但根据OpenSSL手册的说法,情况并非如此。
自从Certbot 2.0以后,默认情况下证书是ECDSA的,因此某些RSA密码无法使用。

这对我在Ubuntu 22.04和nginx 1.18上有效。将SECLEVEL=1改为SECLEVEL=0就可以了。再加上https://stackoverflow.com/a/61568390/14637。所以不需要重新编译openssl或nginx。 - undefined

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