PHP imap_open(),OpenSSL,没有密码

PHP imap_open(), OpenSSL, and no Cipher

我已将 PHP 脚本移动到另一台服务器,但现在无法登录 IMAP (TLS) 邮箱:

TLS/SSL failure for mail.servername.de: SSL negotiation failed 

问题似乎是由 OpenSSL 引起的,因为当我尝试从两台服务器连接到邮件服务器时,我在一种情况下获得了连接(邮件服务器要求输入),但是 none另一个(关闭连接,我回bash):

 openssl s_client -crlf -connect mail.servername.de:993

最明显的区别在这里:

verify return:1
---

<snip>

-----END CERTIFICATE-----
subject=/CN=mail.servername.de
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: DH, 1024 bits
---
SSL handshake has read 3398 bytes and written 483 bytes
Verification: OK
---
New, TLSv1.2, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit

在另一台服务器上(未建立连接)

verify return:1
depth=0 CN = mail.servername.de
verify return:1
140410888582464:error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:../ssl/statem/statem_clnt.c:2149:
---

<snip>

-----END CERTIFICATE-----
subject=CN = mail.servername.de

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

---
No client certificate CA names sent
---
SSL handshake has read 3167 bytes and written 318 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Server public key is 2048 bit

在邮件服务器上 dovecot 配置为不接受未加密的连接。但是,我假设它已经由于 dh key too small 而失败,这似乎与密码协商有关。

现在我根本无法将这些东西放在一起...为什么 SSL 连接在一台服务器上有效,但在另一台服务器上无效?

TL;DR:您的新主机有较新版本的 OpenSSL,可能具有更高的安全设置,禁止连接到主机,原因如下所述。

"dh key too small" 来自 OpenSSL,因为安全性太低。

事情发生了变化,例如在最新的 Debian 版本和 OpenSSL 1.1.1 中(我想新版本也是类似的),安全性得到了增强。

我找到的最好和最简单的解释是在 https://wiki.debian.org/ContinuousIntegration/TriagingTips/openssl-1.1.1 的 Debian wiki 上 其中说:

In Debian the defaults are set to more secure values by default. This is done in the /etc/ssl/openssl.cnf config file. At the end of the file there is:

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

This can results in errors such as:

dh key too small
ee key too small
ca md too weak

现在可能的解决方案按优先顺序降序排列:

  • 请求远端生成更好的"DH"值("Server Temp Key: DH, 1024 bits");最好的解释在 https://weakdh.org/sysadmin.html;特别注意 "Administrators should use 2048-bit or stronger Diffie-Hellman groups with "safe" 素数。"
  • 专门为此连接配置您的终端,以不使用 OS 默认值并降低您的设置;在执行连接的代码中将密码设置为 "DEFAULT@SECLEVEL=1" 就足够了
  • (真的真的真的不推荐)把你这边全局配置文件里的SECLEVEL的值从2改成1。但这会影响来自您主机的所有连接,而不仅仅是这一个,因此您正在降低系统的全局安全性只是因为来自一个远程节点的安全级别较低。

因为我自己拥有 "remote end",所以我能够提高安全性。解决方案很简单,也可能对其他人有用...

dovecot 版本是 2.2.x,这与 DH 参数有一定的相关性(参见 Dovecot SSL configuration)。在配置文件中 /etc/dovecot/conf.d/10-ssl.conf 你可以简单地添加这一行:

ssl_dh_parameters_length = 2048

最终,可能需要将这里添加到主配置文件 /etc/dovecot/dovecot.conf 末尾:

!include conf.d/*.conf

最后,重要的是不要重新加载,而是重启dovecot。

systemctl restart dovecot

突然之间,几个小时的压力、烦恼和沮丧都消失了。太棒了...

除上述内容外,dovecot 2.3 还发生了变化。 现在不使用 ssl_dh_parameters_length,必须使用 ssl_dh 来指向使用

生成的文件
openssl dhparam 4096 > dh.pem

请参阅 https://doc.dovecot.org/configuration_manual/dovecot_ssl_configuration/ 并向下滚动到 SSL 安全设置。这是升级后我必须做的唯一改变,以使其再次正常工作。我将 dh.pem 文件放在 /etc/dovecot 中,所以我在 10-ssh.conf 中的行是

ssl_dh=</etc/dovecot/dh.pem