在 HTTPS 情况下,未使用 HTTP.SYS 正确配置服务器证书

Posted

技术标签:

【中文标题】在 HTTPS 情况下,未使用 HTTP.SYS 正确配置服务器证书【英文标题】:server certificate is not configured properly with HTTP.SYS in the HTTPS case 【发布时间】:2015-10-30 18:26:46 【问题描述】:

我需要使用第三方 WCF 服务。我已经在证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。

向https://XXXX.com/AHSharedServices/CustomerServiceJAXWSController 发出 HTTP 请求时出错。这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

我咨询了服务供应商,他们说一切都很好,其他人已经在使用这项服务。他们提到当请求来自我的 IP 地址时,他们的服务没有收到证书内容。他们将此监控到wireshark中,证书的长度为0

以下是我的客户端配置。我这里有什么遗漏吗?

            <?xml version="1.0" encoding="utf-8" ?>
            <configuration>
              <startup>
                <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
              </startup>
              <system.diagnostics>
                <sources>
                  <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
                    <listeners>
                      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                      </add>
                      <add name="ServiceModelMessageLoggingListener">
                        <filter type="" />
                      </add>
                    </listeners>
                  </source>
                </sources>
                <sharedListeners>
                  <add initializeData="D:\Log\MessageLog.svclog"
                    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
                    <filter type="" />
                  </add>
                </sharedListeners>
                <trace autoflush="true" />
              </system.diagnostics>
              <system.serviceModel>
                <behaviors>
                  <endpointBehaviors>
                    <behavior name="endpointBehavior">
                      <clientCredentials>
                        <clientCertificate findValue="XXX.XX.com" storeName="AddressBook"
                          x509FindType="FindBySubjectName" />
                        <serviceCertificate>
                          <authentication revocationMode="NoCheck" />
                        </serviceCertificate>
                      </clientCredentials>
                    </behavior>
                  </endpointBehaviors>
                </behaviors>
                <bindings>
                  <wsHttpBinding>
                    <binding name="wsBinding">
                      <security mode="Transport">
                        <transport clientCredentialType="Certificate" />
                      </security>
                    </binding>
                  </wsHttpBinding>
                </bindings>
                <client>
                  <endpoint address="https://XXXX.com/AHSharedServices/CustomerServiceJAXWSController"
                    behaviorConfiguration="endpointBehavior" binding="wsHttpBinding"
                    bindingConfiguration="wsBinding" contract="ServiceReference1.CustomerServiceJAXWSController"
                    name="testService" />
                </client>
                <diagnostics>
                  <messageLogging logEntireMessage="true" logMalformedMessages="true"
                    logMessagesAtTransportLevel="true" logKnownPii="true"  logMessagesAtServiceLevel="true"/>
                </diagnostics>
              </system.serviceModel>
            </configuration>

【问题讨论】:

证书是有效的还是自签名证书? 是的,证书是有效的。 而且客户端也必须有一个有效的证书?前段时间我实现了一个类似的解决方案,但是唯一的wcf服务器需要一个有效的证书,为什么你需要客户端也有一个有效的证书? 那么,客户端需要有有效的证书才能让服务器对请求进行身份验证! 我目前正在使用 HttpWebRequest 类。我必须从 CRT 和 KEY(带有嵌入式私钥的证书)生成 PFX 文件。我仍在努力让它在 WCF 上运行 【参考方案1】:

我曾经收到此错误,因为我的客户端使用的是 TLS 1.0 而不是 TLS 1.2。 假设您安装了所有正确的 SSL 密码,您可以尝试更改您的请求以改用 TLS 1.2。在 .NET 中,您需要在定义客户端后添加:

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

一旦我切换到 TLS 1.2,错误就消失了。

【讨论】:

【参考方案2】:

我从 .CRT 和 .KEY 生成了 PFX(附有私钥的证书)并将其导入到证书存储中,从而解决了我遇到的问题。

【讨论】:

您的意思是您从服务器 .crt 和 .key 创建了 pfx?【参考方案3】:

在向服务器发送请求之前使用此代码:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)

    return true;
;

【讨论】:

以上是关于在 HTTPS 情况下,未使用 HTTP.SYS 正确配置服务器证书的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式为BasicHttpBinding指定HTTPS?

探索基于http.sys实现权限维持

http.sys远程代码执行漏洞(MS15-034)

HTTP.sys 远程执行代码验证工具

ASP.NET Core高性能服务器HTTP.SYS

IIS 架构解析