WCF - 在 HTTPS 情况下未使用 HTTP.SYS 正确配置证书。与 Charles 代理一起运行

2024-03-29

这似乎是一个常见错误(还有其他类似问题的帖子)-但是,我已经浏览了所有这些帖子和 MSDN 文章(https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates)。 场景:尝试使用 HTTPS 端点访问服务。 在代码中设置客户端证书(证书已正确加载)。 至于服务器证书,我尝试了以下两个选项: client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;

我已将服务器证书导入个人以及机器存储(受信任的根证书颁发机构/证书)。 奇怪的是,当我使用 Charles Proxy 作为 SSL 代理时,调用正在进行。 其他设置:

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;

    ServicePointManager.ServerCertificateValidationCallback +=
            (se, cert, chain, sslerror) =>
            {
                //Console.WriteLine(cert.GetCertHashString());

                if (cert.GetCertHashString() == "[actual hash here]")
                    return true;
                else
                    return false;
            };

当 Charles 代理运行时,上面的哈希检查工作正常。如果没有运行代理,回调甚至不会被调用。

如有任何反馈,我们将不胜感激。

(值得注意的是,使用 Apache CXF 库的 Java 客户端可以正常工作 - 针对相同的服务。)

Update: 为了完整起见,原始错误还包含以下文本: 这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。


好吧,经过几天(和几夜)的头撞,以下是我的思考/发现(当然还有解决方案!):

  • 有“SSL”,然后有 SSLv2、SSLv3、TLSv1.0、TLSv1.1、TLS1.2 和 TLSv1.3(目前为草案)。

  • 服务器和客户端能够协商并选择这些版本之一以成功通信至关重要。

  • HTTP.SYS 错误似乎是客户端无法与服务器协商适当版本的结果。通过 Charles 代理时,很明显 Charles 和我们尝试访问的服务都使用 TLSV1.1。

  • 就我而言,我使用的是 wsHTTPBinding & 尽管我尝试设置 System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;和其他组合,我永远无法让 HTTP.SYS 错误消失。服务器和客户端似乎永远无法选择他们可以同意的版本。

  • 我确实尝试使用其他绑定,例如 basicHttpBinding (使用 TransportWithMessageCredential)以及 basicHttpsBinding,但无济于事。更重要的是,在每种情况下对绑定元素(通过配置和代码)进行一些细微的调整,我在所有 3 种情况下都得到了完全相同的绑定配置(basicHttp/basichHttps/wsHttp 绑定)!本质上,虽然有这些开箱即用的绑定,但它们可能适用于最简单的场景。更重要的是,可能不需要这么多的预打包绑定,特别是因为它们似乎使用了大部分相同的绑定元素。

  • 我确实记得读过,在许多情况下使用自定义绑定更好 - 但我想象通过自定义 wsHttpBinding 我会实现同样的事情。看起来不是 - 因为此绑定中有一些硬编码属性(例如:默认 SSL 协议)似乎很难绕过。我确实查看了 wsHttpBinding 及其基类的源代码,但找不到确切的硬编码位置(但在 System.ServiceModel 代码中引用了“默认”协议)。

    • 最后,“CustomBinding”对我有用,配置如下:

自定义绑定配置 https://i.stack.imgur.com/Co1XI.png- 很抱歉将其包含为图像 - 因为 SO 上的格式正在播放。

  • 这个想法是使用httpsTransport with requireClientCertificate, 安全性与authenticationMode="CertificateOverTransport" & includeTimestamp="true"(我们的服务需要时间戳)和相关messageSecurityVersion- 在我们的例子中是:WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10.

  • 上述配置也会自动签署时间戳。

  • 最重要的是,我们必须包含用户名/密码凭据。仅设置 client.ClientCredentials.UserName.UserName 和 client.ClientCredentials.UserName.Password 不会导致这些凭据包含在安全标头中。逻辑是还要添加用户名“token”,如下所示:

    //Get the current binding 
    System.ServiceModel.Channels.Binding binding = client.Endpoint.Binding;
    
    //Get the binding elements 
    BindingElementCollection elements = binding.CreateBindingElements();
    
    //Locate the Security binding element
    SecurityBindingElement security = elements.Find<SecurityBindingElement>();
    
    //This should not be null - as we are using Certificate authentication anyway
    if (security != null)
    {
        UserNameSecurityTokenParameters uTokenParams = new UserNameSecurityTokenParameters();
            uTokenParams.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
        security.EndpointSupportingTokenParameters.SignedEncrypted.Add(uTokenParams);
    }
    
    client.Endpoint.Binding = new CustomBinding(elements.ToArray());
    
  • 通过所有这些设置,我终于能够访问该服务并实际得到结果 - 好吧,几乎! - 因为结果不包含时间戳,WCF 将其作为异常抛出。但这是另一个需要解决的问题。

希望读者觉得这很有用。

