2012-09-15 61 views
2

我会为您提供清晰我的问题,所以你能回答我如何验证自签名证书

我有一个客户端 - 服务器(插座)的连接,我保证使用SslStream而据我所知使用SSL让我相信我的客户将只能连接到我的服务器

要做到这一点我必须添加一个功能,我的客户端验证服务器证书,并确保该服务器是真实的(我的服务器)

但我真的不知道如何验证我的自签证明并希望得到您的帮助

问候,并提前致谢

+1

这将帮助你:http:// stackoverflow。com/questions/526711/using-a-self-signed-certificate-with-nets-httpwebrequest-response – 2012-09-15 20:45:01

+1

我认为这个StackOverflow问题会帮助你:http://stackoverflow.com/questions/526711/using-a-self -signed-certificate-with-nets-httpwebrequest-response – 2012-09-15 20:46:30

+0

我不想添加异常并连接!因为是什么让我实现SslStream是我担心MITM攻击,所以我不能简单地忽略\或添加异常来连接无论如何 –

回答

4

想象一下,如果证书不是自签名的 - 它由可信证书颁发机构签名。它的工作原因是因为你的客户端设备 - windows,mac,linux,iphone,android设备已经拥有所有众所周知的证书颁发机构的证书。当您建立连接时,操作系统为您完成工作。它可确保在连接期间发送给客户端的证书由知名证书颁发机构签署。这是唯一的原因,因为客户端已经拥有所有知名证书颁发机构的证书。

如果您选择使用自签名证书或由自签名证书颁发机构签名的证书,则必须执行此操作,而不是操作系统。但是 - 任务基本相同 - 您需要验证在连接期间发送给客户端的证书是否符合预期。您需要使用与签名证书相同的策略 - 您的客户必须预先安装预期的证书(或证书链)。

一些如何,你需要确保你的客户端已经拥有自签名证书。具体证书中的所有公共信息。客户将不会拥有私钥 - 因为这是......私人的。然后,您可以将代码添加到您的应用程序,以验证在连接期间发送的证书的哈希值是否与预先安装的证书的哈希值相匹配。

我注意到你以前也问过类似的问题,你可能已经知道了所有这些。以下是一个附加要点:

只要您保持自签名证书的私钥绝对安全,任何人都无法伪造您的自签名证书。这是不能做到的。如果有人尝试,他们将不得不生成一个新的私钥,这将与你的私钥不匹配 - 因为他们不知道你的私钥,因为你保持它的安全。

然后一切都坏了。如果他们有不同的私钥,他们将需要一个不同的公钥。这意味着他们将拥有不同的证书哈希。 而且你的应用程序已经知道正确的公钥和散列(如上所述),所以当他们尝试使用他们不好的公钥并散列你的应用程序时,它将拒绝连接。这是您在应用程序中必须执行的一部分。

如果他们尝试使用公钥和散列但使用不同的私钥,SSL将不允许他们进行连接。

+1

所以你可以给我提供我如何得到一个便宜的,是去老爹12 $一年ssl认证一个好吗?,我怎么能产生CSR我完全无能为力 –

+2

对不起。我仍在使用自签名证书,因此我无法帮助您。我认为这些问题已在本网站上提出 - 搜索是你的朋友:) –

+0

感谢您的写作。这解释了如果您没有在代码中验证证书以及为什么使用CA,您无需在代码中进行验证,那么可以通过自签名证书完成中间人攻击。太棒了,就是我在找的东西! :) – Mausimo

0

为什么不仅仅使用可信的便宜证书?

+1

感谢您的关注Torlan我只是在研究获取付费证书 –

+0

请查看https://www.startssl.com/或https://letsencrypt.org/获取免费的可信任证书。 –