2012-07-19 143 views
4

我正在C#中开发一个应用程序,它将通过HTTP和SSL与服务器进行通信。有什么方法可以让程序信任服务器提供的证书?此证书将与软件一起分发,以便它可以识别服务器而不涉及外部CA.手动信任C#中的SSL证书#

说明:我希望我的客户端应用程序信任已在客户端进行硬编码的单个证书,以便它只会信任我自己的服务器。

+0

您是否想要信任每个证书(绕过证书的证书,也就是使用您自己的CA的未完全签名的证书)或某些特定证书? – 2012-07-19 12:03:18

+0

这个问题 - http://stackoverflow.com/questions/7485313/check-self-signed-certificate-ssl-c - 应该可以帮助你开始? – 2012-07-19 12:03:27

+0

@ J.Steen这就是我想过的,并添加了我的评论 - 也许他想要验证特定的.. – 2012-07-19 12:04:10

回答

1

您可以使用BouncyCastle。

  1. 使用FromX509Certificate(X509Certificate)功能
  2. 负载从服务器证书分为公元前公共密钥加载了CA证书到BC usign DotNetUtilities类。
  3. 的服务器证书公钥

这样你检查证书的签名呼叫Verify。哪一种方法最安全?并且还可以在不更新客户端的情况下更新服务器证书。 (只要CA是有效的偏离方向)的

来源验证此:http://www.bouncycastle.org/viewcvs/viewcvs.cgi/csharp/crypto/src/x509/X509Certificate.cs?view=markup线:540

+0

所以我仍然需要一个适当的CA证书? – 2012-07-19 16:10:59

+0

没有任何证书在客户端用于验证服务器证书的证书进行验证。所以一个自制的CA就足够了。 – albertjan 2012-07-19 16:30:43

0

在我看来,我不认为你可以做到这一点,相信你有足够的安全通道。如果我错了,有人会纠正我,但SSL中的CA信任链不仅仅用于验证指纹是否是特定值(或证书的其他部分)。它证明客户端正在与正确的服务器通信(由于共享CA密钥)。 This illustration是一个很好的参考。跳过第3步,将不允许服务器向客户端证明其身份(抛出证书验证)。

so that it will only ever trust my own server

SSL保证这通过使用共享的CA证书(如Verisign等)。也许我不明白你为什么要选择不是因为它的意图使用SSL。

编辑: 作为the_ajp指出在他的回答中,有库(比如充气城堡),将做证书链的全面核查。这些可以手动调用。

+0

第4步“证明服务器身份”只是比较comonname和dnsname而已。 – albertjan 2012-07-19 14:28:45

+0

@the_ajp是的,抱歉,看着那张图很困惑。我的意思是第3步。我编辑了我的答案。 – 2012-07-19 15:29:03

+0

这就是我在我的回答中描述的步骤:) – albertjan 2012-07-19 16:08:03