C# 如何避免在客户端设置DnsEndpointIdentity

C# 如何避免在客户端设置DnsEndpointIdentity,c#,wcf,ssl,C#,Wcf,Ssl,因此,基本上我有一个应用程序,其中我有一个客户端和两个服务,它们通过netcpbinding或netNamedPipe公开端点。此外,服务和客户机之间的整个通信都由证书保护(目前我使用的是自信任证书) 它工作正常,但在创建实例的过程中,我还需要设置在服务端使用的证书的名称。看起来是这样的: new EndpointAddress(serviceUrl, new DnsEndpointIdentity("MyCertificateName")); 所以我的问题是: 这正常吗?有没有办法避免在客户

因此,基本上我有一个应用程序,其中我有一个客户端和两个服务,它们通过netcpbinding或netNamedPipe公开端点。此外,服务和客户机之间的整个通信都由证书保护(目前我使用的是自信任证书)

它工作正常,但在创建实例的过程中,我还需要设置在服务端使用的证书的名称。看起来是这样的:

new EndpointAddress(serviceUrl, new DnsEndpointIdentity("MyCertificateName"));
所以我的问题是:
这正常吗?有没有办法避免在客户端设置它?

这是一种正常现象,身份不能被忽略,它代表服务器的身份。第三方可以模拟服务程序让客户端调用,以达到窃取客户端信息的目的。为确保客户端未找到错误的服务器,证书中的主机名(主题)必须与客户端提供的主机名(DNS标识)相同。我们还可以使用证书的公钥作为标识,因为证书的公钥对外公开

<identity>
                  <rsa value="...."/>
                </identity>
顺便说一句,这些配置可以在使用添加服务引用对话框调用服务时自动生成。

如果有什么我可以帮忙的,请随时告诉我。

同样的规则是否也适用于netHttpBinding?据我所知,使用netHttpBinding我的服务也可以作为RESTAPI工作,那又怎么样?我的客户也将被迫设置一个身份名?提前感谢您。用于创建RESTAPI的绑定是Webhttpbinding。当我们在服务器端使用证书保护WCF Rest API通信时,不需要设置标识,这是因为调用服务的方式。通常,我们构造一个http请求来调用服务,而不是客户端代理。
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2 cert = null;
            foreach (var certificate in store.Certificates)
            {
                if (certificate.Subject.Contains("myhostname"))
                {
                    cert = certificate;
                    break;
                }
            }
            if (cert==null)
            {
                return;
            }
            //output the public key
            string xmlKey = cert.PublicKey.Key.ToXmlString(false);
            //encoded
            string encodedkey = System.Net.WebUtility.HtmlEncode(xmlKey);
            Console.WriteLine($"Public key:\n{encodedkey}");
            store.Close();
            store.Dispose();