我会清楚地向您提供我的问题,以便您回答我
我有一个使用 SslStream 保护的客户端-服务器(套接字)连接,据我所知,使用 ssl 可以确保我的客户端只会连接到我的服务器
为此,我必须向我的客户端添加一个函数来验证服务器认证并确保服务器是真实的(我的服务器)
但我真的不明白如何验证我的自签名证书并希望得到您的帮助
问候,并提前致谢
我会清楚地向您提供我的问题,以便您回答我
我有一个使用 SslStream 保护的客户端-服务器(套接字)连接,据我所知,使用 ssl 可以确保我的客户端只会连接到我的服务器
为此,我必须向我的客户端添加一个函数来验证服务器认证并确保服务器是真实的(我的服务器)
但我真的不明白如何验证我的自签名证书并希望得到您的帮助
问候,并提前致谢
想象一下,如果证书不是自签名的——它是由受信任的证书颁发机构签名的。它起作用的原因是因为您的客户端设备 - windows、mac、linux、iphone、android 设备已经拥有所有知名证书颁发机构的证书。当您建立连接时,操作系统会为您完成工作。它确保在连接期间发送给客户端的证书由知名的证书颁发机构签名。这样做的唯一原因是客户端已经拥有所有知名证书颁发机构的证书。
如果您选择使用自签名证书 - 或由自签名证书颁发机构签名的证书 - 您必须完成这项工作,而不是操作系统。但是 - 任务基本相同 - 您需要验证在连接期间发送给客户端的证书是否与预期相符。您将需要使用与签名证书相同的策略 - 您的客户端必须预先安装预期的证书(或证书链)。
您需要以某种方式,以某种方式确保您的客户已经拥有自签名证书。特别是证书中的所有公共信息。客户端将没有私钥 - 因为那是......私人的。然后,您可以将代码添加到您的应用程序,验证连接期间发送的证书的哈希值是否与预安装的证书的哈希值匹配。
我注意到您之前曾问过类似的问题,您可能已经知道这一切。这里还有一点:
只要您确保自签名证书的私钥绝对安全,任何人都无法伪造您的自签名证书。就是做不到。如果有人尝试,他们将不得不生成一个与您的私钥不匹配的新私钥 - 因为他们不知道您的私钥,因为您保证了它的安全。
然后一切都崩溃了。如果他们有不同的私钥,他们将需要不同的公钥。这意味着它们将具有不同的证书哈希。 而且您的应用已经知道正确的公钥和散列(如上所述),因此当他们尝试使用错误的公钥和散列进入时,您的应用将拒绝连接。这是您必须在应用程序中执行的部分。
如果他们尝试使用您的公钥和散列但使用不同的私钥,则 SSL 将不允许他们建立连接。
为什么不只使用受信任的廉价证书?