我是这个社区的新手,对与安全有关的事情有点陌生。
我有三台服务器
所有服务器都有自己的SSL证书,并被要求执行以下操作:
Web服务器(客户端)必须使用TLS向其他两个服务器发出安全请求,并且只接受来自这些服务器的证书,仅此而已。有办法在openssl中配置这个吗?我的问题是,证书是本地的/自签名的。
客户端服务器是RHEL 7。
发布于 2021-02-19 22:57:02
您正在讨论的实践称为“证书钉扎”(有时称为“公钥钉扎”),在控制客户端和服务器时,这是一种常见的安全建议。
通常,这是通过配置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 " bundle“,而不是使用系统范围的CA包。这允许您继续使用默认的证书验证代码,它只是不信任任何不链接到内部CA的证书。这实际上与CA级别的固定相同,但可能要简单得多(尽管对验证逻辑的控制不那么精细)。
https://serverfault.com/questions/1054537
复制相似问题