WCF新手 – 如何安装和使用SSL证书?

对于之前完成它的人来说,这应该是一件轻而易举的事……

我正在尝试使用NetTcpBinding设置自托管的WCF服务。 我从Thawte那里获得了一个试用版SSL证书,并在我的IIS商店中成功安装了这个证书,我认为我已经在服务中正确设置了它 – 至少我不会例外!

现在,我正在尝试连接客户端(这仍然在我的开发机器上),并且它给了我一个错误,“Message =”X.509证书CN = ssl.mydomain.com,OU =用于测试目的只要。 无保证。,OU = IT,O =我的公司,L =我的城镇,S =无,C = IL链建设失败。 使用的证书具有无法validation的信任链。 替换证书或更改certificateValidationMode。 已处理证书链,但终止于信任提供程序不信任的根证书。“

Ooookeeeey ……现在怎么样?

客户端代码(我想在代码中执行此操作,而不是app.config):

var baseAddress = "localhost"; var factory = new DuplexChannelFactory(new InstanceContext(SiteServer.Instance)); factory.Endpoint.Address = new EndpointAddress("net.tcp://{0}:8000/".Fmt(baseAddress)); var binding = new NetTcpBinding(SecurityMode.Message); binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; factory.Endpoint.Binding = binding; var u = factory.Credentials.UserName; u.UserName = userName; u.Password = password; return factory.CreateChannel() 

添加了Bounty我刚刚从Thawte获得了一个新的试用证书,安装了“发给”设置到mydomain.com,我仍然得到上面的错误。 我是网络安全的新手,所以我需要详细说明如何让客户端连接到我的网站并接受安全证书。 (顺便说一句,“不保证”是什么意思?)

问题似乎是客户端不信任您在服务器上安装的服务器证书。

为了使其可信,服务器证书的根CA证书需要位于运行客户端的用户的“受信任的根证书颁发机构”存储中。 如果您从Thawte或其他类似的CA获得“生产”级服务器证书,那么它将受到全球大多数机器的信任。

但是,根据错误消息判断(证书的主题可分辨名称包含“OU =仅用于测试目的。无保证。”)您的证书是测试证书,因此您需要将CA证书添加到“受信任的根”证书颁发机构“手动存储。 根证书通常可以从CA(在您的案例中为Thawte)网站下载。

如果证书适用于ssl.mydomain.com,则需要访问该地址的服务器。 看起来你正试图通过localhost访问它,这显然是不一样的。

问题是您的证书的颁发者不受信任。

WCF将尝试validation证书链。 一种解决方案是确保用于发布您拥有的证书的证书存储在服务器的受信任发行者存储中。

您还可以添加自定义证书策略以绕过开发环境上的validation(如此处所述)

您还可以将证书存储在“受信任的人”中,并将certificateValidationMode设置为ChainOrPeerTrust。 除非您将证书放入“受信任的人”商店,否则这将尝试validation整个链。 这将允许您将配置和代码保持不变,以便部署到生产环境。 您只需将证书放入开发环境中的“受信任人”商店即可。

在.net core 2.0中我们必须通过nuget包管理器搜索System.ServiceMode来执行此操作,您可以使用System.ServiceModel.primitives。

自2018年4月更新