2

我在 StackOverflow、博客和其他网站上看到了大约 1000 篇帖子,但没有一个能够阐明我遇到的问题。

设置:

  • 使用 .NET Framework 3.5(抱歉,无法升级)、WebHttpBinding 的 WCF 自托管服务(非 IIS)
  • 在界面中使用 WebGet 的单个端点
  • 没有 .config 文件——一切都是以编程方式创建的
  • 该服务绑定到自定义端口,不与任何其他服务或网站共享端口

部署目标:

  • XP SP3, 2003, Vista, 7, 8, 2008

问题:在 Vista, 7, 8, 2008 上我没有问题。我正在使用绑定到本地主机的自签名证书以及自定义端口上的机器名称在 HTTP 和 HTTPS 上启动并运行该服务。

  • 但是在 XP 上,我只能在 HTTP 上运行,所以我知道服务本身运行正常。在 HTTPS 上,由于 SSL 故障,我无法建立连接。
  • 如果我直接在浏览器中点击 URL,我会看到 SSL 异常。
  • 在 IE 中,它会给出证书不受信任的警告。当我允许异常时,它会进入服务并执行。如果我添加https://localhost到受信任的站点,我将不再看到警告,并且可以毫无问题地点击 URL。
  • 当我在 Chrome 中点击相同的 URL 时,我收到错误 107 ERR_SSL_PROTOCOL_ERROR 并且我无法绕过它。
  • 在 Firefox 中,我收到一个 ssl_error_rx_record_too_long 错误,它也无法绕过。

我经历了几种证书排列以及将它们分配给服务的方法(httpcfg 等),所有结果都相同(或更糟)。因此,与其来回试图弄清楚我做了什么并挑选出我现有的设置,我有两个问题:

  1. 是否有可能在没有 IIS 的情况下在 XP 上为本地主机创建受信任的证书...
  2. 将它绑定到自托管 WCF 服务的最佳方法是什么?一切都以编程方式完成?我重复这一点,因为在这些问题上寻求帮助的其他尝试总是导致人们告诉我在配置文件中放入什么。

要记住的事情:我已经在 Windows 版本 > XP/2003 下使用自签名证书在 SSL 下正常工作,所以我知道基本原理有些健全。我似乎无法在 XP 下为 localhost 设置证书。

4

2 回答 2

0

我的回答是基于这样一个假设,即如果您从客户端代码进行 WCF 调用,您将收到“无法为 SSL/TLS 安全建立信任关系......”异常。

如果这是真的,我建议您实现自定义 ICertificatePolicy 并在进行 WCF 调用时使用它。这是一个示例实现。

using System.Net;  
using System.Net.Security;  
using System.Security.Cryptography.X509Certificates;  

namespace Foo.bar
{  
       public class MyCertificatePolicy : ICertificatePolicy  
        {


            public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)  
            {  
                //Due an Invalid Certificate used in the  site, we must return true to all invalid SSL Request. Alternately, write the logic to validate the server certificate 
                return true;  
            }



            public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)  
            {  
                //Due an Invalid Certificate used in the site, we must return true to all invalid SSL Request  
                return true;  
            }  
        }  
    }  
于 2013-01-07T16:01:53.217 回答
0

就我而言,我这样做:

ServiceHost host = new ServiceHost(typeof(MyRequests), baseAddresses);

然后设置我的元数据:

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpsGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);

对于 Windows 身份验证和消息安全,我创建并设置了我的 ws 绑定:

WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
b.MaxReceivedMessageSize = Int32.MaxValue;
// auth setup
X509ClientCertificateAuthentication myAuthProperties =
    host.Credentials.ClientCertificate.Authentication;
myAuthProperties.IncludeWindowsGroups = true;
// add endpoint
ServiceEndpoint endpnt = host.AddServiceEndpoint(typeof(IMyRequests), b, "MyService");

//GO!
host.Open();

我希望这会有所帮助。

于 2013-01-09T11:57:39.670 回答