繁体   English   中英

如何避免在客户端设置 DnsEndpointIdentity

[英]How to avoid setting DnsEndpointIdentity on client side

所以基本上我有一个应用程序,我有一个客户端和两个通过 netTcpBinding 或 netNamedPipe 公开端点的服务。 此外,服务和客户端之间的整个通信都通过证书进行保护(现在我使用的是自信任证书)。

它工作正常,但在创建EndpointAddress实例期间,我还需要使用服务端使用的证书名称设置DnsEndpointIdentity 所以它看起来像这样:

new EndpointAddress(serviceUrl, new DnsEndpointIdentity("MyCertificateName"));

所以我的问题是:这正常吗? 有没有办法避免在客户端设置它?

这是正常现象,身份不能无知,它代表了服务器的身份。 第三方可以冒充服务程序让客户端调用,以达到窃取客户端信息的目的。 为确保客户端不会找到错误的服务器,证书(主题)中的主机名必须与客户端提供的主机名(DNS 身份)相同。 我们也可以使用证书的公钥作为身份,因为证书的公钥对外部是公开的。

<identity>
                  <rsa value="...."/>
                </identity>

这是获取证书公钥的示例代码。

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();

顺便说一句,这些配置可以在使用“添加服务引用”对话框调用服务时自动生成。
如果有什么我可以帮忙的,请随时告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM