我有一个标准的 n 层应用程序 (.Net 4.7.2),其中有一个控制台服务器和一个 WinForms 应用程序,它们都在同一台机器上运行。客户端和服务器通过 WCF 进行通信。
如果我在地址绑定中使用除 443 之外的任何端口,我在尝试与服务器通信时会在客户端上收到 CommunicationException
。不指定端口或明确指定 443 没有问题。
错误信息是;
<块引用>发出 HTTP 请求时出错
https://localhost:44333/SecurityTokenService/issue/wstrust/mixed/anonymous
。
这可能是因为服务器证书不是
在 HTTPS 情况下使用 HTTP.SYS 正确配置。这也可以
由客户端和客户端之间的安全绑定不匹配引起
服务器。
这是我的客户端绑定供参考
<endpoint
address="https://localhost:44333/SecurityTokenService/issue/wstrust/mixed/anonymous"
binding="customBinding"
bindingConfiguration="MySecurityTokenEndpointBinding"
contract="System.ServiceModel.Security.IWSTrustChannelContract"
name="SecretTokenAuthenticationEndPoint" />
更新:我自己继续调查该问题并启用了 WCF 跟踪。我可以从跟踪日志中看到警告“安全协议无法保护传出消息”
答案 0 :(得分:0)
确保使用正确的方式调用wcf服务,比如添加服务引用、通道工厂等。看了你的问题,我觉得很有可能,因为错误信息说:'这也可能导致由于客户端和服务器之间的安全绑定不匹配。'
您可以使用以下代码指定 TLS 版本:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
TLS1.3 是最新的 TLS 标准协议,速度更快,安全性更高。 这是参考:Transport Layer Security (TLS) best practices with the .NET Framework
答案 1 :(得分:0)
我的解决方案是将 SSL 证书绑定到暴露我的服务的 IP 地址和端口。我在命令提示符下使用了以下命令;
netsh http add sslcert ipport={ipAddress}:{port} certhash={CertificateThumbprint} appid={appId}
注意事项
希望这对未来的人有所帮助