如何配置 openssl 客户端以仅接受特定的服务器证书?

如何配置 openssl 客户端以仅接受特定的服务器证书?

我是这个社区的新人,对安全相关的事情也比较陌生。

我有三台服务器

  • Web 服务器(客户端)
  • 邮件服务器 (eSMTP)
  • 网络服务器

所有服务器都有自己的 SSL 证书,并被要求执行以下操作:

Web 服务器(客户端)必须使用 TLS 向其他两台服务器发出安全请求,并且只接受来自这些服务器的证书,仅此而已。有没有办法在 openssl 中配置这个?我的问题是,证书是本地/自签名的。

客户端服务器是 RHEL 7。

答案1

您所谈论的做法称为“证书固定”(或有时称为“公钥固定”),当您同时控制客户端和服务器时,这是一种常见的安全建议。

通常,这是通过配置 TLS 客户端代码(可能是 OpenSSL 或其他库)来引入自定义证书验证步骤(通常是在建立连接时调用的函数)来完成的,并且在该步骤中,您将验证服务器提供的证书是否与您期望的证书相匹配。您可能需要查看https://stackoverflow.com/questions/16291809/programmatically-verify-certificate-chain-using-openssl-api或者https://stackoverflow.com/questions/3412032/how-do-you-verify-a-public-key-was-issued-by-your-private-ca获取执行此操作的代码示例(尽管这些代码示例很旧并且可能已经过时);OpenSSL 的 API 很容易出错。

你可能还想阅读https://labs.nettitude.com/tutorials/tls-certificate-pinning-101/或类似内容,其中讨论了进行固定时的注意事项。特别是,您需要考虑要固定哪个证书(特定叶证书、根 CA 或介于两者之间的证书)以及要固定多少证书(固定整个证书似乎很容易,但使用新日期或 OID 或类似内容重新颁发证书会使情况变得复杂,而在大多数情况下,简单地固定公钥详细信息即可提供您真正需要的所有安全性)。您还应该考虑备份/后备固定,以便在您的主证书受到损害并需要撤销时使证书轮换更容易。


尽管如此,在这种情况下可能还有另一种选择。如果您的客户端(也是服务器)只会连接到这台其他服务器,并且您使用内部 CA,则可以将 TLS 客户端代码配置为使用仅包含该内部 CA 证书的 CA“捆绑包”,而不是使用系统范围的 CA 捆绑包。这样您就可以继续使用默认的证书验证代码,它只是不会信任任何未链接到您的内部 CA 的证书。这实际上与在 CA 级别固定相同,但可能要简单得多(尽管对验证逻辑的控制不太精细)。

相关内容