none
c#客户端如何验证服务端发过来的证书 RRS feed

  • 问题

  • 是这样的,由于程序安装某些证书会弹出警告窗口(X509Store.Add()方式),用户体验不好,想问问可不可以不使用安装证书的方式,而是将证书放置在本地某个路径下,每次Https请求时,得到服务器的X509Certificate来和证书路径下的所有证书作验证。但现在问题是如何将本地的证书(多个PEM格式的证书文件)放入信任链X509Chain中去做比对,希望大神给些指点

    2019年6月5日 8:40

答案

  • 你好,

    如果你信任服务端证书,你可以使用下面的代码直接返回验证结果。
    ServicePointManager.ServerCertificateValidationCallback += delegate
                {
                    return true;
                };

    如果你需要把证书安装在Root CA,并且没有任何提示,请把证书安装在local machine而不是CurrentUser.  请参考下方的代码。

            static void Main(string[] args)
            {
                X509Store store = new X509Store(StoreName.Root,
                                     StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadWrite);
                X509Certificate2 cert = new X509Certificate2(Path.Combine(@"C:\", "VM969.cer"));
                Console.WriteLine("The certificate will be added to the Root CA");
                store.Add(cert);
                Console.WriteLine("Verify, then the certificate will be deleted");
                Console.ReadLine();
                Console.WriteLine("Remove done.");
                store.Remove(cert);
                store.Close();
            }


    Regards
    Abraham



    2019年6月7日 6:47

全部回复

  • 你好,
    对于客户端如何验证服务器证书,使用信任链或者对等信任,我们只需要把证书(服务端)放在对应的证书存储位置就行,如果使用自定义证书验证,则默认放在受信任的根证书颁发机构。https://i.stack.imgur.com/0Otv8.png

    当使用上面的代码设置验证方式时,系统会自动使用下面的验证逻辑。

    None: you could put the ceritificate anywhere
    PeerTrust: you should put the certificate in the trusted people store.
    ChainTrust: if the chain builds to a certification authority in the trusted root store, then the certification is valid.
    PeerOrChainTrust: the above.
    Custom: we should specify the custom x509validator class which implements the System.IdentityModel.Selectors.X509CertificateValidator manually.

    证书仓库最好使用本地机器而不是当前用户.使用Certlm.msc来管理本地机器上的证书。
    Abraham

    2019年6月6日 2:24
  • 谢谢您的回复,代码图片损坏看不了,想请问一下,证书如果不放在系统的存储位置(因为有些证书安装时会弹出警告框),而是放在一个文件目录中,例如 "C:\Desktop\Test\"目录下,这时应该如何进行验证?
    2019年6月6日 6:32
  • 你好,

    如果你信任服务端证书,你可以使用下面的代码直接返回验证结果。
    ServicePointManager.ServerCertificateValidationCallback += delegate
                {
                    return true;
                };

    如果你需要把证书安装在Root CA,并且没有任何提示,请把证书安装在local machine而不是CurrentUser.  请参考下方的代码。

            static void Main(string[] args)
            {
                X509Store store = new X509Store(StoreName.Root,
                                     StoreLocation.LocalMachine);
                store.Open(OpenFlags.ReadWrite);
                X509Certificate2 cert = new X509Certificate2(Path.Combine(@"C:\", "VM969.cer"));
                Console.WriteLine("The certificate will be added to the Root CA");
                store.Add(cert);
                Console.WriteLine("Verify, then the certificate will be deleted");
                Console.ReadLine();
                Console.WriteLine("Remove done.");
                store.Remove(cert);
                store.Close();
            }


    Regards
    Abraham



    2019年6月7日 6:47