我有两台主机,一台使用 Debian Buster,一台使用 CentOS 7。
我想通过 SSL 连接到 SMTP 服务器。但是,我只能在 CentOS 上执行此操作:
CentOS:
$ openssl s_client -connect smtp.server.com:587
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = server.com
verify return:1
---
Certificate chain
0 s:/CN=server.com
i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
...
德班:
$ openssl s_client -connect smtp.server.com:587
CONNECTED(00000003)
depth=0 CN = server.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = server.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:CN = server.com
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
---
问题似乎是 Debian 主机缺少 Let's Encrypt 证书或不信任它。
如何将信任从一台机器“转移”到另一台机器?即我如何确保他们都信任相同的证书?
答案1
安装 CA 证书包
首先,您需要确认您的 Debian 机器上是否安装了根 CA 证书包。
跑步:
$ apt list --installed 2>/dev/null | grep ca-certificates
如果输出位于[installed]
该行末尾,则表明它已安装,但软件包缺少根 CA 证书 - 跳到下一部分。
如果该命令没有输出任何内容,那么您需要使用以下命令安装 CA 证书:
$ sudo apt install ca-certificates
此时,再次测试您的命令。
如果仍然失败,您需要手动添加根 CA 证书,如下所示:
将根 CA 证书添加到信任锚存储区
如果你读过这里你会看到正确的根是让我们加密 ISRG 根 X1。 Let's Encrypt 颁发 CA (让我们加密权威 X3)已由上述机构签名,并由 Identrust 的根 CA 交叉签名,以提高与旧系统的兼容性。你的 CentOS 机器正在使用后者,但它将于明年到期,因此不值得在你的 Debian 机器中安装。
要让您的 Debian 机器正常工作,请下载让我们加密 ISRG 根 X1从上面的链接并将其保存到您的 Debian 系统(例如ISRG_Root_X1.pem
)/usr/local/share/ca-certificates/
在继续下一步之前,请确保您确认我提供的链接是真实的(Let's Encrypt 站点)且安全(HTTPS),而不是我试图让您安装伪造的根 CA 证书。
现在运行:
$sudo update-ca-certificates
将新证书添加到您的信任存储区。
如果您确实想使用 Identrust 根 CA 证书,可以从以下位置下载:这里。这是页面上的最后一个链接。
再次尝试你的命令,希望它能起作用。
SMTP 服务器配置错误
如果仍然失败,您需要检查 SMTP 服务器是否将证书链作为 TLS 握手的一部分发送。通常,服务器管理员仅配置终端实体证书并忽略 CA 链。添加-showcerts
到 Debian 盒子上的命令并检查是否显示所有证书(PEM 格式)。
如果缺少,请与服务器管理员联系并(友好地)要求他们正确配置服务器。