Update:

  • 现在时间戳问题也被“排序”了。问题是响应缺少任何安全标头,而不仅仅是时间戳。值得庆幸的是,有一种简单的方法可以通知 WCF 忽略不安全的响应,只需在安全元素上标记一个属性:enableUnsecuredResponse="true"。显然这是不可取的,但由于我们对服务没有任何控制权,这是我们目前能做的最好的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF - 在 HTTPS 情况下未使用 HTTP.SYS 正确配置证书。与 Charles 代理一起运行 的相关文章

  • 通过 awselb 使用 ssl 时的 neo4j java 驱动程序问题

    I am using neo4j community version 3 1 1 and enterprise edition version 3 0 1 with ssl configured through awselb To conn
  • 如何在 Android 4.1+ 上将自签名 SSL 证书导入到 Volley

    我开发的android应用程序使用Volley 所有通信均通过HTTPS联系 因为我是在本地环境测试的 所以我对Tomcat使用自签名证书 之前我只有安卓2 3 and 3 0设备 现在我也有了4 1和4 4 我的实现使用这种方法 http
  • Python Suds URLError 名称或服务未知问题

    有一个奇怪的问题 我可以成功创建一个 suds 客户端并将其打印出来 gt gt gt client Client the wsdl url gt gt gt print client Suds https fedorahosted org
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • 无法加载文件或程序集“App_Web_1btizmpz,

    我遇到以下错误 Could not load file or assembly App Web 1btizmpz Version 0 0 0 0 Culture neutral PublicKeyToken null or one of i
  • 强制 WcfSvcHost.exe 使用我的自定义服务主机

    是否可以强制 WcfSvcHost 当我执行 F5 或在解决方案中调试另一个项目时自动执行 使用自定义 ustom 服务 通过使用服务工厂 我的自定义服务主机在我的 asp net 主机容器中运行良好 该服务工厂又调用自定义服务库 但是当
  • 当 SSL_get_fd 返回 -1 时,这意味着什么?

    我正在使用 frida 分析一个程序 该程序肯定通过 SSL 连接到某个服务器 当我打电话时SSL get fd 它返回 1 从文档中我看到这意味着ssl不包装套接字 BIO 已明确配置 因为我可以通过SSL get rbio openss
  • 数据库连接模拟失败

    我有一个 SL4 应用程序 它使用 WCF 与后端 SQL Server 2008 数据库进行通信 由于调用的存储过程需要数据库权限 其中一项 WCF 服务需要使用专用系统帐户连接到数据库 我尝试在服务代码中使用模拟来实现解决方案 例如 i
  • .NET Web 服务 (asmx) 超时问题

    我正在连接到供应商提供的 Web ASMX 服务并通过线路发送一组数据 当您向项目添加服务引用时 我的第一次尝试遇到了 Visual Studio 默认在 app config 文件中引发的 1 分钟超时 我把它增加到 10 分钟 又是一次
  • PHP 会话中的数据错误

    我对网上商店进行了以下设置 当用户登录时 通过 AJAX 调用脚本 该脚本根据 SOAP Web 服务验证用户数据 并返回用户数据 当用户登录时 用户数据保存在 PHP 会话中 用户数据 仅通过 SOAP 检索 而不由商店存储 我使用默认的
  • 在 RESTful WCF 中混合 XML 和 JSON,无需单独的方法

    我有一个 RESTful WCF 服务 可以返回 XML JSON 或 JSONP 具体取决于参数 例如 service svc stuff format xml or service svc stuff format json callb
  • 如何研究.NET 中的非托管内存泄漏?

    我有一个通过 MSMQ 运行的 WCF 服务 内存随着时间的推移逐渐增加 表明存在某种内存泄漏 我在本地运行该服务并使用 PerfMon 监视一些计数器 CLR 内存托管堆字节总数保持相对恒定 而进程的私有字节随着时间的推移而增加 这让我相
  • 通过 HTTPS 包含 Twitter Widgets.js

    当我们包含以下内容时 我在我们网站上的 HTTPS 服务页面上的混合内容方面遇到了一个小问题http platform twitter com widgets js http platform twitter com widgets js
  • WCF 数据契约/序列化

    我创建了一个简单的 WCF 应用程序 它公开一个操作 此操作采用复合数据类型作为参数 我没有用 DataContract 属性修饰这个复合数据类型 但这是有效的 我可以在 WSDL 中看到它的架构 现在我的理解是 这个新的自定义类型应该用
  • 如何在不更改源代码的情况下禁用 TLSv1?

    我编写了一个测试代码 不是 HTTPS 来使用 JDK8 测试 TLS 当测试代码运行时 我使用nmap工具扫描并得到结果如下 D softwares nmap 7 12 gt nmap p xxxx script ssl x x x x
  • SOA架构数据访问

    在我的 SOA 架构中 我有几个世界碳基金服务 我的所有服务都需要访问数据库 我应该创建一个专门的 WCF 服务来负责所有数据库访问吗 或者 如果我的每个服务都有自己的数据库访问权限 可以吗 在一个版本中 我在一项服务中只实例化了一个实体层
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 将 SAML 令牌与 Web 服务 (wsdl) 结合使用

    我已从提供商处获得了 wsdl 文件和 pfx 我致电 IdP 并获取 SAML 令牌 现在我需要将该令牌传递给 WebService 如何使用 SAML 令牌来处理 WebService 我正在使用 NET 4 5 在以下两篇文章的帮助下
  • 复制到其他计算机时无法在 WcfTestClient 中添加服务

    我想在另一台计算机上运行 WcfTestClient VS2012 中包含的一个 而不安装 VS2012 这可能吗 在我已经安装了 NET 4 5 的机器上 但是当我尝试添加 Web 服务时 它给了我以下堆栈跟踪 Exception Tex
  • tomcat 7 + ssl 不工作 - ERR_SSL_VERSION_OR_CIPHER_MISMATCH

    Ubuntu 14 tomcat 7 java 7 our crt our key 和 gd bundle g2 g1 crt 由 godaddy 提供 该捆绑包中有 3 个证书 通过查看文件可以看出 请注意 我们的密钥和 crt 在 no

随机推荐