我在 443 以外的任何端口上收到 CommunicationException

时间:2021-03-11 22:45:09

标签: c# wcf ssl

我有一个标准的 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 跟踪。我可以从跟踪日志中看到警告“安全协议无法保护传出消息”

enter image description here

2 个答案:

答案 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}

注意事项

  1. 如果上述命令失败;确保您导入了私钥,而不仅仅是公共证书
  2. 我不知道 appId 是否是任意 Guid;我使用了我的应用程序外壳项目(一个控制台应用程序)中的 Guid;它是将您的应用程序暴露给“com”的 Guid

希望这对未来的人有所帮助