我收到了 s/mime 签名的电子邮件。此电子邮件的签名是使用此机构颁发的证书生成的:Sectigo RSA 客户端身份验证和安全电子邮件 CA 到期日期 01.01.2031 09c0f2fc0bda94db5ffe2bdfa89942cfc9e0ad00 以上证书由 Thunderbird 信任的根机构颁发。USERTrust RSA Certificationio 机构到期日期 19.01.2038 5379bf5aaa2b4acf5480e1d89bc09df2b20366cb
Thunderbird 和其他电子邮件客户端无法验证此电子邮件签名。如果我在 Windows 中使用 Thunderbird 打开同一封电子邮件,则一切正常。
我下载了一个中间证书。然后导入该证书但不信任它(信任复选框未选中)。然后可以验证该电子邮件签名。
为什么中间证书在 Ubuntu 中不会像在 Windows 中那样自动下载?
这种添加中间证书的方式安全吗?对我来说这似乎是一种安全的方式,因为我自己不信任证书(取消选中信任复选框),但中间证书由随 Ubuntu 安装的根证书验证。
答案1
TL;DR;这是因为 OpenSSL 本身不会尝试获取中间证书,但很多软件都希望它会这样做。
OpenSSL
据我所知,原因在于许多甚至大多数 Ubuntu 应用程序都依赖 OpenSSL 来验证证书。问题在于 OpenSSL 本身不获取任何证书,它仅依赖于本地受信任证书集合,该集合(“默认”)仅包含(或主要包含)ROOT CA 证书,或者至少它期望调用方提供整个证书链。
OpenSSL 开发人员认为获取其他证书不是 OpenSSL 的责任,必须由应用程序本身完成。请参阅这个问题。
请求函数
值得注意的是,此前RFC5246,涵盖了 TLS 1.2,现在已过时,要求服务器必须发送整个证书链(7.4.2):
这是证书序列(链)。发送者的证书必须位于列表的首位。每个后续证书必须直接认证其前一个证书。
但较新的RFC8446放宽了这一点(4.4.2)。具体来说,它是这样说的:
为了实现最大程度的兼容性,所有实现都应准备好处理任何 TLS 版本中可能无关的证书和任意排序
因此,根据我对这个 RFC 和特别是术语“实现”的理解,OpenSSL 应该能够处理无关的证书,但事实并非如此。