【问题标题】:I receive a CommunicationException on any port other than 443我在 443 以外的任何端口上收到 CommunicationException
【发布时间】:2021-06-09 23:37:08
【问题描述】:

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

【问题讨论】:

    标签: c# wcf ssl


    【解决方案1】:

    一定要使用正确的方式调用wcf服务,比如添加服务引用,通道工厂等由于客户端和服务器之间的安全绑定不匹配。'

    您可以使用以下代码指定 TLS 版本:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13;
    

    TLS1.3是最新的TLS标准协议,速度更快,安全性更高。 这是参考:Transport Layer Security (TLS) best practices with the .NET Framework

    【讨论】:

    • 感谢您的评论;我相信绑定是正确的,因为正如我在问题中所述,仅当我的服务暴露在 443 以外的端口上时才会发生此错误。如果服务暴露在 443 上,则没有错误。
    【解决方案2】:

    对我来说,解决方案是将 SSL 证书绑定到我的服务所使用的 IP 地址和端口。我在命令提示符下使用了以下命令;

    netsh http 添加 sslcert ipport={ipAddress}:{port} certash={CertificateThumbprint} appid={appId}

    注意事项

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

    希望这对将来的某人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2020-09-16
      • 2019-11-12
      • 1970-01-01
      • 2011-02-25
      • 2017-08-28
      • 2010-09-29
      相关资源
      最近更新 更多